Xin lỗi nếu tôi đến bữa tiệc muộn. ;)
Để kiểm tra xem một set A
tập hợp con của set B
, Python
có A.issubset(B)
và A <= B
. Nó set
chỉ 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 A
là một tập hợp con list B
vớ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
sort
cả 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
break
những loop
khi 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 loop
lại list B
nơ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 B
từ index 0
sau 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 print
báo cáo để xem những gì đang xảy ra tại mỗi iteration
củ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