简单实用的确定性算法,运行时间复杂


18

很多时候,如果算法的运行时间是一个复杂的表达式,那么算法本身也是复杂且不切实际的。渐近运行时间中的每个立方根和因子都趋向于增加算法的复杂性,并且也为运行时间增加隐藏的常数因子。loglogn

我们是否有惊人的例子证明了这一经验法则失败了?

当然,即使碰巧具有非常简单的最坏情况运行时间,也很容易找到很难实现的算法示例。但是相反呢?

我们有非常简单实用的例子确定性算法,很容易实现,但碰巧有一个非常复杂的表达式作为其最坏情况渐近运行时间?

请注意关键字“确定性”和“最坏情况”;简单随机算法的分析很容易导致表达式复杂。

当然,“复杂”的问题取决于品味。无论如何,我宁愿看到一个过于丑陋的表达式,无法放入论文标题。而且我更喜欢一个自然参数(输入大小,节点数等)的复杂函数。


PS。我以为我不会把它当作“大问题”,而不是CW。我想找到一个出色的例子(如果有的话)。因此,仅当您认为它比到目前为止的任何答案“都更好”时,才发布另一个答案。


2
AKS素数测试算法是否可以作为答案?我有些犹豫,因为从某种意义上说,运行时间的“复杂性”是质数分布的伪随机性的结果……
arnab

我的感觉是,最坏的情况是在大多数情况下会导致“运行所有内容”,而所有内容都是我们用来衡量运行时的东西。因此,自然而然的是,简单的算法便具有简单的WC运行时。如果我们尝试通过一些技巧减少一点点,就会出现复杂的运行时。但是你的问题很有趣。我当然很好奇看到我的感觉是对的。
拉斐尔

@arnab:谢谢,AKS是个好主意。但是我不确定是否可以称之为“实用”?
Jukka Suomela

诸如调查传播,约束传播或顺序TRW之类的消息传递方案是否算作“算法”?易于实现,难以预测运行时间
Yaroslav Bulatov 2010年

糟糕,我一直喜欢Pollard的rho方法,它简单实用,而且分析起来确实很困难,但是该算法的随机性使其
无可奉告

Answers:


20

我能想到的最佳示例是一种算法(如下所述),用于计算平面中n条线的布置中的级,即由垂直上方恰好有k条线的点形成的折线。这不是已知的最有效的算法。有效率更高的算法,复杂性也更简单,但是我相信,这种算法比大多数(如果不是全部)算法更实用。该分析可能并不严格,因为它使用了k级复杂度,这是一个著名的开放问题(我认为分析中的所有其他术语都是严格的)。即便如此,我怀疑改进k级的界限是否会使运行时间简单得多。我假设k =knkkk写出的复杂度是 n的一个函数。k=n/2n

该算法基于线扫描范例,并使用两个动态锦标赛作为动力学优先级队列。当一条线高于或低于k级,将一条线从一个动力学比赛移动到另一个k时,将执行插入和删除操作。因此,有ø Ñ 4 / 3的插入和缺失(使用戴伊的开往ķ -电平的复杂性)。每个事件都在处理Ö 日志Ñ 的时间和有ø Ñ 4 / 3 α Ñ(logn)kO(n4/3)kO(logn)事件( α n 来自线段排列的上包络线的复杂度,而 log n / log log n来自log n -ary树的高度)。总运行时间为O(n4/3α(n)logn/loglogn)α(n)logn/loglogn(logn)

O(n4/3α(n)log2n/loglogn).

请查看Timothy Chan的手稿http://www.cs.uwaterloo.ca/~tmchan/lev2d_7_7_99_ps.gz了解更多详细信息和参考。的因子可以通过使用二进制(这一翻译的去除日志Ñ 进制)动力学比赛,但它实际上加快在我进行的试验的动力学优先级队列。如果使用动态堆而不是动态锦标赛(那么应该显示平方根内的对),那么复杂度就会变得更糟并且更糟(尽管该算法仍然实用)。1/loglogn(logn)log


很好的例子,谢谢!这将不容易被击败。:)
Jukka Suomela

1
该算法在实践中比随机算法要慢得多,后者很容易实现(因为有人实现了其中一种算法(请参阅我的论文“以平面布置行走”)。)
Sariel Har-Peled 2010年

我接受了这个答案,因为它似乎与我的想法最接近。但是,如果有人有任何新想法,我将很高兴听到!
Jukka Suomela

24

联合查找的数据结构操作似乎符合您的条件:

http://en.wikipedia.org/wiki/Disjoint-set_data_structure


2
确实,我发布了相同的答案,但是在发现您击败了我之后将其删除。:)一种非理论家甚至可能会发现的简单而优雅的算法,但逆阿克曼逆转了复杂性。
沃伦·舒迪

那么,时间不看说:“复杂的”,如果你把它比作Ø ñ 4 / 3 α ñ 登录2 ñ /日志记录ñ 在吉列尔梅的答案。:)O(α(n))O(n4/3α(n)log2n/loglogn)
Jukka Suomela 2010年

联合查找的算法长度与证明复杂度之比可能是无与伦比的-所有这三个操作是什么,九行代码?
Neel Krishnaswami

1
我认为问题不在于简单实用的算法,而且要进行复杂的分析。我认为问题在于运行时间复杂的简单实用算法,即为上限获得的实际表达式。
Guilherme D. da Fonseca 2010年

6

单纯形算法。易于实现且在实践中效果出色,但从理论上进行分析很麻烦。


是的,很难分析,但是是否有分析得出结论,Simplex的运行时间受的某个复杂函数限制?n
Jukka Suomela

实际上,通过Klee-Minty构造,已知单纯形在最坏的情况下要花费指数时间。我认为,这不是Jukka询问的一个示例
Suresh Venkat 2010年

1
也许我应该说单纯形方法而不是单纯形算法。Klee-Minty多维数据集及其变体适用于一些基本的枢轴规则。但是,例如,随机构面枢轴规则有一个疯狂的上限和下限。吉·凯莱(Gil Kalai)在最近的博客中发表了一篇不错的博客文章。gilkalai.wordpress.com/2010/11/09/...
莫希特·辛格

好点,莫希特。我也很困惑。
Suresh Venkat 2010年

2

我不确定您是否认为这是“实用的”,但这是一个著名的开放问题。保罗·埃尔多斯(Paul Erdos)关于Collat​​z猜想说:“数学尚未为解决此类问题做好准备”

x=1


这个算法解决了什么问题...?
Jukka Suomela

它建议寻找新颖的运行时分析技术。
Mohammad Al-Turkistany

2
然后,您可以说,强力搜索Collat​​z猜想的证明也激发了“新颖的运行时分析技术”;在这两种情况下,算法都只是在漫不经心地探索图。Collat​​z的猜想很有趣,但是我认为这不是“算法”的有趣示例。
Niel de Beaudrap 2010年

2

这个示例虽然没有满足您的要求,但可能会引起人们的兴趣,因为它具有某种精神上的亲和力。具体而言,是通过逆向对成堆的煎饼和燃烧的煎饼进行分类的问题。

http://en.wikipedia.org/wiki/Pancake_sorting

应用领域之一是计算生物学(遗传学),其中有关基因组重排的问题可以根据排列之间的距离进行排列,而排列之间的距离可以通过遵守各种规则的排列片段的反转来实现。

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.