我目前正在学习复杂性(或者你称之为效率),我在一本书中读到了它。 有些东西我觉得很无趣,我需要一个解释。我尝试过在线查看,但我找不到他们给出的这个例子的答案。
对于在一维数组中获取最大数量的算法,
capture.output
的大小为输入长度n
。"对于在二维数组中获取最大数量的算法,
n
的大小仍为n*n
。"
我不明白为什么输入长度是' n
'在这两种情况下,即使对于二维,你也必须通过n
数字......
它说
输入长度=完成的工作量......
对我没有任何意义。 有人愿意解释吗?他们肯定不会在那里解释这一点。
答案 0 :(得分:1)
这是一个常见的误解(在SO上很常见),扫描具有n*n
元素的2D数组的复杂性为O(n^2)
。不是,它是O(n)
。扫描是线性操作,一个接一个元素。
2D数组是一个礼貌的小说,它实际上只是访问一维数组的便利。毕竟,在正确实现数组的语言中(即没有这个指向存储器块的指针数组),2D数组只是一组相邻的存储器位置。即使在将2D数组实现为指针数组的语言中,它们也只是具有中断的线性内存段
如果扫描2D数组是O(n^2)
,那么你可以通过忽略2d-ness并只扫描底层的1d内存块来神奇地将其转换为O(n)
。
O(n^2)
描述了一种不同的复杂类操作,例如操作输入中每对元素的操作。
答案 1 :(得分:0)
在阅读本书以希伯来语撰写的评论中,我会认为该问题是翻译错误或校对中的其他错误。输入长度“输入长度是指示算法工作负荷的度量”的注释中给出的定义与您认为该术语在英语中的含义完全不符。
为了回答关于复杂性的问题,他们在多个地方重用变量'n',这使得它有点混乱。他们使用'n'来描述数组的维度并描述复杂性。 O(n)仅表示复杂度与输入呈线性关系。 O(n ^ 2)将是指数复杂性。在这种情况下,对于n * n个元素的数组,输入是n * n或n ^ 2,但算法的复杂性仍然是O(n)(或线性)。这是因为算法仍然只对每个输入元素进行一次操作,无论输入是n还是n * n。如果它操作一个元素2或3次为3n并且n都是线性函数(任何x * n将是线性的),它仍将是线性的。
我希望这会有所帮助。
答案 2 :(得分:0)
Big-O表示法用于对算法的类型(复杂性类)进行分类,而不一定是实际运行的时间。例如,O(cn)只是O(n),其中c是常数。
n是输入的大小,无论该输入是nxn矩阵还是只是'n'长度数组。 big-O'n'和程序变量名称并不是指同一件事。