我已经看到这个术语“O(1)访问时间”曾经意味着“快速”,但我不明白这意味着什么。我在同一个上下文中看到的另一个术语是“O(n)访问时间”。有人可以用简单的方式解释这些术语的含义吗?
另见
答案 0 :(得分:139)
您将要阅读有关复杂性的订单。
http://en.wikipedia.org/wiki/Big_O_notation
简而言之,O(1)意味着它需要一个恒定的时间,如14纳秒或三分钟,无论集合中的数据量如何。
O(n)表示它需要一定的时间量与集合的大小成线性关系,因此设置两倍的集合将花费两倍的时间。您可能不希望将一百万个对象放入其中一个。
答案 1 :(得分:31)
从本质上讲,这意味着无论您的集合中有少量项目还是非常多(在硬件限制范围内),在集合中查找值都需要相同的时间
O(n)意味着查找项目所花费的时间与集合中的项目数量成正比。
这些数组的典型示例是可以直接访问的数组,无论其大小如何,以及链接列表,必须从头开始按顺序遍历访问给定项目。
通常讨论的其他操作是插入。集合可以是O(1)用于访问,但O(n)用于插入。事实上,数组具有这种行为,因为要在中间插入一个项目,您必须将每个项目移动到右侧,方法是将其复制到下一个插槽中。
答案 2 :(得分:17)
目前回答此问题的每个答案都告诉您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;
}
这是因为我们必须遍历数组,一次检查一个元素。
答案 3 :(得分:14)
O(1)表示访问内容的时间与集合中的项目数无关。
O(N)意味着访问项目的时间与集合中项目的数量(N)成比例。
答案 4 :(得分:13)
O(1)并不一定意味着“快速”。这意味着它所花费的时间是恒定的,并且不基于函数输入的大小。常数可以快或慢。 O(n)表示函数所用的时间将与函数输入的大小成正比变化,用n表示。同样,它可能快或慢,但随着n的大小增加它会变慢。
答案 5 :(得分:8)
它被称为Big O notation,描述了各种算法的搜索时间。
O(1)表示最坏情况下的运行时间是恒定的。在大多数情况下,这意味着你不需要搜索该系列,你可以立即找到你正在寻找的东西。
答案 6 :(得分:4)
“Big O表示法”是表达算法速度的一种方式。 n
是算法使用的数据量。 O(1)
意味着,无论有多少数据,它都会在恒定时间内执行。 O(n)
表示它与数据量成正比。
答案 7 :(得分:4)
O(1)
始终在同一时间执行。
O(1)的一个例子是使用索引访问其元素的ArrayList。
O(n)
也称为线性顺序,性能将线性增长,并与输入数据的大小成正比。
O(n)的一个例子是随机位置的ArrayList插入和删除。随机位置的每次后续插入/删除都会导致ArrayList中的元素向左移动其内部数组,以保持其线性结构,更不用说创建新数组和复制旧元素了。新阵列占用了昂贵的处理时间,从而损害了性能。
答案 8 :(得分:3)
基本上,O(1)表示其计算时间是常数,而O(n)表示它将依赖于线性输入的大小 - 即通过数组循环具有O(n) - 只是循环 - ,因为它取决于项目的数量,而计算普通数字之间的最大值有O(1)。
维基百科也可以提供帮助:http://en.wikipedia.org/wiki/Computational_complexity_theory
答案 9 :(得分:3)
区分O(1)和O(n)的最简单方法是比较数组和列表。
对于数组,如果您具有正确的索引值,则可以立即访问数据。 (如果你不知道索引并且必须循环遍历数组,那么它将不再是O(1))
对于列表,无论你是否知道索引,总是需要遍历它。
答案 10 :(得分:1)
这意味着访问时间是不变的。无论您是从100或100,000个记录访问,检索时间都是相同的。
相反,O(n)访问时间表示检索时间与您访问的记录数成正比。
答案 11 :(得分:1)
这意味着访问需要恒定的时间,即不依赖于数据集的大小。 O(n)表示访问将线性地取决于数据集的大小。
O也被称为big-O。
答案 12 :(得分:1)
算法导论:Cormen,Leiserson,Rivest&amp; Sons的第二版。斯坦因在第44页说
因为任何常数都是0度 多项式,我们可以表达任何 常数函数为Theta(n ^ 0),或 THETA(1)。后一种表示法是一种 然而,轻微的滥用,因为它是 不清楚什么变量趋于 无穷。我们经常使用 符号Theta(1)表示a 常数或常数函数 尊重一些变数。 ......我们 由O(g(n))表示......的集合 函数f(n)使得存在 正常数c和n0这样 对于所有n> 0 = 0,0 <= f(n)&lt; = c * g(n)。 ...注意f(n)= Theta(g(n)) 暗示f(n)= O(g(n)),因为Theta 符号比O符号更强。
如果算法在O(1)时间运行,则意味着渐近不依赖于任何变量,这意味着存在至少一个正常数,当乘以1大于渐近复杂度时(〜运行时)高于一定数量的n值的函数。从技术上讲,它是O(n ^ 0)时间。
答案 13 :(得分:0)
这是一个简单的比喻; 想象一下,您使用O(1)在线下载电影,如果花5分钟才能下载一部电影,那么仍然需要花费相同的时间来下载20部电影。因此,无论您要下载多少电影,无论是一部电影还是20部电影,它们都将花费相同的时间(5分钟)。这种类比的一个正常示例是,当您进入电影库时,无论是拍摄一部电影还是5部电影,您都只需立即选择它们。因此花费相同的时间。
但是,对于O(n),如果下载一部电影需要5分钟,那么下载10部电影大约需要50分钟。因此时间不是固定不变的,也不是与下载电影的数量成正比的。
答案 14 :(得分:-2)
O(1)表示随机访问。在任何随机存取存储器中,访问任何位置的任何元素所花费的时间是相同的。这里的时间可以是任何整数,但唯一要记住的是在第(n-1)或第n个位置检索元素的时间是相同的(即常数)。
而O(n)取决于n的大小。
答案 15 :(得分:-2)
根据我的观点,
O(1)表示一次执行一个操作或指令的时间是一个,在最佳情况下算法的时间复杂度分析。