【问题标题】:Create a time-based map in C在 C 中创建基于时间的地图
【发布时间】:2013-07-22 07:13:09
【问题描述】:

所以我有一张来自 Key -> Struct 的地图

我的键将是一个设备 IP 地址,而值(结构)将保存一个设备 IP 地址,并且经过一段时间后,键值对将过期,因此会从地图中删除。

我在这方面还很陌生,所以想知道有什么好方法。

我在 Google 上四处搜索,似乎在 Java 中找到了很多基于时间的地图

编辑

遇到this 之后,我想我可能必须创建一个包含项目的地图,然后有一个与每个元素的引用并行的双端队列。然后定期调用 clean ,如果它在那里的时间超过 x 时间,请删除它。

这是更正器吗?任何人都可以提出更优化的方法吗?

【问题讨论】:

  • 在访问时(甚至在插入时清理列表并跳过读取操作中的无效条目)可能就足够了。

标签: c keyvaluepair


【解决方案1】:

我使用了三种方法来解决这样的问题。

  1. 使用周期性计时器。每次量子,获取所有过期元素并使其过期。将元素保留在计时器轮中,请参阅scheme 7 in this paper for ideas. 这里的开销是周期性计时器将在它无事可做并且存储桶具有恒定的内存开销时启动,但这是您可以做的最有效的事情,如果您添加和从地图中删除东西的频率比从地图中过期元素的频率要高得多。

  2. 检查所有元素的最短到期时间。安排一个计时器在该时间后启动。在计时器中,移除过期元素并安排下一个计时器。如果新元素的过期时间短于当前调度的计时器,则每次添加新元素时重新调度计时器。将元素放在堆中,以便快速查找谁需要先过期。这有相当大的插入和删除开销,但当从映射中最常见的删除是通过过期时,它非常有效。

  3. 每次访问地图时,请检查您访问的元素是否已过期。如果是,就把它扔掉,假装它一开始就不存在。这可能会非常低效,因为每次访问都会调用检查时间戳,并且如果您需要在到期时执行某些操作,这将不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多