2011-12-10 29 views
14

Pregunta: Dada una matriz ordenada Un encontrar toda posible diferencia de los elementos de A.Encuentra todas las diferencias en una serie de O (n)

Mi solución:

for (int i=0; i<n-1; ++i) { 
    for (int j=i+1; j<n; ++j) { 
    System.out.println(Math.abs(ai-aj)); 
    } 
} 

Claro, es O (n^2), pero no cuento demasiado las cosas. Miré en línea y encontré esto: http://www.careercup.com/question?id=9111881. Dice que no puedes hacerlo mejor, pero en una entrevista me dijeron que puedes hacer O (n). ¿Lo cual está bien?

+3

me habría cuidado de tomar un trabajo en esta empresa ... Probablemente se esperan a resolver problemas NP-completos en P time ... ;-) –

+1

Supongo que usted o el entrevistador pasaron por alto o escucharon una condición adicional. –

+2

Defina n como el número de diferencias (tamaño de salida en lugar de tamaño de entrada). Hey presto - ahora es O (n). – Steve314

Respuesta

18

Una primera idea es que no está utilizando el hecho de que la matriz está ordenada. Supongamos que está en orden creciente (la disminución se puede manejar de manera análoga).

También podemos utilizar el hecho de que el telescopio diferencias (i> j):

a_i - a_j = (a_i - a_(i-1)) + (a_(i-1) - a_(i-2)) + ... + (a_(j+1) - a_j) 

Ahora construir una nueva secuencia, lo llaman s, que tiene la simple diferencia, lo que significa (a_i - a_(i-1)). Esto solo requiere una pasada (O(n)) y también puede omitir repeticiones, lo que significa omitir a_i si a_i = a_(i+1).

Todas las diferencias posibles a_i-a_j con i>j son de la forma s_i + s_(i+1) + ... + s_(j+1). Entonces, tal vez si cuentas que como los encontraste, entonces lo hiciste en el tiempo O(n). Sin embargo, imprimirlos puede tomar hasta n(n-1)/2 llamadas, y definitivamente es O(n^2).

+0

Ok. Veo cómo esto utiliza el hecho de que la matriz está ordenada porque no tiene que preocuparse por los valores absolutos. Todavía no creo que sea realmente O (n), pero es probablemente lo que tenía en mente. Gracias – WisaF

11

Por ejemplo, para una matriz con los elementos {2 , 2 , ..., 2 n} hay n ⋅ (n-1)/2 posibles diferencias, y no hay dos de ellos iguales. Entonces hay O (n) diferencias.

Ya que tienes que enumerar todos ellos, también es necesario al menos O (n 2 ) tiempo.

+0

Eso es lo que dijo la respuesta en el enlace que di, pero el entrevistador insistió bastante en que haya un O (n) solución. – WisaF

+0

Como 'a [last] - a [first]' es la mayor diferencia posible, también es (uno menos que) la cantidad máxima posible de valores de diferencia. Entonces eso es lineal en algo, simplemente no en el tamaño de la matriz original. Tal vez haya una manera de verificar si cada diferencia a su vez ocurre en el tiempo de forma lineal a la cantidad de diferencias potenciales, pero no puedo pensar en ATM. – Steve314

+0

Sí, O (n^2) es el peor caso, pero tenga en cuenta que algunas diferencias pueden aparecer varias veces. Surge un problema: ¿hay un algoritmo sensible a la salida, con O (k) complejidad de tiempo (o similar), donde k es el número de diferencias únicas? Esto significa, por ejemplo, para entradas especiales donde k = O (n), el algoritmo tomaría solo O (n). –

1

ordenada o desordenada, no importa, si usted tiene que calcular cada diferencia que no hay manera de hacerlo en menos de 2^n,

la pregunta se hizo mal, o simplemente hacer O (n) y luego imprima 42 las otras N veces: D

0

Puede obtener otro contraejemplo suponiendo que los contenidos de la matriz son enteros aleatorios antes de ordenar. Entonces la posibilidad de que dos diferencias, Ai - Aj vs Ak - Al, o incluso Ai - Aj vs Aj - Ak, sean las mismas es demasiado pequeña para que haya solamente O (n) diferencias distintas Ai - Aj.

Dado que, la pregunta para su entrevistador es explicar las circunstancias especiales que permiten una solución O (n). Una posibilidad es que los valores de matriz sean todos números en el rango 0..n, porque en este caso la diferencia absoluta máxima es solo n.

Puedo hacer esto en O (n lg n) pero no en O (n). Represente los contenidos de la matriz por una matriz de tamaño n + 1 con el elemento i puesto a 1 donde hay un valor i en la matriz. Luego use FFT para convolucionar la matriz consigo misma - hay una diferencia Ai - Aj = k donde el k-ésimo elemento de la convolución es distinto de cero.

1

Si el entrevistador es aficionado a los juegos teóricos, ¿quizás estaba pensando en usar una tabla de entradas y resultados? Cualquier problema de con un límite en el tamaño de la entrada, y que tiene una solución conocida, puede resolverse mediante la búsqueda de tabla. Dado que primero ha creado y almacenado esa tabla, que podría ser grande.

Por lo tanto, si el tamaño de la matriz es limitado, el problema puede resolverse mediante la búsqueda de tabla, que (con algunas suposiciones) incluso se puede realizar en tiempo constante. De acuerdo, incluso para un tamaño de matriz máximo de dos (suponiendo enteros de 32 bits), la tabla no cabe en la memoria de una computadora normal o en los discos. Para tamaños máximos más grandes de la matriz, está en el tamaño "no encajará en el universo conocido". Pero, teóricamente, se puede hacer.

(Pero, en realidad, creo que el comentario de Jens Gustedt es más probable.)

Cuestiones relacionadas