这是我一直以来的疑问。例如,我有一个大小为n ^ 2的二维数组(n是行和列的数量)。假设我要打印二维数组的所有元素。当我针对n计算算法的时间复杂度时,它是O(n ^ 2)。但是,如果我根据输入大小(n ^ 2)计算时间,则它是线性的。这些计算都正确吗?如果是这样,为什么人们对二维数组只在各处使用O(n ^ 2)?
答案 0 :(得分:0)
时间复杂度不是这样工作的。您不能那样做“简单数学”。
范围x
的二维正方形数组具有n = x*x
个元素。打印这些n
元素需要进行n
个操作(如果您一次打印n/m
个项目,则需要m
个操作,即O(N)
。必要的工作随元素的数量线性地增加(顺便说一下,就数组范围而言是二次方的-但是如果在4维数组中排列相同数量的项,是否会会有所不同吗?显然,不会。这并不是神奇的O(N^4)
)。
您所使用的时间复杂性不是那样的东西。您希望时间复杂度告诉您一个大概的想法,即如果您将输入数量增加到某个限制之外,则某些特定算法将如何改变其行为。
因此,您想知道的是,如果对一百万个项目或对两百万个项目进行XYZ处理,大约需要花费两倍的时间,或者例如,大约需要十六倍的时间。
时间复杂度分析与“小细节”无关,例如实际操作需要花费多少时间。由于恒定因素(例如内存等待时间或总线等待时间,高速缓存未命中,故障,访问时间等)起着越来越重要的作用,这往往使整个事情在现代体系结构中变得越来越学术化,几乎没有用处。几十年来一直保持不变,而每一代新计算机的实际单步成本(指令吞吐量,ALU能力等)却不断下降。
实际上,愚蠢的,线性的,蛮力的方法比具有更好时间复杂性的“更好”的方法要快,只是因为恒定因素主导着一切。