Todos sabemos que la distinción de elementos en el modelo basado en la comparación no se puede hacer en el tiempo . Sin embargo, en una palabra RAM, uno posiblemente puede lograr mejor.
Por supuesto, si uno asume la existencia de una función hash perfecta que se puede calcular en tiempo lineal, obtenemos un algoritmo de tiempo lineal para la distinción de elementos: simplemente siga numerando uno por uno y devuelva 1 si hay una colisión.
Sin embargo, hay dos problemas: 1) la mayoría de las construcciones de funciones hash perfectas que pude encontrar aleatoriedad utilizada y 2) No puedo encontrar una discusión sobre el tiempo de preprocesamiento en ningún lado, es decir, el tiempo requerido para decidir qué función hash se va a utilizar. utilizar en función del conjunto de números de entrada.
Fredman et al. " Almacenar una tabla dispersa con peor caso de acceso " resuelve el primer problema al proporcionar una función hash con tiempo de acceso en el peor de los casos, pero no dice nada sobre el segundo problema .
En resumen, esto es lo que quiero:
Diseñar un algoritmo que, dado un conjunto de n números (cada número siendo w bits de longitud) sobre una palabra-RAM con longitud de palabra w , encuentra una función hash h : S → { 1 , ... , m } en O ( n ) tiempo , donde m = O ( n ) . La función h debe tener la propiedad de que para cualquier j ∈ { 1 , ... , m } , el número de elementos de ese mapa a j es una constanteycalcular h ( i ) debería llevar O ( 1 ) tiempo en un modelo "razonable" de palabra-RAM, es decir, el modelo no debería permitir que se evalúen funciones "exóticas" en las palabras en O ( 1 ) tiempo.
También me gustaría saber si hay algoritmos para resolver la distinción de elementos en la palabra RAM que no utilizan funciones hash en absoluto.