证明存在10个交换的O(n)算法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了证明存在10个交换的O(n)算法相关的知识,希望对你有一定的参考价值。
一个著名的问题是找到用于对数组进行排序的最小交换量。我的问题是,我们有大小为n的数组,我们知道可以用10个交换对它进行排序(我们不知道移动数,仅知道移动数)。我想证明存在一个O(n)算法(用于时间)对该数组进行排序。
首先,为了证明这一说法,我应该提供一些代码?我不知道怎么证明其次,这是否与对数组进行排序的最小交换量有关?
感谢您的帮助
答案
如果知道10个交换就足以对一个数组进行排序,则该数组几乎被排序,最多10 * 2 = 20个元素乱序。因此,如果我们找到在几乎排序的数组上具有O(n)的排序算法,则足以证明您的陈述。
例如,我们可以使用两步解决方案:
找到数组中所有乱序的元素,删除并保存它们
将保存的元素插入结果数组中的正确位置
使用这种“幼稚”算法,在最坏的情况下,第一步将花费一遍,而第二步则需要花费20次或更少的次数(20个无序元素)。因此,如果n >> 10
比您得到O(n)的话。如果不依赖于n
另一答案
您的解决方案在Adaptive sorts algorithms中。
自适应排序算法的经典示例是直插入排序。在这种排序算法中,我们从左到右扫描输入,重复查找当前项目的位置,并将其插入到先前已排序项目的数组中。
我们知道:
此算法的性能可以用输入中的反转次数来描述,然后
T(n)
大约等于I(A)+(n-1)
,其中I(A)
是反转次数。
因此,根据您的情况,反转次数是恒定的,此算法的复杂度将为Theta(n)
。
以上是关于证明存在10个交换的O(n)算法的主要内容,如果未能解决你的问题,请参考以下文章