我对如何确定常数对找到大O很重要有点困惑。我知道我们应该忽略常数找到大O但是这个函数让我三思而行:
f(n): 5n + 8n log n + 3 000 000
我认为这是O(n log n)但是如果n从小值开始,f(n)将保持在3 000 000左右。所以我应该看看这些类型的函数,好像n非常大值?但是,如果我这样做,这是否真实,因为大多数代码都没有10 000个样本大小?
答案 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
。但是快速排序有一个很小的常数因子,这就是为什么与合并排序相比,它对小输入的行为更快。