用于存储键值对的数据结构,并快速检索最低值的键

时间:2010-07-19 21:17:13

标签: python data-structures caching

我正在实现像缓存这样的工作:

  1. 如果给定密钥的新值从某个外部进程到达,则存储该值,并记住该值到达的时间。
  2. 如果我们处于空闲状态,请找到缓存中最旧的条目,从外部源获取密钥的新值并更新缓存。
  3. 询问时返回给定密钥的值。
  4. 我需要一个数据结构来存储键值对,这样可以尽快执行以下操作(按照速度优先级的顺序):

    1. 找到具有最低(未知)值的密钥。
    2. 更新给定密钥的值,或者如果密钥不存在,则添加新的键值对。
    3. 其他常规哈希表操作,如删除密钥,检查密钥是否存在等等。
    4. 是否有允许这样的数据结构?这里的问题是,为了快速执行第一个查询,我需要一些有价值的东西,并快速更新给定键的值,我需要一些按键排序的东西。到目前为止,我所拥有的最佳解决方案是这样的:

      将值存储为常规哈希表,并将(value,key)对存储为值有序堆。找到最低值的关键是这样的:

      1. 找到堆上最低值的键。
      2. 从哈希表中查找该键的值。
      3. 如果值不匹配则弹出堆中的值并从步骤1开始重复。
      4. 更新值如下:

        1. 将值存储在哈希表中。
        2. 将新(值,键)对推送到堆中。
        3. 删除密钥更棘手,需要在堆中搜索值。这给出了O(log n)性能,但这个解决方案对我来说似乎很麻烦。

          是否有任何数据结构将键的哈希表的属性和关联值的堆组合在一起?我正在用Python编程,所以如果在Python中有现有的实现,那么它是一个很大的优点。

3 个答案:

答案 0 :(得分:3)

大多数堆实现会在O(1)时间内获得集合中的最低密钥,但无法保证随机查找或删除的速度。我建议配对两个数据结构:任何简单的堆实现和任何开箱即用的哈希表。

当然,任何平衡二叉树都可以用作堆,因为最小值和最大值分别位于最左侧和最右侧的叶子上。红黑树或AVL树应该为您提供O(lg n)堆和字典操作。

答案 1 :(得分:0)

您正在寻找地图或关联数组。为了更具体,我们需要知道您尝试使用的语言。

答案 2 :(得分:0)

我试试:

import heapq

myheap = []
mydict = {}

...

def push(key, val):
    heapq.heappush(myheap, (val, key))
    mydict[key] = val

def pop():
    ...

更多信息here