大O分析的算法

时间:2009-02-23 07:39:00

标签: algorithm complexity-theory time-complexity space-efficiency

你们发现所有算法都具有惊人的(艰难的,奇怪的)复杂性分析 - 得出的O符号和分析方式的独特性?

6 个答案:

答案 0 :(得分:15)

我有(很)一些例子:

  • union-find数据结构,支持(摊销)逆Ackermann时间的操作。它特别好,因为数据结构非常容易编码。
  • Splay trees,它们是自我平衡的二叉树(也就是说,除了BST之外没有存储额外的信息 - 没有红/黑信息。Amortized analysis基本上被发明用来证明展开的界限树木;展开的树木以摊销的对数时间运行,但是最差的线性时间。证明很酷。
  • Fibonacci heaps,它以分摊的常量时间执行大多数优先级队列操作,从而改善了Dijkstra's algorithm的运行时间和其他问题。与splay树一样,有一些光滑的“潜在功能”证明。
  • Bernard Chazelle用线性时间逆阿克曼时间计算最小生成树的算法。该算法使用soft heaps,这是传统priority queue的变体,但可能会发生某些“损坏”,并且可能无法正确回答查询。
  • 关于MST的主题:最佳算法是given by Pettie and Ramachandran,但我们不知道运行时间!
  • 许多随机算法都有兴趣进行分析。我只提一个例子:Delaunay三角剖分可以通过incrementally adding points在预期的O(n log n)时间内计算出来;尽管我还没有看到它,但分析显然是错综复杂的。
  • 使用“比特技巧”的算法可以很整洁,例如sorting in O(n log log n)时间(和线性空间) - 这是正确的,它通过使用的不仅仅是比较来打破O(n log n)障碍。
  • Cache-oblivious algorithms经常有趣的分析。例如,cache-oblivious priority queues(参见第3页)使用log log n级别的大小n,n 2/3 ,n 4/9 ,依此类推。
  • (静态)范围 - 数组上的最小查询是整齐的。 standard proof测试你对减少的限制:范围最小查询减少到树中最不常见的祖先,而这又减少到特定中的范围最小查询阵列。最后一步也使用了一个可爱的技巧。

答案 1 :(得分:2)

答案 2 :(得分:2)

这个有点简单,但梳子排序让我大吃一惊。

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

这是一个如此简单的算法,它大部分读起来都像一个过于复杂的冒泡排序,但它是O(n * Log [n])。我发现这有点令人印象深刻。

快速傅里叶变换的过多算法也令人印象深刻,证明它们有效性的数学是有趣的,尝试自己证明一些很有趣。

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

我可以相当容易地理解素数基数,多个素数基数和混合基数算法,但是对于大小为素数的集合而言,它非常酷。

答案 3 :(得分:2)

2D有序搜索分析非常有趣。你有一个二维数字数组NxN,其中每一行都是从左到右排序的,每一列都是从上到下排序的。任务是在数组中查找特定数字。

递归算法:选中中间的元素,与目标数比较,丢弃四分之一的数组(取决于比较的结果),递归地应用于Stillig 3季度是非常有趣的分析。 / p>

答案 4 :(得分:1)

非确定性多项式复杂性得到了我的投票,尤其是(可以认为不太可能)可能与多项式相同的可能性。同样,任何理论上都可以从量子计算中受益的东西(N.B.这个集合绝不是所有算法)。

另一个得到我投票的将是对任意精度数字的常见数学运算 - 这是你必须考虑的事情,比如乘以大数字比乘以小数字更贵。在Knuth中有很多这方面的分析(对任何人来说都不应该是新闻)。 Karatsuba的方法非常简洁:将两个因子分成两半(A1; A2)(B1; B2)并分别乘以A1 B1,A1 B2,A2 B1,A2 B2,然后合并结果。如果需要递归...

答案 5 :(得分:0)

Shell排序。有大量的变种有不同的增量,除了制作complexity analysis simpler之外,其中大部分没有任何好处。