Pardonnez-moi si je suis en retard à la fête. ;)
Pour vérifier si l'un set Aest un sous-ensemble de set B, Pythona A.issubset(B)et A <= B. Cela fonctionne setuniquement et fonctionne très bien MAIS la complexité de la mise en œuvre interne est inconnue. Référence: https://docs.python.org/2/library/sets.html#set-objects
Je suis venu avec un algorithme pour vérifier s'il list As'agit d'un sous-ensemble des list Bremarques suivantes.
- Pour réduire la complexité de la recherche d'un sous-ensemble, je trouve qu'il est approprié de
sortcommencer par les
deux listes avant de comparer les éléments pour se qualifier pour un sous-ensemble.
- Il m'a aidé à
breakla looplorsque la valeur de l' élément de deuxième liste B[j]est supérieure à la valeur de l' élément de la première liste A[i].
last_index_jest utilisé pour démarrer loopsur list Boù il avait laissé la dernière. Cela permet d'éviter de commencer les comparaisons depuis le début de
list B(ce qui est, comme vous pourriez le deviner inutile, de commencer list Bpar la index 0suite iterations.)
La complexité sera à la O(n ln n)fois pour le tri des deux listes et O(n)pour la vérification du sous-ensemble.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
Le code contient de nombreuses printinstructions pour voir ce qui se passe à chacun iterationdes loop. Ceux-ci sont uniquement destinés à la compréhension.
Vérifiez si une liste est un sous-ensemble d'une autre liste
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");
Production
[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