具有快速随机访问的堆状数据结构?

时间:2014-11-21 20:36:04

标签: algorithm data-structures map heap

我的情况如下:

  • 我有一组实体,每个实体都有一个"善良"属性。
  • 我希望一次抓住一个实体,从#34; best"最糟糕的。"
  • " best"实体被抓住,"善良"几个(相对较少的)我的其他实体的属性发生了变化,这个变化必须纳入我即将做出的下一个"最佳"抓住的实体。
  • 一些(相对较少的)实体可能变得“毫无价值”。抓住之后,这些应该从我的藏品中删除。
  • 我很容易构建,考虑到我抓住的实体,现在的一套 - "脏"对象,即可能具有现在不同的优点的实体集,"或者已经变得毫无价值。"

所以,我需要一个允许我的数据结构:

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

我的想法是将max-heap与无序映射一起使用,键入堆条目,并使值等于例如对象'堆实现中底层数组中的相应索引。

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

1 个答案:

答案 0 :(得分:1)

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

因为实体'值只会变得更糟,你可以懒洋洋地将它们从链表中删除 - 如果该项目毫无价值,则将其删除,如果其值已更改,则将其标记为"已更改。"检查"已更改"在链表末尾的实体上标记,如果它是真实的"然后删除实体并将其添加到max-heap。延迟更新的优点是您通常不需要更新堆中的项目(您只需更新链接列表中项目的值),并且如果项目已更改并且然后你变得毫无价值,然后你就可以将它从链表中删除而无需将其添加到堆中。