Performance 使用自定义API进行排序-removeAndAppend

Performance 使用自定义API进行排序-removeAndAppend,performance,algorithm,Performance,Algorithm,我们得到一个API- removeAndAppend(val) //Removes val and appends it to the given collection 我们需要使用此API对集合进行排序 我知道我可以靠自己做到这一点- for i <- N to 1 extract max //in O(n) removeAndAppend.. //Consider this O(1) 对于i您可以使用递归和许多集合,在其第一个元素上拆分参数集合:lessereq

我们得到一个API-

removeAndAppend(val)
//Removes val and appends it to the given collection 
我们需要使用此API对集合进行排序

我知道我可以靠自己做到这一点-

for i <- N to 1
    extract max //in O(n) 
    removeAndAppend.. //Consider this O(1)

对于i您可以使用递归和许多集合,在其第一个元素上拆分参数集合:lesserequal和更大,在两者上递归和合并。合并排序的复杂性,搜索internet。

删除和附加
在收集结束时附加

好的,如果这个方法有
O(1)
似乎关键的问题是如何在集合的未处理部分找到当前最大值-一旦最大值被删除并附加到末尾


查看无附加数据结构/恒定空间限制的

您描述的
O(n2)
算法本质上是

如果您有权访问某种迭代器(如果没有,您将如何访问集合中的元素?),我相信可以通过使用如下自定义项做得更好:

  • 比较元素1和元素2
    removeAndAppend
    较小的一个,然后
    removeAndAppend
    剩余的一个。对元素3和4、5和6执行相同的操作。。。元素n-1和n

    现在,您将对每个元素包含2个元素的子集合进行排序

  • 合并指数(1,2)和(3,4)。为此,从一开始就有两个迭代器。首先将1增加两次。然后像往常一样使用
    removeAndAppend
    函数进行合并排序。对(5,6)和(7,8)、(9,10)和(11,12)执行相同的操作。。。和(n-3,n-2)和(n-1,n)

    现在,您将对每个元素包含4个元素的子集合进行排序

  • 合并大小为4的集合,与上面类似,然后合并大小为8、16、32等,直到达到集合大小

整个过程如下所示:

// setSize is how large sets we're currently merging
for setSize = 1; setSize <= n/2; setSize *= 2
  iterator left = begin
           right = begin
  for pos = 1 to n/(2*setSize)
    // here right and left are both at the beginning
    // even after the previous iteration of the loop,
    //   since we've removed and appended all other elements
    // so we only need to increase right by setSize
    right += setSize

    for i = 1 to 2*setSize
      if (left.value <= right.value)
        removeAndAppend(left)
      else
        removeAndAppend(right)
//setSize是我们当前合并的集合的大小

对于setSize=1;setSize读取整个集合,在应用程序中对其进行排序,然后按正确的顺序(现在已知)删除并显示值。

这是什么API?什么语言?或者这是伪代码?我可以想象一个链表可以让你在固定的时间内删除这些数据。。我认为语言/伪代码在这里并不重要。。如果我错了,请纠正我看看Java中关于插入和删除的内容。这听起来像是你在寻找的吗?我认为你不允许从一个集合中删除一个元素并将其插入到另一个集合中。我在寻找这个-“如果有一个恒定的空间限制(这似乎是最可能的情况),我不认为你能做得比二次更好。”我认为引用的语句是正确的,因为我需要在使用removeAndAppend之前进行一些处理(一些排序逻辑)。。N个元素上的removeAndAppend肯定是线性时间。。我们能证明二次型是我们能得到的最好的吗。。?我不擅长这一点:(没有O(n)空间,我无法进行合并排序..我希望在适当的位置..或在最恒定的空间..但我得到了描述的想法..tnx我们正在重用与输入相同的空间,因此它应该分类为O(1)额外空间(这通常是我们定义空间复杂性的方式)。