【发布时间】:2010-10-16 10:09:50
【问题描述】:
我看到这个术语“O(1) 访问时间”曾经表示“快速”,但我不明白它是什么意思。我在同一上下文中看到的另一个术语是“O(n) 访问时间”。有人可以简单解释一下这些术语的含义吗?
另见
【问题讨论】:
-
这可能会有所帮助:stackoverflow.com/questions/471199/…
标签: big-o
我看到这个术语“O(1) 访问时间”曾经表示“快速”,但我不明白它是什么意思。我在同一上下文中看到的另一个术语是“O(n) 访问时间”。有人可以简单解释一下这些术语的含义吗?
另见
【问题讨论】:
标签: big-o
您将需要阅读复杂性顺序。
http://en.wikipedia.org/wiki/Big_O_notation
简而言之,O(1) 意味着它需要一个恒定的时间,比如 14 纳秒,或者无论集合中的数据量如何,都需要 3 分钟。
O(n) 意味着它所花费的时间与集合的大小成线性关系,因此两倍大小的集合将花费两倍的时间。您可能不想将一百万个对象放入其中之一。
【讨论】:
int main() { int n; cin >> n; if(n == 0) { sleep(60 * 60 * 24 * 365); } cout << n; } 是 O(1)。
从本质上讲,这意味着无论您的收藏中有少量物品还是非常多(在您的硬件限制范围内),在您的收藏中查找一个值都需要相同的时间
O(n) 意味着查找一个项目所需的时间与集合中的项目数成正比。
其中的典型示例是可以直接访问的数组(无论其大小)和链表(必须从头开始按顺序遍历才能访问给定项目)。
通常讨论的另一个操作是插入。一个集合可以是 O(1) 的访问,但 O(n) 的插入。事实上,数组也有这种行为,因为要在中间插入一个项目,您必须通过将每个项目复制到下一个插槽中来将其向右移动。
【讨论】:
O(1) 表示访问某物的时间与集合中的项目数无关。
O(N) 意味着访问一个项目的时间与集合中项目的数量 (N) 成正比。
【讨论】:
当前对此问题的每个答案都告诉您O(1) 表示恒定时间(无论测量时发生什么;可能是运行时间、操作次数等)。这不准确。
说运行时是O(1) 意味着有一个常数c 使得运行时以c 为界,与输入无关。例如,返回n 整数数组的第一个元素是O(1):
int firstElement(int *a, int n) {
return a[0];
}
但是这个函数也是O(1):
int identity(int i) {
if(i == 0) {
sleep(60 * 60 * 24 * 365);
}
return i;
}
这里的运行时间以 1 年为界,但大多数时间运行时间为纳秒级。
说运行时间是O(n) 意味着有一个常数c 使得运行时间以c * n 为界,其中n 测量输入的大小。例如,通过以下算法在n 整数的未排序数组中查找特定整数的出现次数为O(n):
int count(int *a, int n, int item) {
int c = 0;
for(int i = 0; i < n; i++) {
if(a[i] == item) c++;
}
return c;
}
这是因为我们必须遍历数组,一次检查每个元素。
【讨论】:
O(1) 不一定意味着“快速”。这意味着它所花费的时间是恒定的,并且不是基于函数输入的大小。常数可以是快的或慢的。 O(n) 意味着函数所花费的时间将与函数输入的大小成正比变化,用 n 表示。同样,它可能快也可能慢,但随着 n 大小的增加,它会变慢。
【讨论】:
这是一个简单的类比; 假设您正在在线下载电影,O(1),如果下载一部电影需要 5 分钟,那么下载 20 部电影仍然需要相同的时间。因此,无论您下载多少部电影,无论是一部电影还是 20 部电影,它们都将花费相同的时间(5 分钟)。这种类比的一个典型例子是,当你去一个电影库时,无论你是拍一部电影还是五部电影,你都会立即选择它们。因此花费相同的时间。
但是,对于 O(n),如果下载一部电影需要 5 分钟,那么下载 10 部电影大约需要 50 分钟。所以时间不是恒定的,或者与您正在下载的电影数量成正比。
【讨论】:
称为Big O notation,描述各种算法的搜索时间。
O(1) 意味着最坏情况下的运行时间是恒定的。在大多数情况下,这意味着您实际上不需要搜索集合,您可以立即找到您要搜索的内容。
【讨论】:
“大 O 表示法”是表达算法速度的一种方式。 n 是算法正在处理的数据量。 O(1) 表示不管有多少数据,它都会在恒定时间内执行。 O(n) 表示与数据量成正比。
【讨论】:
O(1) 总是在同一时间执行,而不管数据集 n。
O(1) 的一个示例是 ArrayList 使用索引访问其元素。
O(n)也称为Linear Order,性能会线性增长,与输入数据的大小成正比。
O(n) 的一个示例是在随机位置插入和删除 ArrayList。由于随后在随机位置的每次插入/删除都会导致 ArrayList 中的元素向其内部数组左移以保持其线性结构,更不用说创建新数组和从旧数组复制元素到新的阵列,这会占用昂贵的处理时间,从而损害性能。
【讨论】:
基本上,O(1) 意味着它的计算时间是恒定的,而 O(n) 意味着它将线性地依赖于输入的大小 - 即循环遍历一个数组有 O(n) -只是循环 - 因为它取决于项目的数量,而计算到普通数字之间的最大值有 O(1)。
维基百科也可能有帮助:http://en.wikipedia.org/wiki/Computational_complexity_theory
【讨论】:
区分 O(1) 和 O(n) 最简单的方法是比较数组和列表。
对于数组,如果你有正确的索引值,你可以立即访问数据。 (如果你不知道索引并且必须循环遍历数组,那么它将不再是 O(1))
对于列表,无论你是否知道索引,你总是需要循环遍历它。
【讨论】:
这意味着访问时间是恒定的。无论您是从 100 条记录还是 100,000 条记录中访问,检索时间都是相同的。
相比之下,O(n) 访问时间表明检索时间与您正在访问的记录数成正比。
【讨论】:
这意味着访问需要恒定的时间,即不依赖于数据集的大小。 O(n) 意味着访问将线性地取决于数据集的大小。
O 也称为大 O。
【讨论】:
算法简介:Cormen、Leiserson、Rivest 和 Stein 的第二版在第 44 页上说
因为任何常数都是0度 多项式,我们可以表示任何 常数函数为 Theta(n^0),或 θ(1)。后一种表示法是 然而,轻微的滥用,因为它是 不清楚什么变量趋于 无穷。我们会经常使用 符号 Theta(1) 表示任一 常数或常数函数 关于一些变量。 ... 我们 表示为 O(g(n))... 的集合 函数 f(n) 使得存在 正常数 c 和 n0 使得 0 = n0。 ...请注意 f(n) = Theta(g(n)) 意味着 f(n) = O(g(n)),因为 Theta 记法比 O 记法强。
如果一个算法在 O(1) 时间内运行,这意味着渐近不依赖于任何变量,这意味着至少存在一个正常数,当乘以 1 时大于渐近复杂度(~runtime)对于 n 值高于一定数量的函数。从技术上讲,它是 O(n^0) 时间。
【讨论】:
O(1) 表示随机访问。在任何随机存取存储器中,访问任何位置的任何元素所花费的时间都是相同的。这里的时间可以是任何整数,但唯一要记住的是在第 (n-1) 个或第 n 个位置检索元素所花费的时间将是相同的(即常数)。
而 O(n) 取决于 n 的大小。
【讨论】:
在我看来,
O(1) 表示一次执行一个操作或指令的时间是一个,在算法的时间复杂度分析中为最佳情况。
【讨论】: