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

如何操作插入排序以始终在最复杂的情况下运行

郎华皓
2023-03-14

下面的伪代码:

function INSERTIONSORT(A[0..n − 1])
for i ← 1 to n − 1 do
     j ← i − 1
     while j ≥ 0 and HASH(A, j + 1) < HASH(A, j) do
          SWAP(A[j + 1], A[j])
          j ← j − 1

我知道插入排序的最坏情况复杂度是O(N2),但是如果使hash(A,j+1)返回一个始终小于hash(A,j)的整数,从而使while循环运行到其最大循环量,那么是否会实现O(N2)的时间复杂度?

共有1个答案

孟英叡
2023-03-14

我认为最后一个问题是“这会实现O(N2)的时间复杂度吗?”它本身是错误的。
它显然实现了O(n2)的时间复杂度,怎么可能呢?

如果您希望始终在最坏情况下工作,那么除了O(N2)之外,您基本上还希望确保O(N2),即您希望修复一个等于上限的下限。

无论如何,答案仍然是肯定的:mading散列(A,j+1)返回一个始终小于散列(A,j)的整数,您可以确保内部循环始终运行i次。因此,对于任何执行,您都将执行1+...+(n-1),这是二次(上下)有界的。

 类似资料:
  • 我想展示Quicksort空间复杂性的最坏情况。 我在想它,快速排序不使用辅助数组,它只是在分区子程序上创建一些辅助变量,但它只是操作数组中的项目。所以,很明显,我的结论是它使用了O(n)空间。 但我在网上搜索发现,Quicksort在最坏情况下的空间复杂度为O(logn)。 我只是不明白为什么在最坏的情况下,它比输入数组占用的空间更少? ps:我在看《算法导论》这本书。 我已经尝试的是计算算法中

  • 我想为android构建一个计算器应用程序,为此我需要一个解析器来转换要求解的字符串表达式。现在Java和Kotlin不支持eval函数,仅仅为了一个操作而导入javascript引擎可能会让我面临各种漏洞。所以我做了自己的计算器解析器。现在它工作得很好,除了crash中的负数外,所有算术运算都工作得很好。我确实知道问题是什么,因为我使用数学符号分隔字符串,但我不能在负值中执行任何操作。 输入:-

  • 因为最坏情况下的快速排序复杂度为O(n^2) 在递增顺序的情况下,当pivot选择第一个或最后一个元素时,它给出了正确的最坏情况复杂度O(n^2),因为树的一个子元素总是空的 但是当枢轴选择中间时,我感到困惑?它将树分成两半,使其复杂性O(n.logn) 假设10 20 30 40 50 60 70枢轴=40 (10 20 30 ) 40 (50 60 70) 左侧枢轴20,右侧枢轴60 (10)

  • 我做了一些调查,得到了奇怪的结果。我的班级: java: 所有的包层都是简单的,以供测试。例如: 组织导入之前的Eclipse: 组织导入后的Eclipse: 组织导入前的NetBeans:

  • 问题内容: 我想在命令行上输入-T3来节省时间,因为我希望我能做的所有Maven构建都可以运行多线程。 Maven 3.3.9我用谷歌搜索,但没有发现任何有希望的东西,只是建议为命令行选择添加一个环境变量,并将其附加到命令行上的每个maven调用中。 这样,每次仍然需要手动步骤(输入环境变量的名称)来进行并行构建。 我想在mvn settings.xml文件中进行全局配置。 问题答案: 你不能配置