2011-12-25 21 views
12

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.

+1

¿Dónde está tu pregunta? – outis

+0

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. –

+0

¿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

Respuesta

23

repita los pasos siguientes hasta que un elemento se devuelve:

  • seleccionará aleatoriamente un cubo. Deje k la cantidad de elementos en el depósito.
  • Seleccione p uniformemente al azar desde 1 ... L. Si p <= k devuelve el elemento p en el cubo.

Debe estar claro que el procedimiento devuelve un elemento uniformemente al azar. Estamos aplicando el muestreo de rechazo a los elementos colocados en una matriz 2D.

El número esperado de elementos por depósito es n/m. La probabilidad de que el intento de muestreo sea exitoso es (n/m)/L. El número esperado de intentos necesarios para encontrar un segmento es, por lo tanto, L * m/n. Junto con el costo O(L) de recuperar el elemento del depósito, el tiempo de ejecución esperado es O(L * (1 + m/n)).

+1

+1 Excelente idea sobre el muestreo en el rango de 1 a L. La intuición geométrica de completar el rectángulo y tirar los dardos podría ayudar a aclarar la explicación. – templatetypedef

Cuestiones relacionadas