Big O的注意力常数

时间:2011-10-20 22:58:12

标签: big-o

我对如何确定常数对找到大O很重要有点困惑。我知道我们应该忽略常数找到大O但是这个函数让我三思而行:

f(n): 5n + 8n log n + 3 000 000

我认为这是O(n log n)但是如果n从小值开始,f(n)将保持在3 000 000左右。所以我应该看看这些类型的函数,好像n非常大值?但是,如果我这样做,这是否真实,因为大多数代码都没有10 000个样本大小?

3 个答案:

答案 0 :(得分:2)

当你计算函数的Big-O时,你总是想要非常非常大的数字。当样本大小变为无穷大时(换句话说,当它变得非常大时),这可以帮助您确定函数的性能。

通常,在计算Big-O之后,您还需要查找n0数字。您可以将此n0数字视为引爆点。任何大于n0的数字函数的性能将等于Big-O。对于较小的数字,性能将由常数或函数中的其他因素决定。这就是为什么在评估函数的性能时单独使用Big-O是不够的(虽然这是你应该确定的第一件事)。在确定Big-O之后,您应该对功能进行基准测试或计时并确定n0临界点,并确定您的功能在大多数时间内处理的样本大小或项目数。

有时您会编写可以在相对较小的数字组(例如10或100)上工作的函数,有时您的函数将被处理数百万或数十亿的数据。

答案 1 :(得分:2)

Big O表示法用于在参数增长到无穷大时找到限制行为。这就是你忽略常数的原因:随着n变得越来越大,它就会被淹没。

查看this question的答案(特别是得分最高的答案)以获取更多详情。

但是你已经遇到了无意识地追随Big O的一个局限:总有其他的考虑因素。你的常量实际上可能非常大(如你的情况),n的值总是很小(如你的情况),所以你的算法实际上是O(1)。但是,从技术上讲,它是O(n log n),因为你应该忽略常数。

答案 2 :(得分:0)

当数据大小/输入很小时,您应该考虑常量。但是,由于在开发这些算法时,不考虑上限,因此忽略常量。

例如:

两者:合并排序和快速排序是nlogn。但是快速排序有一个很小的常数因子,这就是为什么与合并排序相比,它对小输入的行为更快。