排序/操纵/排序的最佳替代算法

时间:2012-02-20 05:28:13

标签: c++ c algorithm

我需要一个更好的算法来处理以下情况:    包含来自两个传感器的数据的日志文件,即条目数量在给定时间内可用,并且在下面附加一个,例如

time < no. entries 1> < no. entries 2>

2

3

3

time < no. entries 1> < no. entries 2>

..

..

目前我可以读取文件并在动态分配内存之后构建一个列表,该列表已排序。在前3个条目中的某些操作可能导致其当前拥有的值减少。在此之后,我需要再次排序并进行操作,直到其中一个数组完全为空。

请为这种情况建议一个更好的算法,因为每次操作后连续排序需要很长时间。    我可以使用b树或任何其他方法来减少时间吗?该文件也可以超过100MB,因此请建议优化读取和构建数组列表。

3 个答案:

答案 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引用。
  • 如果您决定更改会改变元素顺序的元素的keyrank,您可以通过提供替换元素的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)

要确切地说出你正在做什么有点难,但它听起来就像你想要一个有效的数据结构:

  • 查找&amp;删除按某个键排序的前N个条目;
  • 插入条目。

此名称是优先级队列。有许多方法可以实现有效的优先级队列。

答案 2 :(得分:0)

您是否看过std::setstd::map及其multi堂兄弟?无论您插入或移除元素的顺序如何,这些容器始终保持分类状态,并且易于使用。