我正在寻找能够有效解决Order-maintenance problem的数据结构。换句话说,我需要有效率
我找到了讨论这个问题的好文章:
算法非常有效(某些状态对于所有操作都是O(1)),但它们似乎并不是微不足道的,我想知道是否存在这些或类似数据结构的开源C ++实现。
我见过related topic,建议使用一些时间复杂度为O(log n)的简单方法,但是我在这里寻找现有的实现。
如果在其他一些流行语言中有一个例子,它也会很好,这样我至少可以在尝试自己实现它之前先尝试一下。
详情
我要去
注意
标准订购容器(std :: set,std :: map)不是我想要的,因为它们会维护我的订单,但我需要自己订购元素。类似于我对std :: list的处理,但是位置比较是线性的,这是不可接受的。
答案 0 :(得分:4)
如果您正在寻找易于实施且高效的解决方案,您可以使用平衡二叉搜索树(AVL或红黑树)构建此结构。您可以按如下方式实施操作:
因此,您可以看到此实现的优势在于所有操作都具有复杂度O(log n),并且易于实现。
答案 1 :(得分:0)
您可以使用类似于使用std :: list
的跳过列表跳过清单最初是由William Pugh在1989年描述的。 引用作者:
跳过列表是一种概率数据结构,似乎可能取代平衡树作为许多应用程序的首选实现方法。跳过列表算法与平衡树具有相同的渐近预期时间范围,更简单,更快速,占用空间更少。
答案 2 :(得分:-2)
STL是解决您问题的方法
它是标准的,经过验证的高效容器以及支持它们的算法。 STL中的几乎所有容器都支持您提到的操作。
似乎std::deque
对你所指的任务具有最佳品质:
1)插入:从O(1)复杂度到后面和前面都是
2)删除:与连续容器不同,std::deque::erase
是O(N),其中N是删除的项目数。这意味着只删除一个项目具有O(1)
的复杂性
3)位置比较:使用std::advance
,std::deque
的复杂度为O(N)
4)排序:使用std::sort
,通常会对任务使用快速排序,并将在O(n * log n)中运行。至少在MSVC ++中,该函数试图猜测给定容器的最佳排序算法是什么。
在尝试彻底使用STL之前,不要尝试使用开源解决方案/构建自己的库!