我有一个关于计算时间复杂度的非常普遍的问题(大O符号)。当人们说QuickSort最差的时间复杂度是O(n^2)(每次都选择数组的第一个元素作为轴心,并且数组是反向排序的)时,他们考虑了哪个操作来获得O(n^2)?人们会计算if/else语句所做的比较吗?或者他们只计算其进行的互换的总数?一般来说,你如何知道计算大O符号需要计算哪些“步骤”。
我知道这是一个非常基本的问题,但我已经阅读了谷歌上几乎所有的文章,但仍然没有弄清楚
为了补充其他人所说的话,我同意那些说你什么都算数的人,但如果我在大学里正确地回忆起我的算法课,与比较时间相比,交换开销通常是最小的,在某些情况下是0(如果所讨论的列表已经排序)。
例如。线性搜索的公式为
T= K * N / 2。
其中T是总时间;K是定义总计算时间的常数;N是列表中元素的数量。
平均而言,比较次数为 N/2。
但是我们可以将它改写为:
T=(K/2)*N
或重新定义K,
T = K * N。
这表明时间与N的大小成正比,这是我们真正关心的。随着N的显著增加,它成为唯一真正重要的东西。
另一方面,二叉搜索以对数方式增长(O log(N))。
它主要计算在可以增长的大小(n)上,因此对于快速排序数组,它是数组的大小。您需要访问数组的每个元素多少次?如果您只需要访问每个元素一次,那么它是O(n)以此类推…
随着n的增长而增长的温度变量/局部变量将被计算在内。当n增长时没有显著增长的其他变量可以算作常量:O(n)c=O(n
快速排序的最
坏情况 快速排序的最坏情况是数组反向排序、正常排序且所有元素相等。
了解大噢
说完了,让我们先了解一下什么是大噢。
当我们只有渐近上界时,我们使用O-表示法。对于给定的函数g(n),我们用O(g(n))表示函数集,O(g(n)) = { f(n):存在正c和no,
使得0
我们如何计算大-哦?< br> Big-Oh基本上意味着程序的复杂性如何随着输入大小而增加。
代码如下:
import java.util.*;
class QuickSort
{
static int partition(int A[],int p,int r)
{
int x = A[r];
int i=p-1;
for(int j=p;j<=r-1;j++)
{
if(A[j]<=x)
{
i++;
int t = A[i];
A[i] = A[j];
A[j] = t;
}
}
int temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;
}
static void quickSort(int A[],int p,int r)
{
if(p<r)
{
int q = partition(A,p,r);
quickSort(A,p,q-1);
quickSort(A,q+1,r);
}
}
public static void main(String[] args) {
int A[] = {5,9,2,7,6,3,8,4,1,0};
quickSort(A,0,9);
Arrays.stream(A).forEach(System.out::println);
}
}
考虑以下声明:
第一部分:
int x = A[r];
int i=p-1;
区块2:
if(A[j]<=x)
{
i++;
int t = A[i];
A[i] = A[j];
A[j] = t;
}
区块3:
int temp = A[i+1];
A[i+1] = A[r];
A[r] = temp;
return i+1;
区块 4:
if(p<r)
{
int q = partition(A,p,r);
quickSort(A,p,q-1);
quickSort(A,q+1,r);
}
假设每个语句都需要一个常量的时间 c。让我们计算每个块的计算次数。
第一块被执行2c次。第二块被执行5c次。口渴块执行4c次。
我们将其写成O(1 ),这意味着即使输入的大小不同,语句执行的次数也是相同的。所有2c、5c和4c都是O(1)。
但是,当我们在第二个块上添加循环时
for(int j=p;j<=r-1;j++)
{
if(A[j]<=x)
{
i++;
int t = A[i];
A[i] = A[j];
A[j] = t;
}
}
它运行n次(假设r-p等于n,输入的大小),即nO(1)次,即O(n)。但这不是每次都运行n次。因此,我们有平均情况O(log n),即至少遍历log(n)个元素。
我们现在确定分区运行O(n)或O(logn)。最后一个块是quickSort方法,定义为在O(n)中运行。我们可以将其视为一个运行n次的封闭for循环。因此,整个复杂度要么是O(n<sup>2
我已经学习了递归快速排序,最佳情况需要O(nlogn),最坏情况需要O(n^2)。但我试图找到迭代快速排序的时间复杂度。我知道最好的情况是O(nlogn)和O(n^2)。但我不会为最好的情况辩护。我正在学习本教程 https://www.techiedelight.com/iterative-implementation-of-quicksort/ 假设我们有15个元素,使枢轴索引位置始终处于中间
我必须找到在c程序中输入最佳情况的快速排序的时间复杂度
null
问题: 我必须分析时间复杂度来对几乎已排序的整数值列表进行排序(使用快速排序)。 我做了什么? 我读过SO Q1、SO Q2、SO Q3和这一本。 但是,我没有发现任何明确提到使用快速排序对k排序数组进行排序的时间复杂度的内容。 由于快速排序算法的时间复杂度取决于选择数据透视的策略,并且由于几乎排序了数据,因此有可能面临最坏情况,为了避免最坏情况,我使用了三个值(第一、中间、最后)的中位数作为这里
主要内容:时间复杂度,空间复杂度《 算法是什么》一节提到,解决一个问题的算法可能有多种,这种情况下,我们就必须对这些算法进行取舍,从中挑选出一个“最好”的。 算法本身是不分“好坏”的,所谓“最好”的算法,指的是最适合当前场景的算法。挑选算法时,主要考虑以下两方面因素: 执行效率:根据算法所编写的程序,执行时间越短,执行效率就越高; 占用的内存空间:不同算法编写出的程序,运行时占用的内存空间也不相同。如果实际场景中仅能使用少量的内
让我们以合并排序的实现为例 a) 这种合并排序的时间复杂度是。并行化(1)和(2)会带来实际收益吗?从理论上讲,在对它们进行并行化之后,似乎最终也会出现。但实际上我们能得到什么好处吗? b) 这种合并排序的空间复杂度是。但是,如果我选择使用链表执行就地合并排序(不确定是否可以合理地使用数组),空间复杂性是否会变得,因为您必须考虑递归堆栈帧大小?既然它不能超过64,我们能把当作常数吗?我可能在几个地