Se que no es una solución general al problema, pero haciendo lista_origen = lista_origen[1::2] tarda unos 8 milisegundos en vez de 20. También si trabajas con sets, puedes hacer s1.symmetric_difference(s2)
Hola! Buen video, pero hay un error, .remove() no hace una nueva lista, puedes corroborar con ID se altera la lista en sitio. El problema de usar .remove es que se itera sobre toda la lista por cada elemento, la complejidad es n al cuadrado
Sabes alguna lista de temas que pueda seguir para aprender más sobre eficiencia en los programas? 😁 me conozco los algoritmos básicos, se me da bien resolver los problemas pero la complejidad es súper importante y quiero mejorar en eso nadamás que no encuentro por dónde investigar y por experiencia de programar es mucho más tardado ir encontrando para cada caso en específico que ya saber los principios y aplicarlos a todo (creo...?) c;
@pildorasdeprogramacion no soy un experto en python pero creo que not in recorre el array (al igual que inclues en js) y la complejidad seria igualmente 0(n) (aun que quitamos malloc), no seria una mejor solucion unos punteros ?
Estaria bien que hablaras mas de set no se usan mucho y son útiles por ejemplo una forma de resolver esto con set seria una el metodo distinct y tiene un rendimiento similar
Todo cool la primera solución que hiciste tiene una complejidad mayor a la del remove, para ser exactos tiene una complejidad O(n^2) ya que si, la list compresión va recorriendo la lista original pero con cada elemento pregunta ai x esta en el arreglo secundario, el operador in es lineal, por lo que por cada elemento de la lista original (n) busca por fuerza bruta en la lista secundaria( también n) y hacen O(n^2) Ya la segunda queda en (n log n) ya que buscar con el operador in en set es logaritmico. Si hubiera una forma de hacer una lista de tamaño fijo en python sin usar numpy, podriamos reducir esa complejidad a una complejidad lineal, peero gastaria mas memoria, todo cool
no necesitas usar 2 listas, con la operacion mod (%) ya podes saber si un elemento es par o no. Para todo numero entero, si la operacion % 2 es 0 entonces es par. Tambien es mejor usar una linked list para ir sacando los impares y no creas ninguna lista nueva desperdiciando espacio.
@@pildorasdeprogramacion la pregunta me refiero a por que se escribe el ciclo como "element for element in elements" en vez de "for element in elements"? Y la segunda pregunta, si este problema de eliminar los numeros impares en menos de un segundo se podria aplicar busqueda por arboles binarios? tipo recorrer un arbol binario y reemplazar cada valor quitandole los impares?
Se que no es una solución general al problema, pero haciendo
lista_origen = lista_origen[1::2]
tarda unos 8 milisegundos en vez de 20.
También si trabajas con sets, puedes hacer s1.symmetric_difference(s2)
Hola! Buen video, pero hay un error, .remove() no hace una nueva lista, puedes corroborar con ID se altera la lista en sitio. El problema de usar .remove es que se itera sobre toda la lista por cada elemento, la complejidad es n al cuadrado
Sabes alguna lista de temas que pueda seguir para aprender más sobre eficiencia en los programas? 😁 me conozco los algoritmos básicos, se me da bien resolver los problemas pero la complejidad es súper importante y quiero mejorar en eso nadamás que no encuentro por dónde investigar y por experiencia de programar es mucho más tardado ir encontrando para cada caso en específico que ya saber los principios y aplicarlos a todo (creo...?) c;
@@Lspadachin Busca wiki python time complexity. Te aparecen las principales funciones de las principales estructuras de datos de python
@pildorasdeprogramacion no soy un experto en python pero creo que not in recorre el array (al igual que inclues en js) y la complejidad seria igualmente 0(n) (aun que quitamos malloc), no seria una mejor solucion unos punteros ?
Estaria bien que hablaras mas de set no se usan mucho y son útiles por ejemplo una forma de resolver esto con set seria una el metodo distinct y tiene un rendimiento similar
excelente 🎉
Todo cool la primera solución que hiciste tiene una complejidad mayor a la del remove, para ser exactos tiene una complejidad O(n^2) ya que si, la list compresión va recorriendo la lista original pero con cada elemento pregunta ai x esta en el arreglo secundario, el operador in es lineal, por lo que por cada elemento de la lista original (n) busca por fuerza bruta en la lista secundaria( también n) y hacen O(n^2)
Ya la segunda queda en (n log n) ya que buscar con el operador in en set es logaritmico.
Si hubiera una forma de hacer una lista de tamaño fijo en python sin usar numpy, podriamos reducir esa complejidad a una complejidad lineal, peero gastaria mas memoria, todo cool
Muy interesante 👍🏼
Podrías hacer un vídeo en donde expliques como funciona O(n). Lo ví en estructura de datos pero no lo comprendí del todo.
Entonces es mejor hacer una nueva lista en listas grandes en ves de remover un unico elemento?
Tienes excelente contenido. Me suscribo. Te recomiendo ordenarlo mejor agregando los links de las partes en la descripción o un comentario fijado
muchas gracias lo tendre en cuenta :)
Bro quiero aprender python a tu nivel, vendes cursos o algo? Super tus vídeos 😊
no necesitas usar 2 listas, con la operacion mod (%) ya podes saber si un elemento es par o no. Para todo numero entero, si la operacion % 2 es 0 entonces es par. Tambien es mejor usar una linked list para ir sacando los impares y no creas ninguna lista nueva desperdiciando espacio.
Justo esto pensé. El mod debe ser mas rapido que chequear si un elemento existe en otra lista.
Me suscribo
Gracias por tu apoyo
ostias chaval epico 👍
gracias broo
en mi compu demora 46ms con el set, mi ryzen 5 2600x se esta quedando atrás? :´c
es porque depende del lenguaje, algoritmo y la computadora. Todo influye, y tu solo puedes controlar el lenguaje y algoritmo.
import time
lista_original = set(list(range(1,1_000_001)))
lista_auxiliar = set(range(1, 1_000_001, 2))
inicio = time.time()
lista_resultado_3 = list(lista_original.difference(lista_auxiliar))
fin = time.time()
print(fin-inicio)
print(lista_resultado_3[:10])
Por que pone element for element in elements?? No es más fácil por for element in elements?
Y este problema no se podría resolver usando árbol de búsqueda binaria?
No entendi tu pregunta broo
@@pildorasdeprogramacion la pregunta me refiero a por que se escribe el ciclo como "element for element in elements" en vez de "for element in elements"? Y la segunda pregunta, si este problema de eliminar los numeros impares en menos de un segundo se podria aplicar busqueda por arboles binarios? tipo recorrer un arbol binario y reemplazar cada valor quitandole los impares?
2 vídeos solo para eso
Siii bro