Algorithm 为什么是奇偶分裂';更快';什么样的?

Algorithm 为什么是奇偶分裂';更快';什么样的?,algorithm,performance,big-o,mergesort,Algorithm,Performance,Big O,Mergesort,MergeSort是一种分而治之的算法,它将输入分成几个部分,并递归地求解这些部分 …拆分功能有几种方法。一种方法是从中间分开。这种方法有一些很好的特性,但是,我们将重点介绍一种速度稍快的方法:偶数-奇数分割。其思想是将每个偶数位置元素放在一个列表中,将每个奇数位置元素放在另一个列表中 这是直接从我的课堂讲稿。为什么奇偶分裂比阵列中间的快 我推测这与将列表传递到MergeSort并具有已经排序的质量有关,但我不能完全确定 有人能解释一下吗 编辑:我尝试在Python中运行以下内容 global

MergeSort是一种分而治之的算法,它将输入分成几个部分,并递归地求解这些部分

…拆分功能有几种方法。一种方法是从中间分开。这种方法有一些很好的特性,但是,我们将重点介绍一种速度稍快的方法:偶数-奇数分割。其思想是将每个偶数位置元素放在一个列表中,将每个奇数位置元素放在另一个列表中

这是直接从我的课堂讲稿。为什么奇偶分裂比阵列中间的快

我推测这与将列表传递到MergeSort并具有已经排序的质量有关,但我不能完全确定

有人能解释一下吗

编辑:我尝试在Python中运行以下内容

global K
K = []
for i in range (1, 100000):
    K.append(i)


def testMergeSort():
"""
testMergeSort shows the proper functionality for the
Merge Sort Algorithm implemented above.
"""

t = Timer("mergeSort([K])", "from __main__ import *")
print(t.timeit(1000000))

p = Timer("mergeSort2([K])", "from __main__ import *")
print(p.timeit(1000000))
(MergeSort是偶数-奇数MergeSort,MergeSort2从中间向下划分)

结果是:

0.771506746608

0.843161219237


我可以看出,它可能会更好,因为将它与替代元素分开意味着你不必知道输入要从多长时间开始——你只需将元素放入交替列表中,直到用完为止

此外,如果考虑到更好的并行处理,您还可以在完成第一个列表的迭代之前开始拆分结果列表


我应该补充一点,我不是这些方面的专家,它们只是我想到的东西…

输入列表越接近已排序的内容,运行时越低(这是因为
合并
过程不必移动
任何值,如果所有内容都已按正确顺序排列;它只执行O(n)比较。由于MergeSort递归地在拆分的每一半上调用自己,因此需要选择一个
split
函数,该函数增加列表结果的一半按排序顺序排列的可能性。如果列表大部分是排序的,则偶数-奇数拆分比中间拆分更有效。例如

MergeSort([2, 1, 4, 3, 5, 7])
会导致

Merge(MergeSort([2, 1, 4]), MergeSort([3, 5, 7]))
如果我们从中间拆分(注意,两个子列表都有排序错误),而如果我们进行偶数-奇数拆分,我们将得到

Merge(MergeSort([2, 4, 5]), MergeSort([1, 3, 7]))

这将导致两个已排序的列表(以及后续调用
MergeSort
的最佳情况性能)。但是,在不了解任何输入列表的情况下,拆分函数的选择不应渐进地影响运行时。

我怀疑您的实验中存在噪音。:)其中一些可能来自比较和交换,而不是实际移动列表中的任何元素,以避免缓存失效等

不管怎样,这里有一个关于这个的聊天:(是的,我确实在那里发布了一个类似的答案(完全公开))

维基百科的相关文章指出,合并排序是O(n log(n)),而奇偶合并排序是O(n log(n)^2)。奇偶当然“较慢”,但排序网络是静态的,因此您总是知道要执行的操作,并且(查看维基百科条目中的图形)注意到算法如何保持并行直到结束


当合并排序最终将2个列表合并在一起时,奇偶合并排序的8元素排序网络的最后比较仍然是独立的

我正在试图弄清楚,将已排序的子列表重新合并在一起时的优势是什么。。。这可能和算法的并行性有关吗?在合并两个排序的列表时询问是否意味着对列表进行一次迭代,所以在我看来是O(n)。不确定合并是否可以轻松并行。至于拆分,我不知道为什么分配两个子列表、迭代列表、将值移动到备用列表中、检查列表末尾是否比“shr 1”更快。如果这是你的课堂讲稿,为什么不直接问你的讲师?@不确定你讲稿中的引用在任何地方都没有说“数组”。你确定你不是在处理链表吗?链表的优点很明显?换句话说,偶数/奇数拆分可以在线执行,也可以离线执行。