¿Alguien puede diseñar una estructura de datos para almacenar números enteros que sea tan ineficiente que el TC (el mejor caso) para recuperar un número entero es [math] O (n ^ 2) [/ math]?

En primer lugar, debe tener cuidado con la notación big-O. Debe saber que 1 = O (n ^ 2): un algoritmo constante también se ejecuta en O (n ^ 2). Así que creo que la notación correcta aquí es Theta (n ^ 2) u Omega (n ^ 2), cuando quieres hablar sobre algunas operaciones ejecutadas al menos tan lento como este TC.

En segundo lugar, debe solicitar aclaraciones: ¿qué operaciones admite la estructura de datos? ¿Qué es n? ¿Es ese el tamaño de la matriz (presunto), o el rango de los enteros que se almacenan? En ambos casos es posible diseñar dicha estructura de datos, creo que esto hará la diferencia.

Para el primer caso, supongamos que n es el tamaño de la matriz. Luego, debe solicitar una aclaración sobre las operaciones permitidas. Digamos, cualquier operación de recuperación. Puede definir una Lista vinculada, con tamaño n. Cuando inserta el i-ésimo elemento x, inserta i copias del mismo elemento x al final de la Lista vinculada. Recuerde que esta estructura de datos no recuerda el puntero final, por lo que cuando desea encontrar el final, debe recorrer toda la lista. Ahora, desea recuperar el último elemento, luego debe recorrer la lista completa, lo que requerirá 1 + 2 +… + n = Theta (n ^ 2) visitas en total. Tenga en cuenta que esta es la mejor complejidad de tiempo para la última operación de recuperación de elementos que desee.

Para el segundo caso, supongamos que n es la capacidad del número: cada entero está en el rango 1..n. En este caso, puede emplear una idea similar a la anterior. Inicialmente, el DS contiene una lista vinculada de n * n elementos: n elementos para cada i de 1 a n, vinculados en orden ascendente. Cuando se agrega un nuevo elemento, repite lo que estaba haciendo para el primer caso. Por otra parte, para recuperar cada elemento, primero debe atravesar los elementos Theta (n ^ 2) incluso para obtener el primer elemento en la lista.

Sé que esto es un poco trampa, y aquí hay otro DS para ser muy lento. Cree una tabla * n y establezca que cada elemento sea 0. Cuando se inserta el elemento i-ésimo, suponga que el elemento insertado es x, el DS selecciona aleatoriamente x * x diferentes ubicaciones de la matriz n * n, y agrega 2 ^ i a cada uno de ellos Cuando desee recuperar el elemento i-ésimo en el DS, debe contar el número total M de ranuras, de modo que el bit i-ésimo sea 1. Entonces este elemento es sqrt (M). Tenga en cuenta que para finalizar esta operación, incluso aplicando cualquier criterio de detención temprana, debe escanear n ^ 2–2n-1 = elementos Theta (n ^ 2) para asegurarse del rango de sqrt (M). Por lo tanto, Theta (n ^ 2) es la mejor complejidad de tiempo de caso de cualquier operación de recuperación.

Esto lo conseguirá:

def recuperar (l, i):
si i == 0:
volver l [0]
más:
l2 = []
para j en rango (1, len (l)):
l2.append (l [j])
retorno recuperar (l2, i-1)

Se ejecutará a tiempo [math] O (i ^ 2) [/ math], por lo que el mejor tiempo de ejecución para recuperar el último elemento es [math] O (n ^ 2) [/ math].

El diseño de hoja OMR con bloque de tipo entero generalmente se usa para el examen de jee. puedes encontrar 10 burbujas seguidas de 0 a 9, proporcionando al estudiante 10 opciones de respuesta

UNA

Cualquier cosa como matriz anidada, cola anidada, pila anidada o puntero a puntero de entero servirá.

Esta no es una pregunta difícil. Simplemente lo pilla desprevenido o lo prueba para ver si conoce la naturaleza de las cosas anidadas.

Esta pregunta se reduce a implementar una función de adición tan ineficiente que obliga a la función de recuperación a tomar no menos de n ^ 2 veces.

Supongamos que tiene una lista que representa su estructura

[]

Debe agregar otra lista dentro de ella para que la función de recuperación no pueda saber dónde se almacena el entero sin iterar sobre él.

[[?,?,?]]

Pero también necesita agregar otra dimensión para cuadrar la cantidad de trabajo.

[[[?], [?]], [[?], [?]] [[?], [?]]]

Ahora solo necesitamos hacer cumplir el requisito.

Puedo hacer eso, por ejemplo, almacenando sus enteros originales como parte de ellos en cada una de esta lista y luego sumando y multiplicándolo todo.

Por ejemplo, digamos que queremos almacenar, digamos, 50.

Podemos representar este número como (2 + 3) * (1 + 1) * (5 + 0)

Y así lo hacemos:

[[[2,3], [1,1], [5,0]]]

Entonces, al recuperar nuestro número entero, tenemos que revisar cada una de esta lista, sumar los números y luego multiplicarlos.

[[2,3], [1,1], [5,0]]

Todo lo demás depende de usted.

Por supuesto, estas listas también deberían ampliarse a medida que agrega más datos para mantener n ^ 2.