Xin lỗi nếu tôi đến bữa tiệc muộn. ;)
Để kiểm tra xem một set Atập hợp con của set B, Pythoncó A.issubset(B)và A <= B. Nó setchỉ hoạt động và hoạt động tuyệt vời NHƯNG sự phức tạp của việc thực hiện nội bộ chưa được biết. Tham khảo: https://docs.python.org/2/l Library / sets.html # set-objects
Tôi đã đưa ra một thuật toán để kiểm tra xem có phải list Alà một tập hợp con list Bvới các nhận xét sau không.
- Để giảm độ phức tạp của việc tìm tập hợp con, tôi thấy nó phù hợp với
sortcả hai danh sách trước khi so sánh các phần tử để đủ điều kiện cho tập hợp con.
- Nó đã giúp tôi
breaknhững loopkhi giá trị của nguyên tố của danh sách thứ hai B[j]lớn hơn giá trị của nguyên tố của danh sách đầu tiên A[i].
last_index_jđược sử dụng để bắt đầu looplại list Bnơi nó rời đi. Nó giúp tránh bắt đầu so sánh từ đầu
list B(nghĩa là, như bạn có thể đoán không cần thiết, để bắt đầu list Btừ index 0sau iterations).
Độ phức tạp sẽ là O(n ln n)mỗi để sắp xếp cả hai danh sách và O(n)để kiểm tra tập hợp con.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
Mã có rất nhiều printbáo cáo để xem những gì đang xảy ra tại mỗi iterationcủa loop. Đây chỉ là để hiểu.
Kiểm tra nếu một danh sách là tập hợp con của danh sách khác
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");
Đầu ra
[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