如何有效地破坏队列
How to destroy a queue efficiently?
我实现了我自己的队列数据结构。我使用单向链接列表实现了队列。它是在类定义中实现的。链接列表的头部指向队列的正面,链接列表的尾巴指向队列的末端。请注意,我只保留了尾巴以在o(1(时间中进行推动操作。
现在,类的推动功能会动态分配一个值的内存,然后将其推到列表的末尾。POP函数可以释放为正面分配的值分配的内存。
当队列被破坏(脱离范围(时,我想释放分配的内存,因此我为队列写了一个击曲。我的破坏者遍历整个链接列表,并删除链接列表的每个元素。时间复杂性是o(n(。有什么方法可以降低队列的时间复杂性?是否可以在O(1(中销毁队列?如果我仅处理链接列表的头部,则不会删除链接列表的其余元素,并且由于将删除头部,因此将无法删除链接列表的其他元素。如何实现STL队列的破坏者?它会摧毁O(1(还是O(n(中的整个队列?
这是my_queue的破坏者的代码:
/*
Node is a struct which is the nodes of the linked list.
It has two attributes: val(of type char) and next(of type node*)
*/
my_queue :: ~my_queue(){
node * temp;
while(head != NULL){
temp = head;
head = head->next;
delete temp;
}
sz = 0;
tail = NULL;
}
是否可以销毁O(1(中的队列?
如果您打算继续使用链接列表。o(n(是破坏链接列表(或任何基于节点的数据结构(的最佳渐近复杂性。
也不会用非平凡的破坏者存储对象。您不能在恒定时间内致电n个破坏者。
如果您选择其他数据结构来实现队列,则可能。如果元素在易于破坏的情况下,动态生长的阵列(即向量(可以在恒定时间内被破坏。
如何实现STL队列的驱动器?它会摧毁O(1(还是O(n(中的整个队列?
std::queue
只是较低级容器的包装器。它的破坏者只是摧毁了您选择的基础容器。复杂性是该容器破坏者的复杂性是什么。o(n(对于任何具有非平凡破坏者的对象容器,以及所有std::deque
或std::list
,o(1(的 std::vector
,用于带有琐碎的驱动器的元素。
在这里,复杂性是根据对free
的调用或与内存相关的任何内容来表达的。free
本身的复杂性可能不能保证是恒定的。
- 有效地使用std::unordered_map来插入或增加键的值
- 如何有效地在 std::vector 中插入一对?
- 有效地计算多维数组的累积和?
- 如何有效地计算将单位立方体映射到自身的反射和旋转?
- 有效地将大数存储为 2 的幂用于路径问题
- 如何在C++中写入 1000 个文件时有效地缓冲
- 如何有效地找到数组中三元组和的最小差异?
- 如何在C++中有效地将数字值重新分配给字符数组
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 有效地将数据加载到 std::vector 中<char>
- 如何在使用 cin 请求 int 时有效地使用户输入万无一失?
- C++:有效地将Sha256摘要放入OpenSSL Bignum?
- 如何有效地收集给定数组中的重复元素?
- 如何有效地修剪和合并四叉树中的节点?
- A*路径查找-如何有效地更新openNodes优先级队列中的节点值
- 为什么优先级队列是使用堆实现的,而我们可以更有效地使用向量来实现它
- 如何有效地破坏队列
- 有效地添加到排序的队列中
- 如何在C++中有效地将整个队列复制到向量/数组