Me presenté para una entrevista en la que me pidieron que escribiera un algoritmo para el hashing de clave parcial, es decir; si se inserta ABCBC en el hash, la búsqueda de cualquiera de las cadenas secundarias debe devolver el valor almacenado. Mi respuesta fue crear una colección de todas las subcadenas posibles de una clave determinada y mantener una asignación entre cada subcadena a su cadena matriz o más. Luego mantenga una BST de la colección de todas las subcadenas. Cada nodo apuntará a una colección de valores reales con los que esa subcadena podría coincidir. Por ej. A, AB, ABC, ABCB, ABCBC, B, BC, BCB, BCBC, C, CB, CBC son posibles subcadenas para esta cadena. Puede haber otras cadenas también como BAB de las cuales AB y B son subcadena. Por lo tanto, dado AB, se asignará a dos cadenas BAB y ABCBC.Mejor forma de implementar el hash de clave parcial
¿Hay alguna otra manera más eficiente? Gracias
Puede almacenar los nodos de la subcadena en una tabla hash (hash en el valor de la subcadena, obviamente). Esto cortaría su búsqueda de O (log n) a O (1). La complejidad del espacio sería comparable o ligeramente peor (debido a las ranuras vacías en la tabla). – jpm
Parece que crear un hash para cada subcadena puede volverse inviable ... ¿quizás hay un truco diferente? ¿Algo que se pueda usar con árboles de prefijos? –
Árbol de sufijo (http://en.wikipedia.org/wiki/Suffix_tree) quizás, aunque no es realmente "hash". Realmente no entiendo cómo funciona la colección general: supongamos que inserto ABCBC con un valor de 4. Luego, la búsqueda de ABC devuelve 4, es suficiente. ¿Qué sucede si también inserto CDABC con un valor de 5. Ahora, ¿qué devuelve la búsqueda de ABC? No puede decir "debería devolver el valor almacenado" y también decir "se correlacionará con dos cadenas", porque no puede hacer ambas cosas. –