更快的算法在理论计算机科学中意味着什么?


18

如果针对某个问题A 有一个在时间运行的算法,而有人提出了一个在时间运行的算法,其中,它是否被认为是对先前算法的改进?O f n / g n g n = o f n O(f(n))O(f(n)/g(n))g(n)=o(f(n)

在理论计算机科学的背景下,提出这样的算法是否有意义?


4
“更快算法”是指“渐近更快算法”。
Yuval Filmus

@YuvalFilmus“渐近”是什么意思
未定义,

1
在时间。ØFñ
Yuval Filmus

Answers:


26

不,在时间运行的算法其中不一定被认为是一种改进。例如,假设和。那么是比差的时间界限。g n = o f n f n = n g n = 1 / n O f n / g n = O n 2O f nØFñ/GñGñ=ØFñFñ=ñGñ=1个/ñØFñ/Gñ=Øñ2ØFñ=Øñ

为了改进在时间运行的算法,您需要提出在时间运行的算法,即对于某些函数在时间中运行。o f n g n g n = o f n FñØFñGñGñ=ØFñ

如果你所知道的是,在时间的算法运行,那么它是不明确的算法,无论是在时间运行是一种进步,无论是。这是因为大O只是运行时间的上限。相反,它是常见的要考虑最坏情况下的时间复杂度,并把它作为评估一个大,而不是仅仅作为一个大。ø Ñ ˚F Ñ Ñ Θ ÔØFñØGñFñGñΘØ


21
在第一段中将可能会更好。使用递减函数会有点作弊。g(n)=1
David Richerby

1
@DavidRicherby:也许有点,但是OP从来没有说过他们有一个算法在运行,因此不能假定单调性。ØGñ
凯文(Kevin)

7
@Kevin当然可以,但是上下文是计算机科学,在计算机科学中,big-O表示法通常用于不递减的功能。质问者可能在用这些术语思考。
David Richerby

11

请记住,表示法是指用于分析的任务是如何成长为不同规模的投入,特别省去了乘法的因素,低阶项和常量。Ø

假设您有一个算法,其实际运行时间为1 n 2 + 2 n + 1(假设您实际上可以对指令进行计数并知道确切的时序等等,这在现代系统中无疑是一个巨大的假设)。然后,假设您提出了一个新算法,恰好是O n ,但是实际运行时间是1000 n + 5000。还要假设您知道使用此算法的软件永远不会看到n > 10的问题。Øñ21个ñ2+2ñ+1个Øñ1000ñ+5000ñ>10

那么,您会选择哪一种呢?算法将占用15000个单位时间,或者O n 2)算法仅将占用121个单位时间?现在,如果您的软件发展到可以处理n > 100000的问题,那么您会选择哪一个呢?如果您的问题大小相差很大,该怎么办?ØñØñ2ñ>100000


2
“永远不会看到n> 10的问题大小”-那么我们根本就不会使用O表示法,我们会...
AnoE

5
@AnoE为了简单起见,使用简单数字。无论您要分析的问题大小是10 vs 1e5,还是分析的是1e6 vs 1e9,都适用相同的逻辑。
twalberg '18

1
@AnoE大多数计算机程序都不会尝试处理无限增长的问题。因此,需要进行权衡。这就是big-O用于理论计算机科学的原因,并且可以将这些概念应用于改进实际程序。
mbomb007 '18

确实是@ mbomb007。问题标题是“更快的算法在理论计算机科学中意味着什么?” 他的内心深处是这样的:“在理论计算机科学的背景下,这有意义吗?”。
AnoE

@AnoE根据经验,当n始终小于10时,将使用O表示法!并不是说这是个好主意……但这完全是完成的事情!
Cort Ammon-恢复莫妮卡

5

通常,这意味着,对于任何足够大的输入大小,旧算法的最坏情况下运行时间都比新算法慢。这相当于形式主义,其中G ^是新算法的时间复杂˚F老的时间复杂度。GñØFñGF

但是,有时计算机科学家会关注平均情况下的性能。经典示例是Quicksort:最差情况下的运行时间为而我们知道其他运行时间为Θ n log n )的时间,但由于其平均情况下的良好运行时间而在实践中得到了广泛使用。此外,还可以对它进行调整,使其在野外最常见的情况下(例如,按正确顺序排列的数组)非常快地运行。Θñ2Θñ日志ñ

有时,即使是理论上的计算机科学家也像普通人一样使用“更快”的方法。例如,大多数String类的实现都具有“短字符串优化”(也称为“小字符串优化”),即使它只会加快短字符串的速度,而对于较长的字符串来说却是纯开销。随着输入大小变得越来越大,使用SSO的String操作的运行时间将以一个小的常数项增加,因此根据我在第一段中给出的定义,从String类中删除SSO使其“更快但是,实际上,大多数字符串都很小,因此SSO使得大多数使用它们的程序都可以更快地使用,并且大多数计算机科学教授比四处走动要了解的多,他们要求人们只谈论渐近时间复杂度的顺序。


1

对于“更快的算法”,没有统一的定义。没有管理机构来决定一种算法是否比另一种算法更快。

为了指出这是为什么,我想提供两种不同的情况来说明这个模糊的概念。

第一个示例是一种搜索无序数据链接列表的算法。如果我可以对数组执行相同的操作,那么对性能的Oh衡量标准就没有改变。两次搜索均为O(n)。如果我只看大哦的价值,我可能会说我根本没有改善。但是,众所周知,在大多数情况下,数组查找比在链表中查找要快,因此即使大的Oh并没有改变,也可以认为这使算法“更快”。

如果我可以使用对机器人进行编程的传统示例来制作PBJ三明治,我可以用另一种方式说明我的意思。考虑一下打开花生酱一瓶的那一点。

Pick up the jar
Grab the lid
Unscrew the lid

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

即使在我能想到的最学术的理论环境中,您也会发现,即使大的Oh记法结果相同,人们仍然接受第一种算法比第二种算法更快。

相比之下,我们可以考虑一种破解RSA加密的算法。目前,人们认为这个过程可能是O(2 ^ n),其中n是位数。考虑一个新算法,其运行速度快n ^ 100,这意味着我的新进程以O(2 ^ n / n ^ 100)运行。但是,在密码学领域,传统上根本不认为将多项式加速到指数算法是理论上的加速。在进行安全性证明时,假设攻击者可能会发现其中一种提速,并且不会起作用。

因此,在一种情况下,我们可以将O(n)更改为O(n),然后更快地调用它。在不同的情况下,我们可以将O(2 ^ n)更改为O(2 ^ n / n ^ 100),并声称根本没有有意义的加速。这就是为什么我说对“更快的算法”没有统一的定义。它始终取决于上下文。


1

我无法发表评论,但是我觉得当前的答案虽然正确且内容丰富,但并未解决部分问题。首先,让我们写出的表达式相当于A(n)O(f(n))

 0cf< lim supnA(n)f(n)=cf

现在,让我们假设我们正在谈论的任意增加功能其中LIM SUP ñ →交通 g ^ ñ = ,让我们创建函数^ h ñ = ˚F ñ g(nlim supñGñ=Hñ=FñGñ

我们得到“改进的”算法的运行时间在O h n )中。假设原始算法A n 的运行时间也以O h n )表示。可以这样写。一种ñØHñ一种ñØHñ

 0CH< lim supñ一种ñHñ=CH

使用限制规则,我们还可以编写:

CH=lim supñ一种ñHñ=lim supñ一种ñGñFñ=CFlim supñGñ

由于,因此仅当c f = 0时才成立。CH<CF=0

该对换句的语句是:如果,则Ñ Ô ħ Ñ CF0一种ñØHñ

在词语,是上的“改善” Ñ 的附加条件下即Ñ &Element; Θ ˚F Ñ Ñ 被任意地增加。一种ñ一种ñ一种ñΘFñGñ

一种ñØFñ一种ñ一种ñØHñ


1
您的限额应为高级限额。
Yuval Filmus

1
@YuvalFilmus更新
Jared Goguen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.