【问题标题】:Data structure to store key-value pairs and retrive the key for the lowest value quickly用于存储键值对并快速检索最小值的键的数据结构
【发布时间】:2011-03-18 03:26:05
【问题描述】:

我正在实现类似缓存的东西,它的工作原理是这样的:

  1. 如果给定键的新值来自某个外部进程,请存储该值,并记住该值到达的时间。
  2. 如果我们处于空闲状态,则在缓存中查找最旧的条目,从外部源获取键的新值并更新缓存。
  3. 在询问时返回给定键的值。

我需要一个数据结构来存储键值对,以便尽可能快地执行以下操作(按速度优先顺序):

  1. 找到具有最低(未知)值的键。
  2. 更新给定键的值,如果键不存在,则添加新的键值对。
  3. 其他常规哈希表操作,如删除键、检查键是否存在等。

是否有任何数据结构允许这样做?这里的问题是,为了快速执行第一个查询,我需要一些按值排序的东西,并且要快速更新给定键的值,我需要按键排序的东西。到目前为止,我最好的解决方案是这样的:

将值存储在常规哈希表中,将 (value, key) 对存储为值排序堆。查找最小值的键是这样的:

  1. 找到堆中最小值的键。
  2. 从哈希表中找到该键的值。
  3. 如果值不匹配,则从堆中弹出值并从第 1 步开始重复。

更新值如下:

  1. 将值存储在哈希表中。
  2. 将新的(值、键)对推送到堆中。

删除键比较棘手,需要在堆中搜索值。这提供了类似于 O(log n) 的性能,但这种解决方案对我来说似乎很麻烦。

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

【问题讨论】:

    标签: python data-structures caching


    【解决方案1】:

    大多数堆实现会在 O(1) 时间内为您提供集合中最低的键,但不能保证随机查找或删除的速度。我建议将两种数据结构配对:任何简单的堆实现和任何开箱即用的哈希表。

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

    【讨论】:

    • 我不明白配对数据结构有什么帮助。考虑我正在更新某个已知键的值。这个操作对于哈希表来说很快,但是堆是按值排序的,而不是按键排序的,所以查找将类似于 O(n)。我也不明白一棵树会有什么帮助。这里的问题是我需要一些按值排序的东西来回答问题 1,同时需要一些按键排序的东西来更新。
    【解决方案2】:

    我会尝试:

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

    更多信息here

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 地图如何快速回答第一个问题?
      猜你喜欢
      • 1970-01-01
      • 2017-01-24
      • 2013-01-14
      • 2020-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多