我正在向一个朋友解释著名的确定性线性时间选择算法(中值算法的中位数)。
该算法的递归(非常简单)非常复杂。有两个递归调用,每个递归调用具有不同的参数。
我试图找到这种有趣的递归算法的其他示例,但找不到任何示例。我可以提出的所有递归算法要么是简单的尾部递归,要么是简单的分而治之(两个调用是“相同的”)。
您能否举一些复杂的递归示例?
我正在向一个朋友解释著名的确定性线性时间选择算法(中值算法的中位数)。
该算法的递归(非常简单)非常复杂。有两个递归调用,每个递归调用具有不同的参数。
我试图找到这种有趣的递归算法的其他示例,但找不到任何示例。我可以提出的所有递归算法要么是简单的尾部递归,要么是简单的分而治之(两个调用是“相同的”)。
您能否举一些复杂的递归示例?
Answers:
我最喜欢的重复出现在输出敏感算法中,用于计算凸包,首先是Kirkpatrick和Seidel,后来又被其他人重复。设表示当凸包具有个顶点时计算平面中个点的凸包的时间。(除了琐碎的边界之外,的值是未知的。)Kirkpatrick和Seidel的算法产生递归 其中和并且ñ ħ ħ ħ ≤ Ñ Ť (Ñ ,ħ )= { Ô (Ñ )如果 ñ ≤ 3 或 ħ ≤ 3 Ť (Ñ 1,ħ 1)+ Ť (Ñ 2,ħ 2)+ O (n )否则为 n 1,n 2
解为。这有点令人惊讶,因为不是参数被平均分配。但是实际上,当和都大约为时,会发生最坏的情况。如果以某种方式神奇地使始终恒定,则解将为。h h 1 h 2 h / 2 h 1 T (n ,h )= O (n )
我在第一批计算拓扑论文中使用了这种重复的变体: 其中和。同样,解为,最坏的情况是和始终均分时。
我在Aggarwal 等人的论文 “用于计算凸多边形的Voronoi图的线性时间算法”中使用的递归也很复杂。
这里是对本文算法的描述。如果从描述中不清楚,则在第3步中将红色点分为深红色和石榴石点。步骤1、3和6均为线性时间。我们还知道,如果是总点数,,和对于某些。
我会让您弄清楚为什么整个算法需要线性时间。
- 将原始点划分为蓝色和红色集合B和R。
- 递归计算蓝点的凸包。
- 使用蓝色船体的结构,选择深红色点C。
- 一次将深红色点添加到蓝色船体中。
- 递归计算石榴石点G的凸包。
- 将此石榴石外壳与步骤4的扩展蓝色外壳合并。
使算法呈线性的是能够以恒定的每点成本将固定比例的红色点添加到蓝色船体的能力。添加的点是深红色点。
因此,递归为 ,而您不知道和但保证。
RNA二级结构预测中使用了一堆很酷的递归算法[1],[2]。留给它自己的装置,RNA链将与其自身形成碱基对。[3]中的一个相对简单的示例计算了RNA字符串将与其自身形成的嵌套,配对碱基的最大数目:
M. Zuker,P. Stiegler(1981)使用热力学和辅助信息对大型RNA序列进行最佳计算机折叠
E. Rivas,SR Eddy(1999)提出的包括假结在内的RNA结构预测的动态编程算法。
R. Nussinov,AB Jacobson(1980)预测单链RNA二级结构的快速算法