C# コード スニペット
var dict = new Dictionary<int, HashSet<List<int>>>();
foreach (List<int> list2 in two) {
foreach (int i in list2) {
if(dict.ContainsKey(i) == FALSE) {
//create empty HashSet dict[i]
dict.Add(i, new HashSet<List<int>>());
}
//add reference to list2 to the HashSet dict[i]
dict[i].Add(list2);
}
}
foreach (List<int> list1 in one) {
HashSet<List<int>> listsInTwoContainingList1 = null;
foreach (int i in list1) {
if (listsInTwoContainingList1 == null) {
listsInTwoContainingList1 = new HashSet<List<int>>(dict[i]);
} else {
listsInTwoContainingList1.IntersectWith(dict[i]);
}
if(listsInTwoContainingList1.Count == 0) { //optimization :p
break;
}
}
foreach (List<int> list2 in listsInTwoContainingList1) {
//list2 contains list1
//do something
}
}
例
L2= {
L2a = {10, 20, 30, 40}
L2b = {30, 40, 50, 60}
L2c = {10, 25, 30, 40}
}
L1 = {
L1a = {10, 30, 40}
L1b = {30, 25, 50}
}
コードの最初の部分の後:
dict[10] = {L2a, L2c}
dict[20] = {L2a}
dict[25] = {L2c}
dict[30] = {L2a, L2b, L2c}
dict[40] = {L2a, L2b, L2c}
dict[50] = {L2c}
dict[60] = {L2c}
コードの 2 番目の部分:
L1a: dict[10] n dict[30] n dict[40] = {L2a, L2c}
L1b: dict[30] n dict[25] n dict[50] = { }
SoはとL1a
に含まれていますが、どれにも含まれていません。L2a
L2c
L1b
複雑
アルゴリズムの複雑さに関して、L1
hasn1
要素、L2
hasn2
要素、 is のサブリストの要素の平均数、 L1
isのサブm1
リストの要素の平均数であるL2
としm2
ます。それで:
元の解決策は
O(n1 x n2 x m1 x m2)
、containsSetOfO(n1 x n2 x (m1 + m2))
メソッドがネストされたループを実行する場合、またはHashSet を使用する場合、せいぜいです。Is7aq のソリューションもO(n1 x n2 x (m1 + m2))
.
提案された解決策は次
O(n2 x m2 + n1 x (m1 x nd + n2))
のとおりです。ここnd
で、 はセットの要素の平均数ですdict[i]
。
提案されたソリューションの効率は、これに大きく依存しますnd
。