Sólo por la práctica (y no como una tarea) He estado tratando de resolver este problema (CLRS, 3ª edición, el ejercicio 11,2-6):¿Elegir de manera eficiente un elemento aleatorio de una tabla hash encadenada?
Supongamos que tenemos almacenados n claves en una tabla hash de tamaño m, con colisiones resueltas por encadenamiento, y que sabemos la longitud de cada cadena , incluida la longitud L de la cadena más larga. Describa un procedimiento que selecciona una clave uniformemente al azar entre las claves en la tabla hash y la devuelve en el tiempo esperado O (L * (1 + m/n)).
Lo que pensé hasta ahora es que la probabilidad de que se devuelva cada tecla es 1/n. Si tratamos de obtener un valor aleatorio x entre 1 an, y tratamos de encontrar la clave xth en secuencia ordenada primero por cubo, entonces a lo largo de la cadena en el cubo, entonces tomará O (m) para encontrar el cubo correcto yendo a través de cubos uno por uno y O (L) tiempo para obtener la llave correcta en la cadena.
¿Dónde está tu pregunta? – outis
El peor caso es O (mn) para encontrar el artículo relacionado, pero el tiempo esperado (como pregunta) es O (1 + m/n) para cada uno de ellos y será O (L * (m/n + 1)) para todos ellos. –
¿Cómo se almacena la información de longitud? Estoy pensando que si una cubeta tiene todos los elementos y el resto tiene cero, ni siquiera puedes encontrar esa cubeta más rápido que el tiempo O (n). ¿Hay alguna otra información disponible sobre dónde están los elementos? – templatetypedef