Otra pregunta sobre SO trajo las instalaciones en algunos idiomas a cadenas de hash para darles una búsqueda rápida en una tabla. Dos ejemplos de esto son el diccionario <> en .NET y la {} estructura de almacenamiento en Python. Otros idiomas ciertamente apoyan ese mecanismo. C++ tiene su mapa, LISP tiene un equivalente, al igual que la mayoría de los otros idiomas modernos.hash de tiempo constante para cadenas?
Se sostuvo en las respuestas a la pregunta que los algoritmos hash en cadenas se pueden llevar a cabo en tiempo constante con un miembro SO que tiene 25 años de experiencia en programación afirmando que cualquier cosa se puede codificar en tiempo constante. Mi opinión personal es que esto no es cierto, a menos que su aplicación particular establezca un límite en la longitud de la cadena. Esto significa que una constante K dictará la longitud máxima de una cuerda.
Estoy familiarizado con el algoritmo Rabin-Karp que utiliza una función hash para su funcionamiento, pero este algoritmo no dicta una función hash específica para usar, y el que los autores sugirieron es O (m), donde m es la longitud de la secuencia hash.
Veo algunas otras páginas como esta (http://www.cse.yorku.ca/~oz/hash.html) que muestran algunos algoritmos hash, pero parece que cada uno de ellos itera sobre toda la longitud de la cadena para llegar a su valor.
De mi lectura comparativamente limitada sobre el tema, parece que la mayoría de las matrices asociativas para tipos de cadenas se crean realmente utilizando una función de hashing que opera con un árbol de algún tipo debajo del capó. Puede ser un árbol AVL o un árbol rojo/negro que apunta a la ubicación del elemento de valor en el par clave/valor.
Incluso con esta estructura de árbol, si vamos a permanecer en el orden de theta (log (n)), siendo n el número de elementos en el árbol, necesitamos tener un algoritmo hash de tiempo constante. De lo contrario, tenemos la penalidad aditiva de iterar sobre la cadena. Aunque theta (m) sería eclipsado por theta (log (n)) para índices que contienen muchas cadenas, no podemos ignorarlo si estamos en tal dominio que los textos que buscamos serán muy grandes.
Soy consciente de que los árboles/matrices de sufijo y Aho-Corasick pueden llevar la búsqueda a theta (m) para un gasto mayor en memoria, pero lo que estoy preguntando específicamente es si existe un método hash de tiempo constante para cadenas de longitudes arbitrarias como fue reclamado por el otro miembro SO.
Gracias.
Me recuerda a http://xkcd.com/221/ –
El problema con esto es que las cadenas muy similares tendrían una alta probabilidad de tener hashes idénticos. En general, un cambio de bit único debería cambiar todos los bits en el hash, de modo que la probabilidad de que dos cadenas colisionen es independiente de su similitud. - Dicho eso, su idea funcionaría si no tuviera que preocuparse por la colisión de cadenas cercanas. –