从哈希表中随机删除所有项目的有效方法?

Efficient way to randomly delete all items from a hashtable?

这是场景。

插入到散列中的项目table包含一个整数作为键(或id)和一个字符串作为值(与本题无关) 分配给每个项目的 id 线性增加,例如,第 1 个项目的 id = 1,第 2 个项目的 id = 2,...第 n 个项目的 id = n。所有项目也按此顺序插入,首先是第一项,然后是第二项...

在所有项目都添加到散列后table,现在我想随机选择一个id并将具有该id的项目从散列中删除table。重复这个过程,直到 hashtable 变空。

我正在使用 C 来实现它,我使用的散列table 是 uthash: http://troydhanson.github.io/uthash/

有什么想法吗?

更新:

这些id实际上是分配给已经分配的内存块。每个内存块都有一个 "header" 结构,其中包含一个 id。有一个全局变量可以跟踪下一个要分配的 ID 号。所以如果分配了 1000 个块,这个数字就是 1001。当一个内存块被释放时,这个全局变量不会改变。当分配新的内存块时,它只会不断增长。

所以我们的想法是随机释放这些内存块,而不是按顺序,以检查是否出现问题。 dealloc 函数需要一个 id 作为参数来释放关联的内存块。我可以从全局变量中随机选择一个数字,比如 rand() % global_var。但是在我释放一个块之后,我缺少一种机制来跟踪哪个 id 已经 "freed" 所以下次不要再选择这个数字。所以每次我得到一个随机 id 时,我需要先检查这个 id 是否已经被释放。随着越来越多的 id 被释放,dealloc 函数的性能会下降:在我可以选择一个未释放的 id 之前,我经常遇到多次未命中。

那时我有了将所有 id 存储在哈希中的想法table:在我从哈希中随机选择一个后 table,我实际上可以删除它所以 table缩小了,下次我不会再挑一样的了。这个想法还不成熟,也许有比使用 hashtable 更好的方法?

  1. 创建一个长度为 N 的数组
  2. 用数字 1 到 N 填充数组
  3. Fisher-Yates shuffle数组(随机排列数字)
  4. 为数组中的每个数字删除相应的散列-table条目