Wybacz mi, jeśli spóźnię się na przyjęcie. ;)
Aby sprawdzić, czy jeden set Ajest podzbiorem set B, Pythonma A.issubset(B)i A <= B. Działa settylko i działa świetnie, ALE złożoność implementacji wewnętrznej jest nieznana. Odniesienie: https://docs.python.org/2/library/sets.html#set-objects
Wymyśliłem algorytm, aby sprawdzić, czy list Ajest podzbiorem list Bnastępujących uwag.
- Aby zmniejszyć złożoność wyszukiwania podzbioru, uważam, że należy
sortnajpierw porównać obie listy przed porównaniem elementów w celu zakwalifikowania do podzbioru.
- To pomogło mi gdy wartość elementu drugiej listy jest większa niż wartość elementu pierwszej listy .
breakloopB[j]A[i]
last_index_jsłuży do rozpoczynania loopod list Bmiejsca, w którym zostało ostatnio przerwane. Pomaga uniknąć rozpoczynania porównań od początku
list B(co, jak można się domyślać, jest niepotrzebne, zaczyna list Bod index 0następnego iterations).
Złożoność będzie polegać O(n ln n)na sortowaniu obu list i O(n)sprawdzaniu podzbioru.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
Kod zawiera wiele printinstrukcji, aby zobaczyć, co się dzieje w każdym iterationz nich loop. Są one przeznaczone wyłącznie do zrozumienia.
Sprawdź, czy jedna lista jest podzbiorem innej listy
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");
Wynik
[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