有人能解释一个很好的算法来以高效的方式找到给定的一组数字的所有排列吗?给定数字集合的排列
-2
A
回答
6
0
你有没有看克努特“计算机程序设计艺术”?第3卷,排序和搜索覆盖它,这是有道理的,因为排序创建了一个特定的数据排列。
请注意查找所有组合或置换的组合(和置换)算法。它们具有非常昂贵的Big-O符号成本。
8
最简单的方法是递归方法,即以可执行的伪代码;
def permute(theseq):
if len(theseq) <= 1:
yield theseq
return
for i in range(len(theseq)):
theseq[0], theseq[i] = theseq[i], theseq[0]
for subperm in permute(theseq[1:]):
yield theseq[:1] + subperm
theseq[0], theseq[i] = theseq[i], theseq[0]
的情况下,你不熟悉executable pseudocode,符号[1:]
和[:1]
是为了表示“切片”(respecively“所有,但第一”和“只是第一”),以及两个相同的任务执行“交换第0项和第i项”和“将它们放回原处”的任务(即再次交换它们;-)。 yield
的意思是“提供这个结果,但准备好继续迭代时”,而return
的意思是“我们都完成了,再见!”。
沿着不同性能轴有一些更好的方法,但第一个里程碑是确保您完全熟悉基本的递归方法并彻底理解它 - 所以我现在就停下来。如果当你完全理解这种方法,为什么它只是罚款和花花公子,和如何以及为什么它并不真正看起来最佳的性能,我会很乐意 扩大对此答案! - )
3
我的C#实现亚历克斯的伪代码:的
private int length;
private List<List<string>> permutations;
public List<List<string>> Generate(List<string> list)
{
length = list.Count;
permutations = new List<List<string>>();
foreach(List<string> subperms in Recursive(list))
permutations.Add(subperms);
return permutations;
}
private List<List<string>> Recursive(List<string> list)
{
List<List<string>> subperms = new List<List<string>>();
if (list.Count <= 1)
{
subperms.Add(list);
return subperms;
}
for (int i = 0; i < list.Count; i++)
{
string temp = list[0];
list[0] = list[i];
list[i] = temp;
List<string> tail = new List<string>(list);
tail.RemoveAt(0);
List<string> head = new List<string>();
head.Add(list[0]);
foreach (List<string> subperm in Recursive(tail))
{
List<string> headCopy = new List<string>(head);
headCopy.AddRange(subperm);
if (headCopy.Count == length)
permutations.Add(headCopy);
else
subperms.Add(headCopy);
}
temp = list[0];
list[0] = list[i];
list[i] = temp;
}
return subperms;
}
相关问题
- 1. 在列中排列字符串集合
- 2. 从给定数字集合中表示数字的方法
- 3. 查找给定数字集合的所有组合
- 4. 查找给定集合中特定字符串索引(PHP)的所有可能的排列组合
- 5. 序列集合 - 找到一起是给定序列的子集
- 6. 给定字符串的Python排列
- 7. 从给定数字集合中找出回文序列的数目
- 8. 在给定字符串排列的排序列表中查找给定排列的索引
- 9. 产生的给定集合的子集
- 10. 给定的整数集合的子集,其和为常数N:Java
- 11. 给定数字和间隔集合的分配算法
- 12. VB给定的数字排序
- 13. 计算给定字符串集合的唯一缩写集
- 14. 代码为一组给定的数字生成排列C#
- 15. 从给定字段hibernate排序的数据库列表实体
- 16. 按给定字符的数量排列文件名?
- 17. 如何比较字符与C中给定字符的集合?
- 18. 输入的组合或排列,对于给定的长度
- 19. 什么是更好的方法来查找给定的集合是否是集合的完美子集 - 如果给定子集没有排序?
- 20. 排序的集合
- 21. 列表框的列表框绑定到集合的集合
- 22. 自定义排序的Magento集合?
- 23. 集合的自定义排序
- 24. 将列指定给数据集
- 25. 给定数量的集合,找到一组不包含任何给定的数字
- 26. 是给定集合中的对象吗?
- 27. 字符串中的整数由字符数组合排列
- 28. 对特定规则的字符串集合进行排序
- 29. 按日期排列栏杆集合
- 30. 正确的方法将数字分配给列表集合中的元素
可能重复[代码来生成一组给定数字的有效C#排列组合(http://stackoverflow.com/questions/1634880/code-to-generate -permutations-for-a-set-of-numbers-efficient-c) – mafu 2010-09-24 11:43:17
我想最好保留这个。 – mafu 2010-09-24 11:44:31