¿Por qué elegir la estructura de datos incorrecta hace que un programa sea ineficiente?

Esto también es válido para el mundo real.

Suponga que su maestro acaba de anunciar que podrá consultar sus notas libremente durante la próxima prueba.

Ahora, no ha tomado ninguna nota de toda la unidad, pero siendo el estudiante astuto que es, inmediatamente piensa: ¡ Eso es genial! Imprimiré una copia de todo el libro de texto .

Camina a clase al día siguiente sintiéndose confiado, sin preparación, pero listo para pasar el examen. Se tomó especial cuidado esa mañana para asegurarse de que su gruesa carpeta de 3 ″ con toda esa información útil se colocara cuidadosamente en su mochila.

Entonces te tropiezas. Te caes duro. Duele.

Pero cuando te levantas, te das cuenta de que tu carpeta improvisada también se cayó, y lo que es más, las páginas del libro de texto que metiste adentro se soltaron. No es gran cosa, piensas. Los recogeré a todos de nuevo .

Diez minutos antes de la prueba, comienzas a entrar en pánico. Te acabas de dar cuenta: tienes 500 páginas de información de forma desordenada en un escritorio. Dado que no están en un orden particular, no tiene forma de determinar qué información es pertinente para las preguntas de la prueba, y hay muy poco tiempo para procesar la gran cantidad de datos aleatorios que tiene.

Fallaste la prueba.

Cuando vienes a clase al día siguiente, el maestro, que notó tu esquema, sonríe y pregunta por qué lo hiciste tan mal. Después de todo, el libro de texto tenía todas las respuestas, ¡palabra por palabra!

Si la impresión de su libro de texto tuviera todas sus páginas en el orden correcto, con un índice accesible, entonces fácilmente habría pasado. Sin embargo, cuando las páginas terminaron esparcidas al azar, perdiste la estructura en la información . Tenías todo lo que necesitabas para responder las preguntas de la prueba, pero las respuestas eran ineficientes para encontrar, así que te quedaste sin tiempo.


En informática, las estructuras de datos funcionan de la misma manera. Para cualquier tipo de datos, generalmente es posible usar cualquier estructura de datos adecuada para esa aplicación, con algunas modificaciones triviales al código si es necesario. Entonces, ¿por qué molestarse en estudiar diferentes estructuras de datos?

Velocidad. Y uso de memoria.

Si elige la estructura de datos incorrecta en una aplicación de rendimiento crítico, su código será tan lento que quedará inutilizable.

Cuando los datos con los que trabaja un programa son pequeños, casi cualquier estructura de datos funcionará. Esto se debe a que la cantidad de trabajo está limitada por la cantidad de datos que se deben trabajar. A medida que crecen los datos de un programa, la elección de la estructura de datos muestra más. Para obtener más datos, la forma en que trata los datos se vuelve más importante. Elegir una forma de tratar un gran conjunto de datos puede marcar la diferencia entre minutos y horas de tiempo de procesamiento.

Cada estructura de datos tiene múltiples formas de acceso. Leído, escrito, dividido, ordenado, buscado, fusionado, etc. La forma más abstracta de verlos es como una recopilación de datos. Cuando puede verlos más específicamente, como una recopilación de datos donde debe poder encontrar cualquier elemento aleatorio rápidamente mientras también necesita escrituras para tomar muy poco tiempo, mejor será el algoritmo disponible para encontrar información en esos datos. La razón de esto es que puede hacer suposiciones, atajos, que le permiten obtener la misma respuesta con menos trabajo. Cuanto mejores sean sus suposiciones a medida que crecen los datos, menos trabajo se necesita para usar los datos para generar información.

Una de las más importantes que escuché fue la herramienta JavaDoc para generar documentación para programas Java. Era una herramienta de alto perfil y solía ser muy lenta. Después de muchos años, alguien descubrió que el camino era estructuras de datos transversales, creo que usar un algoritmo O (n ^ 2) para hacer una tarea que podría hacerse en O (n). Una vez que arreglaron que la velocidad del programa mejoró dramáticamente.

Esta pregunta es demasiado amplia. Pero para dar una respuesta simple, es porque las personas han puesto las cosas que quieren en el lugar equivocado.

Una estructura de datos le brinda un acceso directo de un lugar a otro. Las diferentes estructuras de datos le ofrecen diferentes tipos de atajos. Por ejemplo, puede direccionar directamente un elemento con su número de secuencia si ese elemento está almacenado en una matriz, pero no si está en una lista vinculada. Como resultado, para obtener el ítem i-ésimo, necesita O (1) tiempo con una matriz, pero O (n) tiempo con una lista vinculada, a veces una gran diferencia en el rendimiento.

En un curso de sistemas operativos, una de las ideas clave es la localidad de referencia. Por supuesto, es específico del contexto, pero generalizando la premisa, toda organización (desde limpiar su habitación hasta diseñar su modelo de datos) se trata de ahorrar tiempo al evitar la necesidad de obtener las cosas que necesita juntas cuando las usa juntas.

Analogía simple: si está pintando su casa pero insiste en mantener toda la pintura en los escalones delanteros de su vecino de al lado, perderá un montón de tiempo caminando de un lado a otro. Puede organizarse por adelantado una vez, o puede organizarse repetidamente mientras trabaja.

Probar esta característica de video de Quora nuevamente para responder una pregunta de eficiencia general con una respuesta estrechamente relacionada con lo que discutí en esta respuesta: ¿Cuándo usaría el método de Búsqueda Binaria sobre el método de Búsqueda Secuencial?

Básicamente, algunas estructuras de datos están limitadas por su estructura a realizar ciertas operaciones (como búsquedas o inserciones) en ciertos tiempos de cálculo que otras no.

Como las inserciones en una matriz ordenada (para mantener una O (log n) contiene tiempo de función) frente a las inserciones en un árbol binario creado a partir de objetos de nodo.

0: 00-7: 04