【发布时间】:2011-11-08 16:55:04
【问题描述】:
有一个基于以下技术的组合算法系列 - 我们观察结构的某些属性,并使用该属性遍历线性(或接近,无论如何,并不重要)的所有可能/可访问的变体) 时间,没有递归。
例子
字典排列 a1 .. a[n]
- 找到最后一个 a[k] 使得 a[k] ...
- 在 a[k + 1] .. a[n] 中找到最小的 a[m] 使得 a[k]
- 交换 a[m] 和 a[k]
- 还原 a[k + 1] .. a[n]
n 的 k-子集
- 从末尾迭代,找到第一个零,前面是 1(第一个 a[k]==0 使得 a[k + 1] == 1)
- 分配 a[k] = 1
- 在 a[k] .. a[n] 中计数 1
- 重新平衡 - 在末尾分配尽可能多的 1,其余设置为零
n 的分区(按降序排列)
- 找到第一个 k 使得 a[k] > a[k + 1](k = 1 也可以)
- 增加a[k] = a[k] + 1
- 求从 k 到最后一个元素的总和
- 在总和允许的情况下将左邻居增加 1。
我想,这足以说明此类算法的本质。这些以及其他一些示例可以在优秀的、精湛的书籍“Algorithms and Programming: Problems and Solutions”中找到。
我的问题如下。请您在任何领域向我描述此类算法的更多示例。如果您还提供算法本身,那就太好了(换句话说,如上所述,更可取)。也欢迎参考书籍、文章。也欢迎参考相关的理论问题(例如,我只是不知道什么时候可以构建这样的算法,什么时候 - 不)。
提前致谢。
【问题讨论】:
-
这不可能是开放式的。你只是要求一个随机的算法列表,可以是递归的和非递归的,对吧?这似乎不是一个很好的问题。对此没有“可接受”的答案,是吗?
-
@S.Lott,不同意,我要求一些组合结构的非递归遍历算法。它可以被标记为大名单,但我没有创建标签的特权。如果会有 10 到 15 个不同的例子,那就太好了。无论如何,这比关于语言 X 的隐藏特征、有趣的书等问题更具体(未关闭)。从这个意义上说,它是一种方式,方式不那么开放。
-
“一些组合结构”?你的意思是一个数字列表?这绝不是一种限制。这并不比“隐藏特征”问题更具体,因为没有任何限制,也没有任何人可以确定“接受”什么答案。这只是一个“随机事实列表”问题。
标签: algorithm language-agnostic computer-science