用于排序/操作/排序的最佳替代算法
best alternative algo for sort/manipulate/sort
对于以下情况,我需要更好的算法: 日志文件包含来自两个传感器的数据,即给定时间内可用的条目数,并附加在另一个下面,例如
time < no. entries 1> < no. entries 2>
2
3
3
time < no. entries 1> < no. entries 2>
..
..
目前我可以读取文件,并在动态分配内存后构建了一个列表,该列表已排序。前 3 个条目中的某些操作可能会导致它当前拥有的值减少。在此之后,我需要再次排序并进行操作,直到其中一个数组完全为空。
请为这种情况建议更好的算法,因为每次操作后连续排序都需要很长时间。 我可以使用B树或任何其他方法来减少时间吗?此外,该文件可以超过100MB,因此请建议优化读取和构建数组列表。
您需要根据需要实现自定义优先级队列。您可以实现一个将充当优先级队列的binary-heap
。在此维基百科页面上阅读更多相关信息。
形成堆的成本是 n
元素列表中的 O(n(。
一般来说,二进制堆只向程序员公开push()
、pop()
、front()
或peek()
的方法,这些方法具有O(log n(插入和删除的复杂性。它们具有heap-up()
或heap-down()
私有的方法,分别由push()
和pop()
在内部调用,因此它们会导致维护heap
属性。
我要求您实现自定义优先级队列,因为您需要操作队列的条目,这可能会导致元素的顺序发生变化。您可以使用std::vector
作为优先级队列的容器。您将需要以下额外内容:
- 提供一个重载
operator []
,该返回对索引元素的const
引用。 - 如果您决定更改元素的
key
或rank
,这将改变元素的顺序,则可以通过提供一个replace(int iIndex, const Type &item)
方法来实现,该方法将iIndex
的元素替换为元素item
,但保留元素的顺序。
下面是它的外观:
template <class Type>
bool PriorityQueue<Type>::Replace(int iIndex, const Type &item ){
if ( iIndex < m_itemList.size() ) {
if ( item < m_itemList[ iIndex ] ) {
m_itemList[ iIndex ] = item;
HeapUp( iIndex );
}
else {
m_itemList[ iIndex ] = item;
HeapDown( iIndex );
}
}
else {
return false;
}
}
因此,replace()
方法会自动在内部调用 heapUp()
或 heapDown()
以保留堆属性。这的复杂性将再次是O(log n(更糟。
operator []
应返回对程序的 const 引用,以免意外滥用它并破坏堆排序。堆中的唯一更改应由 replace()
方法完成。
确切地说出你在做什么有点困难,但听起来你想要一个数据结构,其中 is 可以有效地:
- 查找并删除按某个键排序的前 N 个条目;
- 插入一个条目。
此名称为优先级队列。 有许多方法可以实现高效的优先级队列。
你看过std::set
、std::map
和他们的multi
表兄弟吗?无论您以何种顺序插入或删除元素,这些容器始终保持排序,并且它们易于使用。
- C++选择排序算法中的逻辑错误
- 排序算法c++
- 下面是排序算法O(n)吗
- 为什么我的排序算法会更改数组值
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 排序算法问题(购买商店物品)(崩溃)
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 为什么在此排序算法实现中,向量明显比数组慢?
- C++中合并排序算法的奇怪行为
- 我的排序算法程序中的堆错误
- 如何使用cpp编写选择排序算法以降序对元素列表进行排序?
- 解释一下这个排序算法是如何工作的?
- 快速排序函数在快速排序算法中如何工作?
- 分段故障,合并排序算法
- 这种排序算法已经存在吗?
- 为什么此代码上的排序算法不调用类的交换版本?
- 为什么我的替代排序算法不起作用?
- 选择排序算法生成无序结果
- 递归合并排序算法实现
- 这种快速排序算法有什么问题?