我有一些优先级为复合类型的对象,并且仅部分排序。我需要按此优先级顺序选择对象(即每次产生最少的项)。但是,我宁愿选择队列是否稳定(从某种意义上说,如果存在多个最小元素,则应该首先返回最旧的元素),而不是随意完成订单。
是否有任何可用于部分排序的堆数据结构?还是修改了常规优先级队列才能使用它?我需要的算法的常见选择是简单的二进制或四进制堆,但这不适用于部分排序。
优先级值支持:
- 一个≼ b b ≼ 一个也可能为假。在这种情况下,我写。
- 查找INFI(glb)和uprema(lub)。是最大y,因此y \ preccurlyeq x_i。计算n个值的最小值需要O(n)时间。ý ý ≼ X 我 Ñ ø (Ñ )下确界(并确)每一组的存在。
- 可以定义部分排序的线性扩展。将其用于优先级队列是一种简便的方法,因为该算法确实可以正常工作。但是顺序会影响性能,插入顺序看起来应该最好,以避免最坏的情况。
另外,我要在其中使用的算法需要知道队列中所有优先级的最小值。
优先级具有现实意义,但可能会发生变化,因此依靠它们可能拥有的其他属性似乎并不可行。
注意:二进制堆不适用于部分排序。假设一个带有,和c的二进制堆,其中和以及。它们按该顺序放置,所以
a (0)
/ \
b (1) c (2)
现在已插入d。下一个自由头寸是3,b的左孩子,所以我们得到
a (0)
/ \
b (1) c (2)
/
d (3)
如果(从传递性中暗示,但未和)和,则不会与交换,因为它不少于。但它实际上是小于d ≼ ç d b d ⋚ ̸ b d b 一,但是没有与它进行比较,因此现在主堆不变式不再成立。顶部不是最小的。
我怀疑可以使二项式堆样式的堆森林起作用。基本上,始终将新值与root进行比较并且仅将可比较的元素链接在一起非常重要。这将使森林中的树木具有随机大小,从而使复杂度取决于堆中相互不可比拟的集合的数量。我有点怀疑复杂性无法解决(我们必须继续比较直到找到可比较的元素)我可能错过了一些东西,因此我将其保留下来。
注意:排序是局部的,虽然有多种方法可以为其定义线性扩展,但添加时间戳并将其用作辅助标准并不是其中一种。假设我们分配的时间戳为每个和定义的排序作为当且仅当或(和。然后假设我们有不同的,,,使得和。然后和,但是,因此该关系不是可传递的,因此根本不是有序的。这种扩展仅适用于弱排序,而不适用于部分排序。
编辑:我意识到不仅定义了任何集合,而且我实际上需要能够有效地获取队列中当前的元素。因此,我现在正在考虑将包含子树信息的特殊节点添加到某些常见堆结构是否有帮助。