编辑:我刚刚意识到你说这些集合被硬编码为 3 个值。这是一种适用于任何大小集合的超级通用算法。
对于 3 值集合,您可以对集合元素进行相同的转储和排序,然后执行以下操作:
if(setB.a < setA.a)
if(setB.b < setA.b)
if(setB.c < setA.c)
return true;
return false;
==================================================== ====
通用算法:
这是我能立即想到的最有效的方法。
伪代码(比 java 更 Pythonic,抱歉——希望评论能解释):
list l1 = set1.items() //get the items out
list l2 = set2.items()
l1 = sort(l1)
l2 = sort(l2) //sort the lists
int set2idx1 = l1[0].find_closest_greater_than_value(l2) //binary search or something
if set2idx1 exists:
l2 = l2[set2idx1+1:] //in python this means l2 is reassigned to a subarray of l2 starting at set2idx1+1 going to the end of l2
else:
return false
for(int i=1; i<l1.len; i++)
int set2idxi = l1[i].find_closest_greater_than_value(l2) //binary search or something
if set2idxi exists:
l2 = l2[set2idxi+1:]
else
return false
return true
如果有什么没有意义,请发表评论
编辑编辑:
对任何相关方的一般算法的解释:
- 将集合元素转储到数组中
- 对这些数组进行排序
- 遍历第一个数组,查看第二个数组中是否有大于当前值的值。如果是这样,请获取该值的索引并删除之前和包括该索引的所有内容,并将第二个数组变量重新分配给剩余的内容。
- 如果没有这样的值(或者因为它不存在或者你已经用完了要测试的值,则返回 false)。否则,最后返回true。
这里的想法是,由于数组已排序,您知道任何大于第二个数组中匹配元素的元素都将大于您在第一个数组中测试的元素。所以你可以去掉较低的值,因为你不想使用相同的值,你也可以去掉你找到的那个。如果您返回 false,您知道这是因为没有更大的值,或者是因为 array1 中的数字都大于 array2 中的数字,或者因为 array2 中没有足够的数字大于 array1 中的数字。