我需要一个更好的算法来处理以下情况: 包含来自两个传感器的数据的日志文件,即条目数量在给定时间内可用,并且在下面附加一个,例如
time < no. entries 1> < no. entries 2>
2
3
3
time < no. entries 1> < no. entries 2>
..
..
目前我可以读取文件并在动态分配内存之后构建一个列表,该列表已排序。在前3个条目中的某些操作可能导致其当前拥有的值减少。在此之后,我需要再次排序并进行操作,直到其中一个数组完全为空。
请为这种情况建议一个更好的算法,因为每次操作后连续排序需要很长时间。 我可以使用b树或任何其他方法来减少时间吗?该文件也可以超过100MB,因此请建议优化读取和构建数组列表。
答案 0 :(得分:1)
您需要根据需要实施自定义优先级队列。您可以实现一个binary-heap
作为您的优先级队列。详细了解this Wikipedia Page。
形成堆的成本是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()
方法完成。
答案 1 :(得分:0)
要确切地说出你正在做什么有点难,但它听起来就像你想要一个有效的数据结构:
此名称是优先级队列。有许多方法可以实现有效的优先级队列。
答案 2 :(得分:0)
您是否看过std::set
,std::map
及其multi
堂兄弟?无论您插入或移除元素的顺序如何,这些容器始终保持分类状态,并且易于使用。