0

私は C を使用してマスター アルゴリズムを研究しており、オープン アドレス ハッシュ テーブル プログラムで、著者は次のように定義void *vacated;しました。ハッシュ テーブル内の空いた位置を指す。したがって、ハッシュテーブルの2つの値を連続して削除したい場合。vacated最後に削除された変数を指すようにできないというのは本当ですか?

同じハッシュ値の 2 つの変数を連続して削除したい場合。これは、ハッシュ値が異なる 2 つの変数を削除することとは異なると思います。

functionohtbl_removeで、削除する変数を NULL にするステートメントが見つかりませんでした。変数を連続して削除したい場合、どうすれば変数を削除できますか? ありがとう。

int ohtbl_remove(OHTbl *htbl, void **data) {

int                position,
               i;

/*****************************************************************************
*                                                                            *
*  Use double hashing to hash the key.                                       *
*                                                                            *
*****************************************************************************/


for (i = 0; i < htbl->positions; i++) {

   position = (htbl->h1(*data) + (i * htbl->h2(*data))) % htbl->positions;

   if (htbl->table[position] == NULL) {

  /***********************************************************************
  *                                                                      *
  *  Return that the data was not found.                                 *
  *                                                                      *
  ***********************************************************************/

  return -1;

  }

else if (htbl->table[position] == htbl->vacated) {

  /***********************************************************************
  *                                                                      *
  *  Search beyond vacated positions.                                    *
  *                                                                      *
  ***********************************************************************/

  continue;

  }

else if (htbl->match(htbl->table[position], *data)) {

  /***********************************************************************
  *                                                                      *
  *  Pass back the data from the table.                                  *
  *                                                                      *
  ***********************************************************************/

  *data = htbl->table[position];
  htbl->table[position] = htbl->vacated;
  htbl->size--;
  return 0;

 }

}
4

1 に答える 1

0

リスト内のいくつかの要素はすべて同じvacatedメンバーを指している可能性があります。つまり、テーブル内の空きスロットを 1 つしか持てないということはありません。また、複数の連続した空きスロットを持つこともできます。リンクは次のエントリを指します。データ ポインターが指し示すvacatedので、昔々ここに要素があり、それを超えて検索を続ける必要があることがわかります。

于 2013-05-21T03:14:39.427 に答える