Algorithm 有序遍历的非递归算法

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 我想,这足以说明这种算法的本质。这些,以及其他一些例子都可以在一本极好的书中找到 我的问题如下。请你在任何领域给我描

有一系列组合算法,基于以下技术-我们观察结构的某些属性,并使用该属性,在线性(或接近,不管什么,都不重要)时间内遍历所有可能/可访问的变量,而无需递归

例子

字典排列a。。a[n]

  • 查找最后一个[k],使[k]
  • 求[k+1]中的最小a[m]。。a[n]使得a[k]
  • 交换a[m]和a[k]
  • 还原[k+1]。。a[n]
n的k-子集

  • 从末尾开始迭代,找到第一个零,前面是1(第一个a[k]==0,这样a[k+1]==1)
  • 分配[k]=1
  • a[k]中的计数1。。a[n]
  • 重新平衡-尽可能多地在末尾指定1,其余设置为零
n个分区(按降序)

  • 找到第一个k,使得a[k]>a[k+1](k=1也可以)
  • 增加a[k]=a[k]+1
  • 求从k到最后一个的元素之和
  • 只要总和允许,将左邻域增加1
我想,这足以说明这种算法的本质。这些,以及其他一些例子都可以在一本极好的书中找到

我的问题如下。请你在任何领域给我描述更多这样的算法的例子。如果您还提供算法本身,那就太好了(换句话说,如上所述,更可取)。也欢迎参考书籍、文章。也欢迎参考相关的理论问题(例如,我只是感觉不到什么时候可以构建这样的算法,什么时候不能)


提前感谢。

考虑一个算法家族中的算法A。A已经是迭代的,或者如果是递归的,则可以通过显式数据结构模拟调用堆栈,将其转换为等价的迭代算法。见例

这与Jiri的答案大致相同,但可能更直接一点:任何可解决的计算问题都可以通过图灵机器来解决,我认为没有人会将图灵机器的功能描述为“递归”,而是基于状态的。换句话说,只要有足够的辅助磁带存储、while循环和select case(或等效的分支,例如if/else,construct),就可以使用基于状态机的方法解决任何问题,包括这些枚举问题

例如,定义一个基于状态的算法来按顺序遍历二叉搜索树是相当简单的

  • 从状态DL开始(用于左下角)。如果您在DL中,并且节点有一个左子节点,则向下移动到该节点并保持在DL状态;否则,打印节点的内容,如果节点有正确的子节点,则更改为状态DR并移动到正确的子节点;如果节点没有正确的子节点,则更改为状态UR并移动到父节点

  • 如果处于DR状态,并且您有一个左子女,请移动到左子女并更改为DL状态。否则,如果您有正确的子节点,请打印节点的内容并移动到该子节点并停留在DR中。否则,请移动到父节点并更改为UL状态

  • 如果处于UR状态,则打印节点信息,如果有正确的子节点,则移动到该子节点并将状态更改为DR;否则,请移到父对象并留在UR中

  • 如果处于UL状态,如果当前节点是其父节点的正确子节点,则保持UL并移动到父节点;否则,如果当前节点不是父节点的右子节点,而是左子节点,则更改为状态UR并移动到父节点。如果此节点没有父节点,请终止算法


  • 不管怎样,你明白了。有序树遍历本质上是递归的;许多(全部?)其他遍历问题可以通过遍历某棵树来表达,下面是一种使用状态机在线性时间内进行无序遍历的方法。你认为这个方法是O(n)吗?提示:它访问每个节点的次数不超过三次。

    这是不可能无限期的。你只是想要一个随机的算法列表,可以是递归的,也可以是非递归的,对吗?这似乎不是一个很好的问题。这个问题没有“可接受”的答案,是吗?@s.Lott,不同意,我在问一些组合结构的非递归遍历算法。这是一个可以标记为大列表的东西,但我没有创建标记的特权。如果会有,比如说,10-15个不同的例子,它已经很好了。在任何情况下,这都比关于语言X的隐藏特性、有趣的书等(不是封闭的)问题更具体。从这个意义上说,它是一种方式,一种不那么开放的“一些组合结构”?你是说一系列数字?这在任何方面都不是限制。这并不是一个比“隐藏特征”更具体的问题,因为没有任何约束,任何人都无法确定什么样的答案会被“接受”。这只是一个“随机事实列表”的问题。那些递归算法和线性非递归算法是完全等价的吗?例如,在我看来,线性递归划分并不是那么明显。递归算法和转换的迭代算法是完全等价的:它们产生相同的结果,具有相同的时间/空间复杂度。实际的区别是,对于给定的
    n
    ,迭代算法通常比递归算法更快,但代价是优雅。@Jiri,我不明白为什么它们都是O(n)。e、 有n个!置换,似乎任何产生所有置换的算法都是Ω((n/e)^n)@Max:谢谢你的评论。我认为他对一些遍历(或生成)的线性算法感兴趣,例如一个这样的排列。他写道“遍历linea中所有可能/可访问的变体