Verzeihen Sie mir, wenn ich zu spät zur Party komme. ;)
Um zu überprüfen, ob eine set ATeilmenge von ist set B, Pythonhat A.issubset(B)und A <= B. Es funktioniert setnur und funktioniert hervorragend, ABER die Komplexität der internen Implementierung ist unbekannt. Referenz: https://docs.python.org/2/library/sets.html#set-objects
Ich habe einen Algorithmus entwickelt, um zu überprüfen, ob list Aes sich um eine Teilmenge der list Bfolgenden Anmerkungen handelt.
- Um die Komplexität beim Finden von Teilmengen zu verringern, halte ich es zunächst für angemessen,
sortbeide Listen zu vergleichen, bevor Elemente verglichen werden, um sich für Teilmengen zu qualifizieren.
- Es hat mir geholfen,
breakdas , loopwenn der Wert des Elements der zweiten Liste B[j]ist größer als der Wert des Elements der ersten Liste A[i].
last_index_jwird verwendet , um Start loopüber , list Bwo er aus dem letzten links. Es hilft vermeiden Vergleiche ausgehend vom Beginn
list B(das ist, wie Sie unnötige vorstellen können, starten list Baus index 0in der Folge iterations.)
Die Komplexität besteht O(n ln n)jeweils darin, beide Listen zu sortieren und O(n)nach Teilmengen zu suchen.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
Code hat viele printAnweisungen, um zu sehen, was bei jedem iterationder beiden los ist loop. Diese sind nur zum Verständnis gedacht.
Überprüfen Sie, ob eine Liste Teil einer anderen Liste ist
is_subset = True;
A = [9, 3, 11, 1, 7, 2];
B = [11, 4, 6, 2, 15, 1, 9, 8, 5, 3];
print(A, B);
# skip checking if list A has elements more than list B
if len(A) > len(B):
is_subset = False;
else:
# complexity of sorting using quicksort or merge sort: O(n ln n)
# use best sorting algorithm available to minimize complexity
A.sort();
B.sort();
print(A, B);
# complexity: O(n^2)
# for a in A:
# if a not in B:
# is_subset = False;
# break;
# complexity: O(n)
is_found = False;
last_index_j = 0;
for i in range(len(A)):
for j in range(last_index_j, len(B)):
is_found = False;
print("i=" + str(i) + ", j=" + str(j) + ", " + str(A[i]) + "==" + str(B[j]) + "?");
if B[j] <= A[i]:
if A[i] == B[j]:
is_found = True;
last_index_j = j;
else:
is_found = False;
break;
if is_found:
print("Found: " + str(A[i]));
last_index_j = last_index_j + 1;
break;
else:
print("Not found: " + str(A[i]));
if is_found == False:
is_subset = False;
break;
print("subset") if is_subset else print("not subset");
Ausgabe
[9, 3, 11, 1, 7, 2] [11, 4, 6, 2, 15, 1, 9, 8, 5, 3]
[1, 2, 3, 7, 9, 11] [1, 2, 3, 4, 5, 6, 8, 9, 11, 15]
i=0, j=0, 1==1?
Found: 1
i=1, j=1, 2==1?
Not found: 2
i=1, j=2, 2==2?
Found: 2
i=2, j=3, 3==3?
Found: 3
i=3, j=4, 7==4?
Not found: 7
i=3, j=5, 7==5?
Not found: 7
i=3, j=6, 7==6?
Not found: 7
i=3, j=7, 7==8?
not subset