Disculpe si llego tarde a la fiesta. ;)
Para verificar si uno set Aes un subconjunto de set B, Pythontiene A.issubset(B)y A <= B. Solo funciona sety funciona muy bien PERO se desconoce la complejidad de la implementación interna. Referencia: https://docs.python.org/2/library/sets.html#set-objects
Se me ocurrió un algoritmo para verificar si list Aes un subconjunto de los list Bsiguientes comentarios.
- Para reducir la complejidad de encontrar un subconjunto, considero apropiado
sortprimero ambas listas antes de comparar elementos para calificar para el subconjunto.
- Me ayudó a
breakla loopcuando el valor del elemento de la segunda lista B[j]es mayor que el valor del elemento de la primera lista A[i].
last_index_jse utiliza para comenzar de loopnuevo list Bdonde lo dejó por última vez. Ayuda a evitar comenzar las comparaciones desde el principio
list B(que es, como puede suponer innecesario, comenzar list Bdesde el index 0siguiente iterations).
La complejidad será O(n ln n)cada una para ordenar ambas listas y O(n)para verificar el subconjunto.
O(n ln n) + O(n ln n) + O(n) = O(n ln n).
El código tiene muchas printdeclaraciones para ver qué sucede en cada uno iterationde los loop. Estos son solo para entender.
Compruebe si una lista es un subconjunto de otra 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");
Salida
[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