Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 证明10次交换存在O(n)算法_Algorithm_Sorting_Swap - Fatal编程技术网

Algorithm 证明10次交换存在O(n)算法

Algorithm 证明10次交换存在O(n)算法,algorithm,sorting,swap,Algorithm,Sorting,Swap,一个著名的问题是找到排序数组的最小交换量。我的问题是我们有一个大小为n的数组,我们知道我们可以用10次交换对它进行排序(我们不知道移动次数,只知道移动次数)。我想证明存在一个O(n)算法(对于时间)对这个数组进行排序 首先,为了证明这些陈述,我应该提供一些代码吗?我不知道如何证明这一点 第二,这与排序数组的最小交换量有关吗 感谢您的帮助如果我们知道10次交换就足以对一个数组进行排序,那么该数组几乎已排序,最多有10*2=20个元素无序排列。所以,如果我们找到某种排序算法,它在几乎排序的数组上有O

一个著名的问题是找到排序数组的最小交换量。我的问题是我们有一个大小为n的数组,我们知道我们可以用10次交换对它进行排序(我们不知道移动次数,只知道移动次数)。我想证明存在一个O(n)算法(对于时间)对这个数组进行排序

首先,为了证明这些陈述,我应该提供一些代码吗?我不知道如何证明这一点 第二,这与排序数组的最小交换量有关吗


感谢您的帮助

如果我们知道10次交换就足以对一个数组进行排序,那么该数组几乎已排序,最多有10*2=20个元素无序排列。所以,如果我们找到某种排序算法,它在几乎排序的数组上有O(n),那么它就足以证明您的语句了

例如,我们可以使用两步解决方案:

  • 查找数组中的所有无序元素,删除并保存它们

  • 在结果数组中的正确位置插入保存的元素

  • 使用这种“朴素”算法,在最坏的情况下,第一步需要一次通过,第二步需要20次或更少的通过(20个无序元素)。因此,如果
    n>>10
    ,那么对于您的情况,它会得到O(n)。这个证明对于任何恒定数量的交换都是正确的,如果它不依赖于您的解决方案

    自适应排序算法的一个经典示例是直接插入排序。在这个排序算法中,我们从左到右扫描输入,反复查找当前项的位置,并将其插入到先前排序的项的数组中

    我们知道:

    该算法的性能可以用输入中的倒数来描述,然后
    T(n)
    将大致等于
    I(A)+(n-1)
    ,其中
    I(A)
    是倒数


    所以,在你的例子中,反演的数量是恒定的,这个算法的复杂度将是θ(n)

    O(n),在什么情况下?您的前提已经说明存在一种算法,可以将数组按10次交换进行排序。我猜,算法在比较次数上必须是O(n)?有内存限制吗?@trentcl O(n)代表时间。我忘了提它。没有内存约束提示:Timsort可以做到这一点。您将如何定义“无序”元素,以及您建议使用什么O(n)算法来检测此类元素?@MarkDickinson“无序”元素可以作为数组元素序列的一部分找到,而数组元素序列不需要按需排序。当我们遇到比上一个元素少的新元素时,我们知道这个元素或上一个元素是无序的。可能还有其他人在附近。只要不超过20个这样的元素,就不难前后检查以找到这种错误序列的边界。即使我们使用的元素比所需的多(例如,每次出现的所有20个相邻元素),复杂性也不会改变。