【发布时间】: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) 为什么它没有达到您的预期。
-
其实是为了测试。我将编辑我的问题以提供更多信息。