2012-09-16 28 views
5

Estoy implementando una clase Hashtable en C++. El método de resolución de colisión que estoy usando es un sondeo lineal con eliminación diferida. He visto implementaciones de esto, pero tenía una pregunta con respecto al método de inserción. Cada celda de la tabla hash tiene un estado (activo, eliminado, vacío). Por alguna razón en la implementación que he visto al insertar un nuevo elemento, ellos oprimen la tecla y luego sondean la tabla hasta que se encuentra una celda VACÍA (o hasta que se encuentre una celda que ya contenga la misma clave).Implementando hashtables en C++ (inserción y eliminación diferida)

Código Ejemplo:

int findPos(const string &key){ 
    int currentPos=hash(key); 
    while(data[currentPos].state!=EMPTY && data[currentPos].key!=key){ 
     currentPos++; 
     if (currentPos>=data.size()) 
      currentPos-=data.size() 
     } 
     return currentPos; 
} 

bool insert(const string &key){ 
    int currentPos=findPos(key); 
    if (isActive(currentPos)) 
      return false; //already exists 
    data[currentPos]=hashEntry(key,ACTIVE); 
    if (++currentSize>data.size()/2) 
      rehash(); 
    return true; //element inserted 
} 

Mi pregunta es: ¿Hay alguna razón para no parar y insertar en una célula que ha sido etiquetado como eliminado? En otras palabras, en el método findPos, ¿por qué no cambiar la instrucción while al while(data[currentPos].state==ACTIVE && data[currentPos].key!=key) para que el bucle finalice cuando encontremos la celda con la clave o la primera celda eliminada/vacía? Luego, en el inserto, prueba el estado de la celda. Si está activo, la entrada ya existe, así que devuelve falso; otra parte inserte el elemento.

Respuesta

3

La clave podría haberse insertado más adelante, y luego una de las celdas intermedias podría haberse marcado como eliminada. Luego insertarías una instancia duplicada de la misma clave.

0

Probablemente su código de referencia no haya sido borrado o el estado DELETED se haya agregado a una implementación existente. Sí, puede "recuperar" de forma segura una entrada para su clave. Pero asegúrese de que este algoritmo se use de manera consistente, para evitar la situación descrita en la respuesta de @Thomas.

Cuestiones relacionadas