¿Cuál sería un ejemplo de un problema de programación que sería difícil si no fuera posible sin el uso de array?

Eso depende de cómo interpretes esta pregunta.

¿Qué pasaría si no pudieras usar matrices porque no eran parte del lenguaje de programación, pero tuvieras tablas hash y otras estructuras de datos similares?

Luego, podría simular matrices con solo una desaceleración esperada del factor O (1) en comparación con la situación de que se admitan de forma nativa, utilizando una tabla hash cuyas claves son de 0 a N-1, donde N es la longitud de la matriz que desea para simular.

¿Qué pasaría si no pudiera asignar memoria contiguamente y solo pudiera solicitar fragmentos de memoria de tamaño constante del asignador de memoria?

Entonces también podría simular una matriz, pero algunas operaciones de matriz inevitablemente * tendrían una desaceleración del factor logarítmico. Puede simular una matriz de N entradas usando un árbol. Piense en poner todos los datos en las hojas y dejar que todas las hojas estén al mismo nivel en el árbol. Entonces tiene un nodo padre por cada dos nodos en el nivel anterior. Al acceder a un elemento por índice, usted determina la ruta a seguir en el árbol en función de la representación en bits del índice (vaya al elemento secundario izquierdo cuando vea un bit 0 y al elemento secundario derecho cuando vea un bit).

* Prueba: si solo puede acceder a un número constante K de ubicaciones en cada operación, después de las operaciones T, el número de ubicaciones de memoria posibles que son “accesibles” para su algoritmo es [matemática] K ^ T [/ matemática]. Para un algoritmo que pueda necesitar acceder a cualquiera de las N ubicaciones donde N es la longitud de la matriz, debe ser que [matemática] K ^ T \ geq N [/ matemática], por lo tanto [matemática] T \ geq \ log_K N [ /mates].

No hay nada que pueda hacer con una matriz que tampoco puede hacer con una lista. La principal diferencia en los lenguajes Java / C # es que la matriz generalmente está restringida a contener un número fijo de elementos que declara el código, y no puede cambiar una vez que se asigna la matriz, mientras que las listas pueden crecer y reducirse dinámicamente según sea necesario y también suelen permitir operaciones fáciles como “insertar un nuevo elemento entre otros dos que ya existen”. En el contexto de su pregunta, lo que realmente importa de estas estructuras es que:

  1. Almacenan múltiples piezas de información del mismo tipo bajo una sola etiqueta (nombre de variable), y
  2. La estructura es iterable, en otras palabras, hay un medio explícito de atravesar todos los elementos desde “primero” hasta “último”.

Entonces, el ejemplo más simple de algo difícil de hacer sin este tipo de estructuras de datos es un tipo simple de un conjunto inicial de datos no ordenados en un orden ordenado. Incluso los algoritmos de clasificación lenta aún requieren la capacidad de “comenzar desde el principio”, comparar con otros elementos y continuar hasta “el final”. Además, es necesario intercambiar elementos específicos en el lugar exacto del otro después de una comparación.

Si todo lo que tenía era un montón de variables individuales como a1, a2, a3, etc., con los nombres que implican algún orden, es posible que pueda almacenar todos los elementos, pero los idiomas más populares no le darán una forma de refiérase a cada uno de ellos en función del valor de una variable de índice de algún tipo, y por lo tanto escribir el tipo sería extremadamente difícil o, como mínimo, difícil de implementar sin una matriz o lista. Además, el número de elementos que podría manejar no sería fácil de cambiar según la entrada, en lugar de estar conectado al programa.