复杂度 - 输入长度

Complexity - input length

我目前正在学习复杂性(或效率,不管你怎么称呼它),我在我得到的一本书中读到了它。 写了一些我觉得很无意义的东西,我需要一个解释。我试过在线查找,但我没有找到他们给出的这个特定示例的答案。

For an algorithm that gets the max number in a single-dimensional array the size of n the input length would be n.

"For an algorithm that gets the max number in a two-dimensional array the size of n*n the input length would still be n."

我不明白为什么输入长度在这两种情况下都是“n”,即使对于二维你必须通过 n*n 数字...... 它说

input length = the amount of work done ...

对我来说没有任何意义。 有人愿意解释一下吗?他们肯定不会在那里解释这个。

阅读评论说这本书是用希伯来语写的,我认为这个问题是翻译错误或校对中的其他错误。输入长度 "input length is the measurement that indicates the work load of an algorithm" 的注释中给出的定义与您认为该术语在英语中的含义完全不匹配。

为了回答有关复杂性的问题,他们在多个地方重复使用了变量 'n',这让人有些困惑。他们用'n'来描述数组的维度,来描述复杂度。 O(n) 仅仅意味着复杂度与输入呈线性关系。 O(n^2) 将是指数复杂度。在这种情况下,对于 n*n 元素的数组,输入是 n*n 或 n^2,但算法的复杂度仍然是 O(n)(或线性)。这是因为该算法仍然只对每个输入元素进行一次操作,无论输入是 n 还是 n*n。如果它对每个元素进行 2 次或 3 次操作,它仍然是线性的,因为 3n 和 n 都是线性函数(任何 x*n 都是线性的)。

希望对您有所帮助。

这是一个常见的误解(在 SO 上很常见),即扫描具有 n*n 个元素的二维数组的复杂性是 O(n^2)。不是,是O(n)。扫描是一种线性操作,一个元素接一个元素。

二维数组是客套的虚构,它实际上只是为了方便访问一维数组。毕竟,在正确实现数组的语言中(即 none 这个指向内存块的指针数组),二维数组只是一组相邻的内存位置。即使在将二维数组实现为指针数组的语言中,它们也只是带有中断的线性内存段

如果对 2D 数组的扫描是 O(n^2) 那么您可以通过忽略 2d-ness 并只扫描底层的 1d 内存块来神奇地将其转换为 O(n)

O(n^2) 描述了不同的操作复杂度 class,例如对输入中的每对元素进行操作的操作。

Big-O 表示法用于对算法类型(复杂性 类)进行分类,而不一定是 运行 实际需要多少时间。例如 O(cn) 就是 O(n),其中 c 是常数。

n 是输入的大小,无论该输入是一个 nxn 矩阵还是只是一个 'n' 长度数组。 big-O 'n' 和程序变量名指的不是同一件事。