【问题标题】:Efficient way to randomly delete all items from a hashtable?从哈希表中随机删除所有项目的有效方法?
【发布时间】:2015-09-21 21:18:02
【问题描述】:

这是场景。

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

在所有项目都添加到哈希表之后,现在我喜欢随机选择一个 id 并从哈希表中删除具有此 id 的项目。重复此过程,直到哈希表变为空。

我正在使用 C 来实现它,我使用的哈希表是 uthash : http://troydhanson.github.io/uthash/

有什么想法吗?

更新:

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

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

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

【问题讨论】:

  • 如果要全部删除,为什么还要按随机顺序删除?
  • 如果你要删除所有这些,为什么顺序很重要?
  • 如果id是按顺序排列的,为什么还要使用hash表呢?
  • 我将投票赞成关闭这个问题,因为它根本不清楚你的要求。但是,如果您能解释(a)为什么从哈希表中删除项目的顺序很重要,(b)为什么首先要对具有顺序 ID 的项目进行哈希处理,(c)您到目前为止已经尝试过,以及 (d) 为什么它没有达到您的预期。
  • 其实是为了测试。我将编辑我的问题以提供更多信息。

标签: c hashtable


【解决方案1】:
  1. 创建一个长度为 N 的数组
  2. 用数字 1 到 N 填充数组
  3. Fisher-Yates shuffle数组(随机排列数字)
  4. 为数组中的每个数字删除相应的哈希表条目

【讨论】:

  • 这个看起来很有希望。我试试,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2010-09-21
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多