为具有可变元素(C++)的优先级队列确定最佳ADT

Determining the best ADT for a priority queue with changeable elements (C++)

本文关键字:队列 优先级 ADT 最佳 C++ 元素      更新时间:2023-10-16

这里的第一篇文章,我是一个初学者,希望我能让自己变得有用。。。

我正在努力寻找并理解ADT/概念,它能完成我所追求的工作。我猜它已经在那里了。

我有一个对象的数组/列表/树(待决定的容器),每个对象都有一个计数,该计数与流程迭代中有多少未被使用有关。随着迭代的进行,每个对象的计数累加1。这个想法是,我迟早会需要任何未使用的对象正在使用的内存,所以我会删除它们,为不在RAM中的对象腾出空间(初始计数为"0")。但是,如果我使用的对象仍在内存中,它的计数会重置为"0",我会为自己不必访问磁盘来获取其内容而感到欣慰。

缓存?

主过程循环中会有类似于以下内容的内容:

if (object needs to be added && (totalNumberOfObjects > someConstant))
object with highest count deleted from RAM and the (heap??)
newObject added with a count of '0'
if (an object already in RAM is accessed by the process)
accessedObject count is set to '0'
for (All objects in RAM) 
count++

我可以四处闲逛(很长一段时间),建立自己的混乱局面,但我认为从单词go中学习最有效的方法会很有趣。

像一堆东西?

您可以使用堆来实现这一点,但我认为这太过分了。听起来你不会有很多不同的计数值,每个计数都会有很多对象。如果这是真的,那么您只需要将对象线程化到具有相同计数的对象列表中。这些列表本身被排列在一个出队列中(或者C++坚持称之为"deque")。

这里的关键是你需要增加所有对象的计数,如果可能的话,你可能希望它是O(1),而不是O(N)。这是可能的:关键是每个列表的标题也包含其计数与下一个较小计数的差异。计数最小的列表的标头包含一个从0开始的增量,这是最小的计数。要增加所有对象的计数,只需将此单个数字增加一。

要将对象的计数设置为0,请从其列表中删除该对象(这意味着您总是需要通过对象的列表迭代器引用对象,或者您需要实现自己的侵入式链表),然后(1)如果该列表的计数为0,则将其添加到底部列表,或者(2)创建一个计数为0的新底部列表,该列表仅包含该对象。

创建新对象的过程是相同的,只是不必将其从当前列表中取消链接。

要从内存中逐出对象,请选择顶部列表(计数最大的列表)顶部的对象。如果该列表变为空,则将其从队列中弹出。如果需要更多内存,可以重复此操作。

所以所有的运算,包括"递增所有计数",都是O(1)。不幸的是,存储开销是每个对象两个指针,加上每个唯一计数两个指针和一个整数(最坏的情况下,这与对象的数量相同,但在实践中可能要少得多)。由于很难想象任何其他算法会为每个对象使用少于一个指针加一个计数,因此这可能甚至不是时空权衡;额外的空间需求是最小的。