我在学校被问到这个问题:
如果时间复杂度为O(n ^ 2)的某种排序算法需要5秒 要对特定机器上的50条记录进行排序,需要多长时间 在同一台机器上排序500条记录?如果使用同一台机器 执行复杂度为O(n log n)的排序算法,需要多长时间 将1024条记录分类?
据我所知,问题第一部分的答案是50秒。 是这样吗?
答案 0 :(得分:0)
不,不这么认为。考虑一下这个函数是O(n ^ 2)的事实,这意味着时间复杂度(一些人认为“花费时间”)与传入输入项的输入项数量的 square 成正比。算法。您对50的回答将算法视为O(n)(如O(50)“=”5,则假设O(50 * 10)“=”5 * 10)。我不会给你答案,但关键是考虑O(n ^ 2)关系。
答案 1 :(得分:0)
要回答这个问题,您需要详细了解“时间复杂度O(n ^ 2)”的含义。
“时间复杂度O(n ^ 2)”的数学定义是基本操作的数量(在排序的情况下通常被视为项目移动和比较),对于足够大的n,由一些常数n ^ 2。根据这个定义,这两个部分的答案是不可能说,因为“足够大的n”可能不包括n = 50或n = 500,即使它确实如此,大O时间复杂度也是一个上限。
有一个非正式的定义,其中时间复杂度O(n ^ 2)意味着“大致与n ^ 2成比例”。然后第一部分显得有问题:500比50大10倍,因此运行时间将大100倍。第二部分仍然无法解决:两种不同算法的比例常数可能不同。
但即使有非正式定义,也存在一些不容忽视的问题。 “时间复杂度”通常可以表示最坏情况或平均情况,并且尺寸50的特定阵列可能不代表任一种,并且尺寸500的阵列可以是不同的。例如,冒泡排序具有最差和平均时间复杂度O(n ^ 2),但是如果您的大小为50的输入数组已经排序,则无法在大小为500的随机混洗数组上预测运行时。
应用于具体的排序算法,您可以看到问题。 Quicksort是O(n ^ 2)最坏情况,并且合并排序是O(n log n)最坏情况,因此可以针对这两种算法测试任何答案。如果您的快速排序需要5秒钟来排序50个项目,那么您估计需要多长时间才能对500个项目进行排序?肯定不是100倍,因为这将假设两个输入引起快速排序的最坏情况行为。同样,您估计合并排序需要多长时间才能对1024个项目进行排序?在实践中,它需要比quicksort更长的时间(这就是为什么quicksort变体比现实世界中的mergesort更受青睐)。
如果你想更深入,你可以说比较和项目移动不是计算机上的基本操作,因此没有从“时间复杂度”到“运行时”的简单翻译,因为“时间”具有不同的含义每。例如,如果要对字符串进行排序,则运行时将在很大程度上取决于字符串的长度。排序两个字符串数组需要多长时间?即使只有2个项目,排序也可以任意长,因为字符串可能是任意长的。
看起来如果你使用复杂性的非正式定义,那么你可以在问题的第一部分回答“500sec”(而第二部分总是无法回答)。但我希望我已经说服你,你需要忽略理论和现实问题来产生答案,而正确的答案是,除非你做出非常强烈的假设,否则你必须说你不能做出任何预测。鉴于问题中的信息。
答案 2 :(得分:0)
算法的时间复杂度为O(n ^ 2)。因此,时间与n ^ 2成正比。 让我们考虑一下 t = k * n ^ 2
其中k是比例常数。
现在通过把t = 5和n = 50来解决eqn
5 = k * 2500
K =500分之1
现在,对于任何n值,比例常数都是相同的。 因此,对于n = 500,将n = 500和k = 1/500,我们将得到
T =(1/500)* 500 * 500
T = 500
所以排序500条记录需要500秒。
对于第二个答案,上面计算的k的值将被使用 所以第二部分
吨= K 名词的日志(n)的
T =(1/500)* 1024 * 10
t = 20.048秒