用于排序/操作/排序的最佳替代算法

best alternative algo for sort/manipulate/sort

本文关键字:排序 算法 操作 用于 最佳      更新时间:2023-10-16

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

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引用。
  • 如果您决定更改元素的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() 方法完成。

确切地说出你在做什么有点困难,但听起来你想要一个数据结构,其中 is 可以有效地:

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

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

你看过std::setstd::map和他们的multi表兄弟吗?无论您以何种顺序插入或删除元素,这些容器始终保持排序,并且它们易于使用。