¿Se puede resolver la unicidad del elemento en un tiempo lineal determinista?

9

Considere el siguiente problema:

Entrada : enumera de enterosX,Y

Objetivo : determinar si existe un número entero que está en ambas listas.x

Supongamos que ambas listas son de tamaño n . ¿Existe un algoritmo determinista de tiempo lineal para este problema? En otras palabras, ¿puedes resolver este problema en O ( n ) tiempo de manera determinista, sin usar aleatoriedad?X,YnO(n)

Desafortunadamente, no puede asumir que los elementos de la lista son todos pequeños.


Puedo ver cómo resolverlo en tiempo esperado usando un algoritmo aleatorio: elija aleatoriamente una función hash 2-universal h , almacene los elementos de X en una tabla hash (usando h como la función hash), y luego busque cada elemento de Y para ver si está en la tabla hash. El tiempo de ejecución esperado será O ( n ) . Sin embargo, no puedo ver cómo encontrar un algoritmo determinista con O ( n ) tiempo de ejecución. Si intenta desrandomizar esto y corregir una única función hash específica, existirá una entrada en el peor de los casos que hará que este procedimiento se ejecute enO(n)hXhYO(n)O(n) tiempo. El mejor algoritmo determinista que puedo encontrar implica ordenar los valores, pero eso no será en tiempo lineal. ¿Podemos lograr un tiempo de ejecución lineal?Θ(n2)

Además, puedo ver cómo resolverlo en tiempo lineal si supones que todos los elementos de la lista son enteros en el rango (básicamente, hacer un recuento), pero estoy interesado en lo que sucede en general caso cuando no podemos asumir eso.[1,n]

Si la respuesta depende del modelo de computación, el modelo RAM salta a la mente, pero me interesarían los resultados para cualquier modelo razonable de computación. Soy consciente de los límites inferiores de para los algoritmos del árbol de decisión para la unicidad del elemento , pero esto no es definitivo, ya que a veces podemos encontrar algoritmos de tiempo lineal incluso cuando hay un Ω ( n log n ) vinculado en El modelo del árbol de decisión.Ω(nlogn) Ω(nlogn)

DW
fuente
Las tablas hash son O (n log n), ya que necesita manejar las colisiones.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen, no veo de dónde sacas eso. El uso de funciones hash 2-universales y una tabla hash de tamaño adecuado garantiza que el número de colisiones hash sea mínimo (con alta probabilidad), por lo que creo que el tiempo de ejecución de es alcanzable. No estoy seguro de dónde obtuviste O ( n lg n ) ; Si no hace algo especial (como usar hashing universal 2), el peor de los casos es O ( n 2 ) , debido a colisiones. O(n)O(nlgn)O(n2)
DW
El diablo está en los detalles, aquí hay una "tabla hash de tamaño adecuado". Esto podría resultar bastante grande, si no quieres colisiones. El típico n-log-n es (si recuerdo correctamente) para manejar las colisiones de la función hash con una lista.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen El número esperado de asignación de teclas a la misma dirección es constante (para tablas que no están sobrecargadas), por lo que el tipo de resolución de colisión es irrelevante. Ver también aquí . ajusta al peor de los casos si utiliza BST equilibrados (externos) en lugar de listas. O(nlogn)
Raphael

Respuestas:

1

Puede resolver el problema en tiempo lineal si tiene suficiente memoria para tener un bit para cada valor posible en X e Y. Esto no impone ninguna restricción en el orden de X e Y.

  1. Inicialmente, todos los bits están sin establecer.
  2. Iterar sobre X configurando el bit correspondiente.
  3. Iterar sobre Y comprobando si el bit correspondiente se estableció anteriormente.
Thorbjørn Ravn Andersen
fuente
2
Desafortunadamente, no puede suponer que todos los enteros son pequeños (no puede suponer que son lo suficientemente pequeños como para que este algoritmo funcione). En el caso general, el tiempo de ejecución de este algoritmo será exponencial en la longitud de bits de los elementos de la lista. ¡Gracias de cualquier forma!
DW
Llamémoslo una "matriz de bits de tamaño adecuado" entonces. También lineal en la longitud de bits es equivalente a log-n. ¿En serio quiere obtener el rendimiento de log-n sin restricciones o condiciones previas en los datos de entrada?
Thorbjørn Ravn Andersen
2
@ ThorbjørnRavnAndersen El espacio es exponencial en la longitud de bits (debe asignar de todos los valores posibles), y el tiempo es lineal en el tamaño total de la lista (debe mirar todos los valores en ambas listas). Nada es lineal en la longitud de bits.
wchargin
0

Como está diciendo que las dos listas contienen números enteros, creo que podemos ejecutar una clasificación de radix en las dos listas y luego hacer una búsqueda lineal comparando las dos listas para elementos equivalentes.

anirudh
fuente
44
Esto solo funciona si hay un límite en la magnitud de los números.
Luke Mathieson
pero pensé que la gran magnitud sería un problema solo para contar la clasificación y para la clasificación de radix podemos seleccionar una raíz lo suficientemente alta como para resolver ese problema ... por favor, hágame saber lo que me falta aquí
anirudh
¿Qué pasa si uno de los números es 2 ^ (2 ^ 128)?
miniBill
@anirudh, pero luego tiene un algoritmo diferente para diferentes tamaños de entrada: necesita un alfabeto más grande cada vez que aumenta la raíz, solo está exportando la complejidad de aumentar la magnitud para aumentar el tamaño del alfabeto. Por supuesto, esto también solo es posible en teoría, no creo que una gran cantidad de hardware le permita cambiar en qué base representa los números (podemos fingir en los extremos de entrada y salida, pero se reduce a (principalmente) binario )
Luke Mathieson
0

O(nm¯)m¯

Ensalada Realz
fuente
O(n)O(n\overbarm)
wmm¯O(n)
w
wnmnnm
-1

O(nlogn)

Omer Gold
fuente
1
La pregunta es bastante explícita sobre el tiempo determinista lineal, no log-lineal. También para determinar si el conjunto (no en qué valor) tiene solo elementos únicos que puede hacer más rápido que loglinear.
Mal
1
Ω(nlogn)
1
Ω(nlogn) Ω(nlogn)
O(nloglogn)O(nlogn)Ω(nlogn)