Algorithm 有序遍历的非递归算法
有一系列组合算法,基于以下技术-我们观察结构的某些属性,并使用该属性,在线性(或接近,不管什么,都不重要)时间内遍历所有可能/可访问的变量,而无需递归 例子 字典排列a。。a[n]Algorithm 有序遍历的非递归算法,algorithm,language-agnostic,computer-science,Algorithm,Language Agnostic,Computer Science,有一系列组合算法,基于以下技术-我们观察结构的某些属性,并使用该属性,在线性(或接近,不管什么,都不重要)时间内遍历所有可能/可访问的变量,而无需递归 例子 字典排列a。。a[n] 查找最后一个[k],使[k] 求[k+1]中的最小a[m]。。a[n]使得a[k]a[k+1](k=1也可以) 增加a[k]=a[k]+1 求从k到最后一个的元素之和 只要总和允许,将左邻域增加1 我想,这足以说明这种算法的本质。这些,以及其他一些例子都可以在一本极好的书中找到 我的问题如下。请你在任何领域给我描
- 查找最后一个[k],使[k]
- 求[k+1]中的最小a[m]。。a[n]使得a[k]
- 交换a[m]和a[k]
- 还原[k+1]。。a[n]
- 从末尾开始迭代,找到第一个零,前面是1(第一个a[k]==0,这样a[k+1]==1)
- 分配[k]=1
- a[k]中的计数1。。a[n]
- 重新平衡-尽可能多地在末尾指定1,其余设置为零
- 找到第一个k,使得a[k]>a[k+1](k=1也可以)
- 增加a[k]=a[k]+1
- 求从k到最后一个的元素之和
- 只要总和允许,将左邻域增加1
提前感谢。考虑一个算法家族中的算法A。A已经是迭代的,或者如果是递归的,则可以通过显式数据结构模拟调用堆栈,将其转换为等价的迭代算法。见例 这与Jiri的答案大致相同,但可能更直接一点:任何可解决的计算问题都可以通过图灵机器来解决,我认为没有人会将图灵机器的功能描述为“递归”,而是基于状态的。换句话说,只要有足够的辅助磁带存储、while循环和select case(或等效的分支,例如if/else,construct),就可以使用基于状态机的方法解决任何问题,包括这些枚举问题 例如,定义一个基于状态的算法来按顺序遍历二叉搜索树是相当简单的
不管怎样,你明白了。有序树遍历本质上是递归的;许多(全部?)其他遍历问题可以通过遍历某棵树来表达,下面是一种使用状态机在线性时间内进行无序遍历的方法。你认为这个方法是O(n)吗?提示:它访问每个节点的次数不超过三次。这是不可能无限期的。你只是想要一个随机的算法列表,可以是递归的,也可以是非递归的,对吗?这似乎不是一个很好的问题。这个问题没有“可接受”的答案,是吗?@s.Lott,不同意,我在问一些组合结构的非递归遍历算法。这是一个可以标记为大列表的东西,但我没有创建标记的特权。如果会有,比如说,10-15个不同的例子,它已经很好了。在任何情况下,这都比关于语言X的隐藏特性、有趣的书等(不是封闭的)问题更具体。从这个意义上说,它是一种方式,一种不那么开放的“一些组合结构”?你是说一系列数字?这在任何方面都不是限制。这并不是一个比“隐藏特征”更具体的问题,因为没有任何约束,任何人都无法确定什么样的答案会被“接受”。这只是一个“随机事实列表”的问题。那些递归算法和线性非递归算法是完全等价的吗?例如,在我看来,线性递归划分并不是那么明显。递归算法和转换的迭代算法是完全等价的:它们产生相同的结果,具有相同的时间/空间复杂度。实际的区别是,对于给定的
n
,迭代算法通常比递归算法更快,但代价是优雅。@Jiri,我不明白为什么它们都是O(n)。e、 有n个!置换,似乎任何产生所有置换的算法都是Ω((n/e)^n)@Max:谢谢你的评论。我认为他对一些遍历(或生成)的线性算法感兴趣,例如一个这样的排列。他写道“遍历linea中所有可能/可访问的变体