我更喜欢尽可能少的正式定义和简单的数学。
当前回答
测量软件程序的速度非常困难,当我们尝试时,答案可以非常复杂,并且充满了例外和特殊案例,这是一个很大的问题,因为所有这些例外和特殊案例都令人沮丧和无助,当我们想比较两个不同的程序,以确定哪个是“最快”。
好事:
邪恶的:
和那可怕的:
其他回答
算法例(Java):
public boolean search(/* for */Integer K,/* in */List</* of */Integer> L)
{
for(/* each */Integer i:/* in */L)
{
if(i == K)
{
return true;
}
}
return false;
}
算法描述:
这个算法搜索一个列表,项目按项目,寻找一个密钥,在列表中的每个项目,如果它是密钥,然后返回真实,如果循环没有找到密钥,返回虚假。
Big-O 评分代表了复杂性(时间、空间等)的顶端。
要找到 The Big-O on Time Complexity:
计算时间(考虑到输入大小)最糟糕的案例需要: 最糟糕的案例: 关键不在列表中 时间(Worst-Case) = 4n+1 时间: O(4n+1) = O(n) <unk>在大O,恒例被忽视 O(n) ~ 线性
还有大欧米加,它代表了最佳案例的复杂性:
最佳案例:关键是第一个项目 时间(最佳案例) = 4 时间: Ω(4) = O(1) ~ Instant\Constant
大 O 评分是描述一个算法的空间或运行时间的上限的一种方式. n 是问题的元素数量(即序列的尺寸,树上的节点数量等) 我们有兴趣描述运行时间,因为 n 变得大。
要说二进制搜索有运行时间的O(登录)是说有某些恒定的c,你可以增加登录(n)通过它将总是比运行时间的二进制搜索。
换句话说,g(n)是你的算法的运行时间,我们说g(n) = O(f(n))当g(n) <=c*f(n)当n > k,当c和k是某些恒定的。
O(n2):被称为四方复杂性
1 件: 1 件 10 件: 100 件 100 件: 10,000 件
请注意,物品的数量增加了10个因素,但时间增加了102个因素。
O(n):被称为线性复杂性
1 件: 1 操作 10 件: 10 操作 100 件: 100 操作
这一次,元素的数量增加了10个因素,所以时间n=10,所以O(n)的规模因素是10。
O(1):被称为恒久复杂性
1 件: 1 操作 10 件: 2 操作 100 件: 3 操作 1000 件: 4 操作 10,000 件: 5 操作
他们降低了数学,所以它可能不是准确的n2或他们说它是什么,但这将是规模的支配因素。
当我们有一个函数,如f(n) = n+3 和我们想知道图表看起来如何喜欢,当n接近无限时,我们只是放下所有的连续和较低的顺序术语,因为它们不在乎什么时候n变得大。
常规和较低的命令时间的简单落下,正是找到下方和上方的功能的过程。
根据定义,一个函数是另一个函数的下层或上层界限,如果您可以找到一个恒定的函数,以便为每个 n 的输出比原始函数更大(或较小)。
f(n) = n*C > f(n) = n+3
而且是的 C = 2 会这样做,因此我们的函数 f(n) = n 可以是我们函数 f(x) = x + 3 的顶部界限。
相同的下限:
f(n) = n*C < f(n) = n+3
C = 2 會這樣做
我不确定我正在进一步贡献这个主题,但我仍然认为我会分享:我曾经发现这个博客帖子有几个非常有用的(也许非常基本的)解释和例子关于Big O:
通过例子,这有助于在我的<unk>子像<unk>子一样的喉<unk>中获得细微的基本,所以我认为这是一个相当下载10分钟的阅读,让你走在正确的方向。
推荐文章
- 段树、区间树、二叉索引树和范围树之间有什么区别?
- 给定一个数字,找出下一个与原始数字具有完全相同的数字集的更高的数字
- HSL到RGB的颜色转换
- 使用Java在原语数组中查找最大/最小值
- 好的Java图算法库?
- foreach和map有区别吗?
- 什么时候我应该使用Kruskal而不是Prim(反之亦然)?
- 取一个集中在中心的随机数
- 如何计算圆周长上的一点?
- 从整数流中找到运行中位数
- 在日历应用程序中建模重复事件的最佳方法是什么?
- 在任何情况下,您更喜欢高大o时间复杂度算法而不是低大o时间复杂度算法吗?
- 如何使用JavaScript比较软件版本号?数量(只)
- 在常数平摊时间O(1)中将一个对象追加到R中的列表?
- 跳跃表vs.二叉搜索树