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

时间:2015-09-21 21:18:03

标签: c hashtable

以下是该方案。

插入哈希表的项包含一个整数作为键(或id),一个字符串作为值(在此问题中无关紧要) 分配给每个项目的id线性增加,例如,第1项具有id = 1,第2项具有id = 2,...第n项具有id = n。所有项目也按此顺序插入,第一项首先插入,然后第二项......

将所有项目添加到哈希表后,现在我想随机选择一个ID并从哈希表中删除带有此ID的项目。重复此过程,直到哈希表变空。

我使用C实现这个,我使用的哈希表是uthash: http://troydhanson.github.io/uthash/

有什么想法吗?

更新

这些ID实际上分配给已被malloced的内存块。每个内存块都有一个包含id的“header”结构。有一个全局变量可以跟踪下一个要分配的ID号。因此,如果已分配1000个块,则此数字将为1001.当释放一块内存时,此全局变量不会更改。当新的内存块被malloced时,它会不断增长。

因此,我们的想法是随机释放这些内存块,而不是按顺序释放,以检查是否有任何错误。 dealloc函数需要id作为释放相关内存块的参数。我可以从全局变量中随机选择一个数字,比如rand()%global_var。但是在我释放一个块之后,我缺乏一种机制来跟踪哪个id已被“释放”,所以下次不要再次选择这个号码。所以每次我得到一个随机id,我需要首先检查这个id是否已被释放。随着越来越多的ID被释放,dealloc函数的性能恶化:在我可以选择一个未释放的id之前,我遇到多次未命中变得很常见。

当我得到这个想法将所有ID存储在哈希表中时:在我从哈希表中随机选择一个后,我实际上可以将其删除,因此表的大小会缩小,下次我不会选择相同的再次。这个想法仍然不成熟,也许有比使用哈希表更好的方法吗?

1 个答案:

答案 0 :(得分:2)

  1. 创建一个长度为N
  2. 的数组
  3. 使用数字1到N
  4. 填充数组
  5. docs数组(按随机顺序排列数字)
  6. 对于数组中的每个数字,删除相应的哈希表条目