Maafkan saya jika saya terlambat ke pesta. ;)
Untuk memeriksa apakah set Aada subset dari set B, Pythonmemiliki A.issubset(B)dan A <= B. Ini sethanya berfungsi dan berfungsi dengan baik, tetapi kerumitan implementasi internal tidak diketahui. Referensi: https://docs.python.org/2/library/sets.html#set-objects
Saya datang dengan sebuah algoritma untuk memeriksa apakah list Aada himpunan bagian list Bdengan komentar berikut.
- Untuk mengurangi kerumitan menemukan subset, saya merasa cocok untuk
sortkedua daftar terlebih dahulu sebelum membandingkan elemen untuk memenuhi syarat untuk subset.
- Ini membantu saya untuk
breakyang loopketika nilai elemen daftar kedua B[j]lebih besar dari nilai elemen daftar pertama A[i].
last_index_jdigunakan untuk memulai loopdari list Bmana terakhir kali ditinggalkan. Ini membantu menghindari memulai perbandingan dari awal
list B(yang, seperti yang Anda duga tidak perlu, untuk memulai list Bdari yang index 0berikutnya iterations.)
Kompleksitas akan menjadi O(n ln n)masing-masing untuk mengurutkan kedua daftar dan O(n)untuk memeriksa subset.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
Kode memiliki banyak printpernyataan untuk melihat apa yang terjadi di masing iteration- masing loop. Ini dimaksudkan hanya untuk pengertian.
Periksa apakah satu daftar adalah himpunan bagian dari daftar lain
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");
Keluaran
[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