当前位置: 首页 > 知识库问答 >
问题:

迭代合并排序时间复杂度(自底向上)

蓬野
2023-03-14

我在寻找时间复杂度方面遇到了问题。

  • 首先,谈到MergeSort中的外部FOR,我认为重复是(1 Sumation(from i=1, to sizeOfArray)(2*i)=1 (2 4 8 16 32... size),但我也认为我错了。
  • 我在测量内部FOR循环重复时也遇到了问题。

MergeSort(){//迭代版本(自下而上)

            for(int currentSize = 1; currentSize < length; currentSize *= 2)        {
                for(int low = 0; low < length - currentSize; low += 2*currentSize){

                    int mid = low + currentSize - 1;
                    //min() is used here so if low is very close to the end of the array, high doesn't take outOfBoundries Value.
                    int high = Math.min(low + currentSize*2 -1, length - 1);

                }
            }

}

合并(int低,int中,int高){

            // Copy both parts into the helper array
            for (int i = low; i <= high; i++) {
                    helper[i] = arrayForMergeSort[i];
            }

            int i = low;
            int j = middle + 1;
            int k = low;
            // Copy the smallest values from either the left or the right side back
            // to the original array
            while (i <= middle && j <= high) {
                    if (helper[i] <= helper[j]) {

                            arrayForMergeSort[k] = helper[i];
                            i++;
                    } else {

                            arrayForMergeSort[k] = helper[j];
                            j++;
                    }
                    k++;
            }
            // Copy the rest of the left side of the array into the target array
            while (i <= middle) {
                    arrayForMergeSort[k] = helper[i];
                    k++;
                    i++;
            }

    }

共有1个答案

袁骏祥
2023-03-14

对于外循环,迭代次数为ceil(log2(长度))。

对于内部循环,每次迭代要合并的运行数是ceil(长度/电流大小)或地板(长度电流大小-1)/电流大小)。如果这是偶数,那么最后一次运行的大小可能小于电流大小。如果这是奇数,那么最后一次运行没有要合并的运行,也可能小于currrentSize。我不确定有没有办法计算合并操作的总数,而不使用迭代来求和每次迭代的合并操作。

在“生产”版本的合并排序中,一次性分配与原始数组大小相同(或1/2)的工作数组,然后,合并的方向(原始到工作或工作到原始)随每个外部循环而改变。如果程序预先计算外部迭代的次数,并且它是奇数,则可以进行预传递,以在初始传递上就地交换元素,从而进行偶数次合并传递,排序后的数据最终在原始数组中。

 类似资料:
  • 我已经学习了递归快速排序,最佳情况需要O(nlogn),最坏情况需要O(n^2)。但我试图找到迭代快速排序的时间复杂度。我知道最好的情况是O(nlogn)和O(n^2)。但我不会为最好的情况辩护。我正在学习本教程 https://www.techiedelight.com/iterative-implementation-of-quicksort/ 假设我们有15个元素,使枢轴索引位置始终处于中间

  • 让我们以合并排序的实现为例 a) 这种合并排序的时间复杂度是。并行化(1)和(2)会带来实际收益吗?从理论上讲,在对它们进行并行化之后,似乎最终也会出现。但实际上我们能得到什么好处吗? b) 这种合并排序的空间复杂度是。但是,如果我选择使用链表执行就地合并排序(不确定是否可以合理地使用数组),空间复杂性是否会变得,因为您必须考虑递归堆栈帧大小?既然它不能超过64,我们能把当作常数吗?我可能在几个地

  • 所以我在理解为什么递归DFS和迭代DFS的时间复杂度相同时遇到了一些问题,也许有人能给我一个简单的解释? 提前谢了。

  • 我有一个关于计算时间复杂度的非常普遍的问题(大O符号)。当人们说QuickSort最差的时间复杂度是O(n^2)(每次都选择数组的第一个元素作为轴心,并且数组是反向排序的)时,他们考虑了哪个操作来获得O(n^2)?人们会计算if/else语句所做的比较吗?或者他们只计算其进行的互换的总数?一般来说,你如何知道计算大O符号需要计算哪些“步骤”。 我知道这是一个非常基本的问题,但我已经阅读了谷歌上几乎

  • 我在理解算法的时间复杂性方面有问题。 让我们举第一个例子,用这个算法在二叉搜索树中进行搜索: 那么,如何计算这个时间复杂度呢? null

  • 有人能帮我了解一下这个代码片段的时间和空间复杂性吗?请参考leetcode问题-单词中断II。给定一个非空字符串s和一个包含非空单词列表的字典单词dict,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。返回所有这些可能的句子。