Perdoe-me se eu estiver atrasado para a festa. ;)
Para verificar se um set Aé um subconjunto de set B, Pythonpossui A.issubset(B)e A <= B. Ele funciona setapenas e funciona muito bem, mas a complexidade da implementação interna é desconhecida. Referência: https://docs.python.org/2/library/sets.html#set-objects
Eu vim com um algoritmo para verificar se list Aé um subconjunto das list Bseguintes observações.
- Para reduzir a complexidade da localização de um subconjunto, considero apropriado as
sortduas listas antes de comparar os elementos para qualificar para o subconjunto.
- Ajudou-me
breaka loopquando o valor do elemento da segunda lista B[j]é maior que o valor do elemento da primeira lista A[i].
last_index_jé usado para iniciar loopsobre list Bonde último saiu fora. Ela ajuda a evitar começar comparações a partir do início
list B(o que é, como você pode imaginar desnecessário, para começar list Ba partir index 0em posterior iterations.)
O(n ln n)Cada complexidade será cada uma para classificar as duas listas e O(n)verificar o subconjunto.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
O código possui várias printinstruções para ver o que está acontecendo em cada uma iterationdas loop. Estes destinam-se apenas à compreensão.
Verifique se uma lista é subconjunto de outra lista
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");
Resultado
[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