我已经看到过这个术语“ O(1)访问时间”曾经表示“快速”,但是我不明白它的含义。我在同一上下文中看到的另一个术语是“ O(n)访问时间”。有人可以用简单的方式解释这些术语的含义吗?
也可以看看
我已经看到过这个术语“ O(1)访问时间”曾经表示“快速”,但是我不明白它的含义。我在同一上下文中看到的另一个术语是“ O(n)访问时间”。有人可以用简单的方式解释这些术语的含义吗?
也可以看看
Answers:
您将要阅读复杂性顺序。
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; }
is O(1)
。
当前回答该问题的每个答案都告诉您,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)表示其将线性地取决于输入的大小-即遍历数组具有O(n)-只是循环-,因为它取决于数量项,同时计算到普通数之间的最大值为O(1)。
维基百科也可能有所帮助:http : //en.wikipedia.org/wiki/Computational_complexity_theory
算法简介:Cormen,Leiserson,Rivest&Stein撰写的第二版在第44页上说:
由于任何常数都是0度多项式,因此我们可以将任何常数函数表示为Theta(n ^ 0)或Theta(1)。后一种表示法是次要的滥用,因为尚不清楚哪个变量趋于无穷大。我们将经常使用符号Theta(1)来表示某个变量的常数或常数函数。...我们用O(g(n))表示...函数f(n)的集合,使得存在正常数c和n0,使得0 <= f(n)<= c * g(n)对于所有n> = n0。...请注意,f(n)= Theta(g(n))意味着f(n)= O(g(n)),因为Theta表示法比O表示法更强。
如果算法以O(1)的时间运行,则意味着渐近不依赖于任何变量,这意味着存在至少一个正常数,乘以1大于该函数的渐近复杂度(〜运行时)对于大于一定数量的n值。从技术上讲,这是O(n ^ 0)时间。