保持排序的情况下对所有可能的组合进行排列?

huangapple go评论68阅读模式
英文:

Permutating all possible combinations while staying sorted?

问题

我有包含整数值 xy 的结构体。

我有两个相等的结构体列表,A[]B[],我的约束是它们必须按照 x 的顺序排列。

我的问题是,对于任何索引,我需要确定列表 B[] 中的 y 值是否大于列表 A[] 中的 y 值。

令人困惑的是,只要 x 是有序的,你可以交换结构体的位置。

这个问题很难解释,所以我会举个例子。

A[] B[] 索引 比较 通过/失败
struct{x = 1, y = 1} struct{x = 1, y = 2} 0 1 < 2 通过
struct{x = 2, y = 1} struct{x = 2, y = 2} 1 1 < 2 通过
struct{x = 3, y = 1} struct{x = 3, y = 2} 2 1 < 2 通过

上面的表格是有效的,因为当 x 值有序时,A[] 中的 y 值小于 B[] 中的 y 值。

但对于下面的例子:

A[] B[] 索引 比较 通过/失败
struct{x = 1, y = 1} struct{x = 1, y = 2} 0 1 < 2 通过
struct{x = 2, y = 3} struct{x = 2, y = 7} 1 3 < 7 通过
struct{x = 3, y = 6} struct{x = 2, y = 4} 2 6 > 4 失败

B[] 中的索引 12 可以交换位置,同时仍然按照 x 的顺序排列。如果我们交换顺序为:

A[] B[] 索引 比较 通过/失败
struct{x = 1, y = 1} struct{x = 1, y = 2} 0 1 < 2 通过
struct{x = 2, y = 3} struct{x = 2, y = 4} 1 3 < 4 通过
struct{x = 3, y = 6} struct{x = 2, y = 7} 2 6 < 7 通过

A[] 中的 y 值将小于 B[] 中相同索引位置的 y 值。

我应该搜索什么特定的算法?我应该遍历所有可能的组合,然后检查是否满足我的要求,还是有一种方法可以在保持有序的情况下遍历特定的值?

英文:

I have structs that contain integer values x and y.

I have two equal struct lists, A[] and B[], and my constraint is that they must stay ordered by x.

My challenge is that I need to determine, for any index, if the y value for list B[] is greater than the y value for list A[].

The confusing thing is that you can swap the positions of the structs as long as x is in order.

It's a difficult thing to explain, so I'll give an example.

A[] B[] Index Comparison Pass/Fail
struct{x = 1, y = 1} struct{x = 1, y = 2} 0 1 < 2 pass
struct{x = 2, y = 1} struct{x = 2, y = 2} 1 1 < 2 pass
struct{x = 3, y = 1} struct{x = 3, y = 2} 2 1 < 2 pass

The table above works, because when the x values are in order, the y values in A[] are less than the y values in B[].

But for the example

A[] B[] Index Comparison Pass/Fail
struct{x = 1, y = 1} struct{x = 1, y = 2} 0 1 < 2 pass
struct{x = 2, y = 3} struct{x = 2, y = 7} 1 3 < 7 pass
struct{x = 3, y = 6} struct{x = 2, y = 4} 2 6 > 4 fail

Index 1 and 2 from B[] can be swapped, while still being in order with respect to x. If we swap the order to:

A[] B[] Index Comparison Pass/Fail
struct{x = 1, y = 1} struct{x = 1, y = 2} 0 1 < 2 pass
struct{x = 2, y = 3} struct{x = 2, y = 4} 1 3 < 4 pass
struct{x = 3, y = 6} struct{x = 2, y = 7} 2 6 < 7 pass

the y values in A[] will be less than the y values in same index in B[].

Is there any specific algorithm I should be searching for? Should I permutate through all possible combinations, and then check if it matches my requirements, or is there a way to permutate specific values while staying in-order?

答案1

得分: 1

如果我正确理解你的问题,你可以简单地按照 xyAB 进行排序。如果排序通过,那么你就得到了答案。如果排序未通过,那么你可以证明无法重新排序两个列表以通过排序。

英文:

If I understand your problem correctly, you can simply sort both A and B by x then y. If that passes, you have your answer. If that fails to pass, then you can prove that there is no way to reorder both lists to get a pass.

huangapple
  • 本文由 发表于 2022年9月23日 06:57:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/73821422.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定