編集:これらのセットは 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
意味が分からない場合はコメントしてください
編集 編集:
利害関係者のための一般的なアルゴリズムの説明:
- セット要素を配列にダンプする
- それらの配列を並べ替えます
- 最初の配列を反復処理し、2 番目の配列に現在の値より大きい値があるかどうかを確認します。もしそうなら、その値のインデックスを取得し、そのインデックスを含むそれ以前のすべてを削除し、残ったものに 2 番目の配列変数を再割り当てします。
- そのような値が存在しない場合 (存在しないか、テストする値が不足しているため、false を返します)。それ以外の場合は、最後に true を返します。
ここでの考え方は、配列がソートされているため、2 番目の配列で一致した要素よりも大きい要素は、1 番目の配列でテストしている要素よりも大きいことがわかっているということです。したがって、低い値を切り取ることができます。また、同じ値を使用したくない場合は、見つけた値も切り取ることができます。false を返す場合は、array1 の数値がすべて array2 の数値よりも大きいため、または array1 の数値よりも大きい十分な数値が array2 になかったため、より大きな値がなかったことが原因であることがわかります。