Algorithm 是O(1/2 X对数N)=O(对数N)

Algorithm 是O(1/2 X对数N)=O(对数N),algorithm,math,big-o,Algorithm,Math,Big O,假设我有一个内存需求为logN+1的算法,其中N是问题的大小(要处理的位数)。我提出了第二个版本,将内存需求减少到(logN)/2+1。我了解到,在Big-O分析中,常量被忽略,因此两个算法版本的复杂性都是O(logN) 现在,如果我计算使用第二版算法保存的内存,我得到 在N=M(N)=1-[(logN)/2+1]/[logN+1]时保存的内存 林恩→∞ M(N)=1/2 这表明,渐近地,我将始终节省50%的内存。我很困惑为什么我不能在Big-O分析中看到这一收益 我的第二个问题是:如果我对Bi

假设我有一个内存需求为logN+1的算法,其中N是问题的大小(要处理的位数)。我提出了第二个版本,将内存需求减少到(logN)/2+1。我了解到,在Big-O分析中,常量被忽略,因此两个算法版本的复杂性都是O(logN)

现在,如果我计算使用第二版算法保存的内存,我得到

在N=M(N)=1-[(logN)/2+1]/[logN+1]时保存的内存
林恩→∞ M(N)=1/2

这表明,渐近地,我将始终节省50%的内存。我很困惑为什么我不能在Big-O分析中看到这一收益


我的第二个问题是:如果我对Big-O表示法的理解是错误的,那么突出显示算法第二版中保存的内存的正确方法是什么?

记住Big-O表示法不包括常数因子。函数f(n)=n和g(n)=10100n都是O(n),尽管f(n)是一个比g(n)小得多的函数

您的分析是正确的-如果您可以使空间使用率(logn)/2-1,那么您将(在限制内)将所需的内存量减半。然而,这不会出现在big-O分析中,因为big-O忽略了常数因子。正如在其他一些答案中提到的,big-O表示法捕捉长期增长率,尽管常数可能会告诉您更多关于所使用空间的绝对数量,但常数并不控制空间使用的长期增长率

如果你想做更精确的分析,你可以给出前后准确的内存使用情况,然后说你已经减少了50%的内存使用。许多关于算法和数据结构的论文实际上包含了常数因子,并提到它们得到了常数加速。例如,该算法和高斯消去法都给出了求解线性系统的O(n3)算法,但当可以使用Cholesky分解时,它的运算量减少了约50%。涵盖这些主题的大多数教科书都会提到,尽管两种算法都是O(n3),但如果可以使用,前者比后者更可取


希望这有帮助

Big-O不考虑常数因子。这只是一个衡量算法规模的指标,所以任何与logn成比例增长的东西都是O(logn)。这是一个相对的衡量标准,比如说两个人的工资上涨了10%,尽管一个人的工资从10000涨到12000,另一个人的工资从1000000涨到1200000。如果你被告知某人的工资每年增长10%,你就不会期望知道他们的总工资是多少,所以如果你知道一个算法的总成本增长了O(logn),就不要期望知道它的总成本


如果算法的第二个版本使用了一半的内存,但具有相同的缩放行为,那么简单地说它使用了一半的内存。

Big-O在确定算法或实现的缩放方式时非常有用。常数的改进(在您的示例中是一半)仍然有用,但当问题规模增加一个数量级时,它们几乎没有效果。

Big-O完全是关于可伸缩性的,您没有改变这一点。不要认为Big-O是性能的唯一衡量标准。这不是故意的。谢谢你的回答。我刚刚意识到,即使是适度的N=32k,M(N)=.45,这也足以让我吹嘘。谢谢皮特。我想我应该在我的文章中只提到有限N性能。