【问题标题】:Heap-like data structure with fast random access?具有快速随机访问的堆式数据结构?
【发布时间】:2014-11-21 20:36:04
【问题描述】:

我的情况如下:

  • 我有一个实体集合,每个实体都有一个“善良”属性。
  • 我希望一次抓取一个实体,从“最佳”到“最差”。
  • 在抓取“最佳”实体后,我的其他实体中的几个(相对较少)的“好”属性会发生变化,并且此更改必须纳入我即将做出的下一个“最佳”实体的决定中。
  • 一些(相对较少的)实体在被抓取后可能会变得“毫无价值”,这些应该从我的收藏中删除。
  • 考虑到我刚刚抓取的实体,我很容易构建现在“脏”对象的集合,即可能具有现在不同的“优点”或已经成为的实体集合“一文不值。”

所以,我需要一个数据结构,让我能够:

  • 快速抓取“最大”的集合(例如,最大堆)。
  • 快速更新我的集合中对象的基本顺序以适应上述情况。 (如果我们可以在底层堆实现中访问脏对象的位置,例如数组索引,那么在堆中很容易做到。)
  • 保证我的收藏条目之间没有冲突。 (这些条目是对我上面描述的实体的引用。)

我的想法是将最大堆与无序映射一起使用,以堆条目为键,并且具有等于例如对象在堆实现中的底层数组中的相应索引的值。

我想知道是否存在更适合这种情况的数据结构。

【问题讨论】:

  • 定义“相对较少”的 1/10 元素? sqrt(n) 的元素?元素的日志(n)?日志(日志(n))? .... 每次迭代需要更新的元素的规模是多少?
  • 抓取后需要更新的实体数量对于我们来说可以被视为常量。更重要的是,会有一些与原始实体数量大致呈线性关系的抓取。
  • 物品好坏的更新是不是越来越好?
  • 抱歉,这是个好问题,我应该解决这个问题。实体只会变得更糟。尽管如此,如果我们提出的任何解决方案都能奏效,即使实体被允许变得更好,那将是一件好事。
  • 我想不出更好的了。但即使我能做到,你也只能得到一个不断改进的因素。很可能这对您的实际问题并不重要。

标签: algorithm data-structures map heap


【解决方案1】:

如果在抓取最佳实体时很少有成员受到影响,那么您可以通过使用链表和无序映射(每个都有原始实体集)和最大堆来改进运行时。从链接列表的末尾删除最佳实体后,您将使用映射来定位受影响的实体,将它们从列表中删除,并将无价值的实体添加到最大堆中。此后,下一个最佳实体是列表末尾的实体或堆中的最大实体中的较大者。这种设置的优点是从链表中移除是一个恒定时间操作,而插入最大堆将是一个相对较小(与实体总数相比)的日志时间操作。

因为实体的值只会变得更糟,所以您可以从链接列表中懒惰地删除它们 - 如果项目一文不值,则将其删除,如果其值已更改,则将其标记为“已更改”。检查链表末尾实体上的“已更改”标志,如果为“真”,则删除该实体并将其添加到最大堆中。延迟更新的优点是你通常不需要更新堆中的项目(你只需要更新链表中项目的值),如果一个项目被更改然后后来变得毫无价值然后您可以将其从链表中删除,而无需将其添加到堆中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2011-05-17
    • 2018-11-16
    • 2016-06-06
    相关资源
    最近更新 更多