Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 具有快速随机访问的堆状数据结构?_Algorithm_Data Structures_Map_Heap - Fatal编程技术网

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

Algorithm 具有快速随机访问的堆状数据结构?,algorithm,data-structures,map,heap,Algorithm,Data Structures,Map,Heap,我的情况如下: 我有一个实体集合,每个实体都有一个属性。 我希望一次抓住一个实体,从最好的到最坏的。 在抓取一个最佳实体后,我的其他实体中相对较少的几个实体的善属性会发生变化,而这种变化必须纳入我即将做出的下一个最佳实体抓取决策中。 一些相对较少的实体在抓取后可能变得一文不值,这些应该从我的收藏中删除。 考虑到我刚刚抓取的实体,我很容易构建一组现在脏的对象,也就是说,一组可能具有不同优点或变得毫无价值的实体。 因此,我需要一个数据结构,使我能够: 快速获取集合中最大的一个,如max heap。

我的情况如下:

我有一个实体集合,每个实体都有一个属性。 我希望一次抓住一个实体,从最好的到最坏的。 在抓取一个最佳实体后,我的其他实体中相对较少的几个实体的善属性会发生变化,而这种变化必须纳入我即将做出的下一个最佳实体抓取决策中。 一些相对较少的实体在抓取后可能变得一文不值,这些应该从我的收藏中删除。 考虑到我刚刚抓取的实体,我很容易构建一组现在脏的对象,也就是说,一组可能具有不同优点或变得毫无价值的实体。 因此,我需要一个数据结构,使我能够:

快速获取集合中最大的一个,如max heap。 快速更新集合中对象的基本顺序,以适应上述情况。如果我们可以访问底层堆实现中脏对象的位置(例如数组索引),那么在堆中很容易做到。 我保证我的收藏条目之间不会发生冲突。这些条目是对我上面描述的实体的引用。 我的想法是将max heap与无序映射一起使用,对堆条目进行键控,其值等于堆实现中底层数组中对象各自的索引


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

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


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

定义相对较少的1/10元素?元素的sqrtn?元素的logn?logn。。。。在每次迭代中需要更新的元素的规模是多少?在抓取之后需要更新的实体的数量可以被视为常量。更重要的是,会有一些原始实体的数量大致呈线性的抓取。一个物品的优点是否会变得更好?对不起,这是个好问题,我应该解决这个问题。实体只会变得更糟。尽管如此,如果我们提出的任何解决方案都能奏效,即使允许实体变得更好,那将是一件好事。我想不出更好的解决方案了。但即使我可以,你也只能得到一个持续的改善因素。很可能这对你的实际问题不会有实质性影响。