获取指定长度得全部序列

通过事件来表述这个序列,即n重伯努利实验(二项分布)的全部可能结果。比如时间a表示为: a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 假设每次实验为从a中选择一个数字。那么进行n次实验,获得全部可能得序列。

比方,进行两次实验, n=2, 那么可能得结果有100个。这里由于每次实验都是相对独立的,所以每次实验的结果可能出现反复,也就是说在获得全部可能的序列中,能够存在反复得值。

递归实现,DFS(深度优先遍历)

def gen_all_sequence_dfs(outcomes, length):
"""
generate all sequence by dfs outcomes: all the possible event, a list
length: how many times does the sequence repeat, sequence length
""" res = []
seq = []
dfs_sequence(outcomes, length, seq, res) return res def dfs_sequence(outcomes, length, seq, res):
"""
deep first search
"""
if 0 == length:
res.append(tuple(seq[:]))
return for key in outcomes:
seq.append(key)
dfs_sequence(outcomes, length - 1, seq, res)
seq.pop() def run_dfs_example1():
"""
Example of all sequences
"""
print 'dfs gen all sequence'
outcomes = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) length = 2
seq_outcomes = gen_all_sequence_dfs(outcomes, length)
print "Computed", len(seq_outcomes), "sequences of", str(length), "outcomes"
print "Sequences were", seq_outcomes run_dfs_example1()

执行输出结果:

dfs gen all sequence
Computed 100 sequences of 2 outcomes
Sequences were [(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]

非递归实现

利用动态规划的原理(这里我也不太熟悉是不是动态规划,暂且这么叫。假设有错误,请大家帮忙更正),动态的计算第k次实验后获得得全部得序列。

依据第k-1次实验的全部得序列得结果,然后把每一次结果拿出来计算这一次结果再加上一次实验(即第k次实验)能够获得的结果。

def gen_all_sequences(outcomes, length):
"""
Iterative function that enumerates the set of all sequences of
outcomes of given length Permutation allow repeat
""" ans = set([()])
for dummy_idx in range(length):
temp = set()
for seq in ans:
for item in outcomes:
new_seq = list(seq)
new_seq.append(item)
temp.add(tuple(new_seq))
ans = temp
return ans # example for digits
def run_example1():
"""
Example of all sequences
"""
print 'gen all sequence'
outcomes = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#outcomes = set(["Red", "Green", "Blue"])
#outcomes = set(["Sunday", "Mondy", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]) length = 2
seq_outcomes = gen_all_sequences(outcomes, length)
print "Computed", len(seq_outcomes), "sequences of", str(length), "outcomes"
print "Sequences were", seq_outcomes print '#############################################'
run_example1()

代码执行结果:

gen all sequence
Computed 100 sequences of 2 outcomes
Sequences were set([(7, 3), (6, 9), (0, 7), (1, 6), (3, 7), (2, 5), (8, 5), (5, 8), (4, 0), (9, 0), (6, 7), (5, 5), (7, 6), (0, 4), (1, 1), (3, 2), (2, 6), (8, 2), (4, 5), (9, 3), (6, 0), (7, 5), (0, 1), (3, 1), (9, 9), (7, 8), (2, 1), (8, 9), (9, 4), (5, 1), (7, 2), (1, 5), (3, 6), (2, 2), (8, 6), (4, 1), (9, 7), (6, 4), (5, 4), (7, 1), (0, 5), (1, 0), (0, 8), (3, 5), (2, 7), (8, 3), (4, 6), (9, 2), (6, 1), (5, 7), (7, 4), (0, 2), (1, 3), (4, 8), (3, 0), (2, 8), (9, 8), (8, 0), (6, 2), (5, 0), (1, 4), (3, 9), (2, 3), (1, 9), (8, 7), (4, 2), (9, 6), (6, 5), (5, 3), (7, 0), (6, 8), (0, 6), (1, 7), (0, 9), (3, 4), (2, 4), (8, 4), (5, 9), (4, 7), (9, 1), (6, 6), (5, 6), (7, 7), (0, 3), (1, 2), (4, 9), (3, 3), (2, 9), (8, 1), (4, 4), (6, 3), (0, 0), (7, 9), (3, 8), (2, 0), (1, 8), (8, 8), (4, 3), (9, 5), (5, 2)])

Permutation 获取全部排列

给定一个序列。比如上面给出得 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 假设依照上面获取序列的算法,那么每次实验都作为独立得实现,序列中能够出现反复实验结果。

可是再获取排列的时候则不能依照n重伯努利实验得思想进行了。获取排列不同意有反复得结果,即一个元素仅仅能被选择一次。可是在排列中是存在元素得顺序因素得。也就是说相同得两个元素,不同得顺序为不同得排列。

非递归实现

在上面非递归算法得基础上。添加一个推断。推断该元素是否已经选择过就能够实现排列得获取。

def gen_permutations(outcomes, length):
"""
Iterative function that enumerates the set of all sequences of
outcomes of given length
Permutation not allow repeat
""" ans = set([()])
for dummy_idx in range(length):
temp = set()
for seq in ans:
for item in outcomes:
if item in seq:
continue
new_seq = list(seq)
new_seq.append(item)
temp.add(tuple(new_seq))
ans = temp
return ans # example for digits
def run_example1():
"""
Example of all sequences
"""
outcomes = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#outcomes = set(["Red", "Green", "Blue"])
#outcomes = set(["Sunday", "Mondy", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]) length = 2
seq_outcomes = gen_permutations(outcomes, length)
print "Computed", len(seq_outcomes), "sequences of", str(length), "outcomes"
print "Sequences were", seq_outcomes run_example1()

代码执行结果:

Computed 90 sequences of 2 outcomes
Sequences were set([(7, 3), (6, 9), (0, 7), (1, 6), (3, 7), (2, 5), (8, 5), (5, 8), (4, 0), (9, 0), (6, 7), (7, 6), (0, 4), (3, 2), (2, 6), (8, 2), (4, 5), (9, 3), (6, 0), (7, 5), (0, 1), (3, 1), (7, 8), (2, 1), (8, 9), (9, 4), (5, 1), (7, 2), (1, 5), (3, 6), (8, 6), (4, 1), (9, 7), (6, 4), (5, 4), (7, 1), (0, 5), (1, 0), (0, 8), (3, 5), (2, 7), (8, 3), (4, 6), (9, 2), (6, 1), (5, 7), (7, 4), (0, 2), (1, 3), (4, 8), (3, 0), (2, 8), (9, 8), (8, 0), (6, 2), (5, 0), (1, 4), (3, 9), (2, 3), (1, 9), (8, 7), (4, 2), (9, 6), (6, 5), (5, 3), (7, 0), (6, 8), (0, 6), (1, 7), (0, 9), (3, 4), (2, 4), (8, 4), (5, 9), (4, 7), (9, 1), (5, 6), (0, 3), (1, 2), (4, 9), (2, 9), (8, 1), (6, 3), (7, 9), (3, 8), (2, 0), (1, 8), (4, 3), (9, 5), (5, 2)])

递归实现

def gen_permutations_dfs(outcomes, length):
"""
Iterative function that enumerates the set of all sequences of
outcomes of given length
Permutation not allow repeat, DFS
""" res = []
seq = []
dfs_permutation(outcomes, length, seq, res) return res def dfs_permutation(outcomes, length, seq, res):
"""
deep first search
""" if 0 == length:
res.append(tuple(seq[:]))
return for key in outcomes:
if key in seq:
continue
seq.append(key)
dfs_permutation(outcomes, length - 1, seq, res)
seq.pop() # example for digits
def run_example2():
"""
Example of all sequences
"""
outcomes = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#outcomes = set(["Red", "Green", "Blue"])
#outcomes = set(["Sunday", "Mondy", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]) length = 2
seq_outcomes = gen_permutations_dfs(outcomes, length)
print "Computed", len(seq_outcomes), "sequences of", str(length), "outcomes"
print "Sequences were", seq_outcomes run_example2()

执行结果:

Computed 90 sequences of 2 outcomes
Sequences were [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 0), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 0), (2, 1), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 0), (3, 1), (3, 2), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 0), (4, 1), (4, 2), (4, 3), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 6), (5, 7), (5, 8), (5, 9), (6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 7), (6, 8), (6, 9), (7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 8), (7, 9), (8, 0), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 9), (9, 0), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8)]

组合

组合与排列最大得差别是组合不关心顺序。所以组合得数量要比排列少。

,组合能够表示为

cmn

。从n个元素中选择m个元素。而且不关心顺序。

组合能够简单得在排列得结果得基础上去除不考虑顺序得情况下反复得结果就可以获得。

组合的计算公式:

cmn=n!m!(n−m)!

非递归实现

def gen_combination(outcomes, length):
"""
Iterative function that enumerates the set of all sequences of
outcomes of given length
Permutation not allow repeat
""" ans = set([()])
for dummy_idx in range(length):
temp = set()
for seq in ans:
for item in outcomes:
if item in seq:
continue
new_seq = list(seq)
new_seq.append(item)
temp.add(tuple(sorted(new_seq)))
ans = temp
return ans def run_example():
"""
Examples of sorted sequences of outcomes
"""
# example for digits
outcomes = set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#outcomes = set(["Red", "Green", "Blue"])
#outcomes = set(["Sunday", "Mondy", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]) length = 2
seq_outcomes = gen_combination(outcomes, length)
print "Computed", len(seq_outcomes), "sorted sequences of", str(length) ,"outcomes"
print "Sequences were", seq_outcomes run_example()

执行结果:

Computed 45 sorted sequences of 2 outcomes
Sequences were set([(5, 9), (6, 9), (1, 3), (4, 8), (5, 6), (2, 8), (4, 7), (0, 7), (4, 6), (8, 9), (1, 6), (3, 7), (2, 5), (0, 3), (5, 8), (1, 2), (6, 7), (2, 9), (1, 5), (3, 6), (0, 4), (3, 5), (2, 7), (2, 6), (4, 5), (1, 4), (3, 9), (2, 3), (1, 9), (4, 9), (0, 8), (7, 9), (0, 1), (6, 8), (3, 4), (5, 7), (2, 4), (3, 8), (0, 6), (1, 8), (1, 7), (0, 9), (0, 5), (7, 8), (0, 2)])

组合的递归实现

def gen_combination_dfs(outcomes, length):
"""
Iterative function that enumerates the set of all sequences of
outcomes of given length
Permutation not allow repeat, DFS
""" res = []
seq = []
idx = 0
dfs_combination(outcomes, length, idx, seq, res) return res def dfs_combination(outcomes, length, idx, seq, res):
"""
deep first search
"""
if idx + length > len(outcomes):
return if 0 == length:
res.append(tuple(seq[:]))
return for i in range(idx, len(outcomes) - length + 1):
seq.append(outcomes[i])
dfs_combination(outcomes, length - 1, i + 1, seq, res)
seq.pop() def run_example2():
"""
Examples of sorted sequences of outcomes
"""
# example for digits
print "dfs combination"
outcomes = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
#outcomes = set(["Red", "Green", "Blue"])
#outcomes = set(["Sunday", "Mondy", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]) length = 2
seq_outcomes = gen_combination_dfs(outcomes, length)
print "Computed", len(seq_outcomes), "sorted sequences of", str(length) ,"outcomes"
print "Sequences were", seq_outcomes run_example2()

执行结果:

Computed 45 sorted sequences of 2 outcomes
Sequences were [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7), (0, 8), (0, 9), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 6), (5, 7), (5, 8), (5, 9), (6, 7), (6, 8), (6, 9), (7, 8), (7, 9), (8, 9)]

排列组合相关算法 python的更多相关文章

  1. leetcode排列组合相关

    目录 78/90子集 39/40组合总和 77组合 46/47全排序,同颜色球不相邻的排序方法 78/90子集 输入: [1,2,2] 78输出: [[], [1], [2], [1 2], [2], ...

  2. w3cshool -- 排列组合去重算法挑战

    function permAlone(str) { if(str.length == 1) return str; var a = str.substr(0, 1), one = [a], count ...

  3. python自带的排列组合函数

    需求: 在你的面前有一个n阶的台阶,你一步只能上1级或者2级,请计算出你可以采用多少种不同的方法爬完这个楼梯?输入一个正整数表示这个台阶的级数,输出一个正整数表示有多少种方法爬完这个楼梯. 分析:提炼 ...

  4. 【CodeForces】889 C. Maximum Element 排列组合+动态规划

    [题目]C. Maximum Element [题意]给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[ ...

  5. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinatorics组件的使用情况,其实这个组件我5年前就开始用了,非常方便,麻雀虽小五脏俱全.所以一直非常喜欢,才写了几 ...

  6. C# 排列组合

    排列组合的概念 排列:从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(Arrangement). 组合:从m个不同的元素中,任取n(n≤m)个元 ...

  7. C#的排列组合类

    C#的排列组合类 //-----------------------------------------------------------------------------//// 算法:排列组合 ...

  8. python算法-排列组合

    排列组合 一.递归 1.自己调用自己 2.找到一个退出的条件 二.全排列:针对给定的一组数据,给出包含所有数据的排列的组合 1:1 1,2:[[1,2],[2,1]] 1,2,3:[[1,2,3],[ ...

  9. Python算法题(二)——国际象棋棋盘(排列组合问题,最小的K个数)

    题目一(输出国际象棋棋盘)  分析: 用i控制行,j来控制列,根据i+j的和的变化来控制输出黑方格,还是白方格.   主要代码: for i in range(8): for j in range(8 ...

随机推荐

  1. 普联的路由器TL-WR842N和TL-WR845N还有 TL-WR847N哪一个更好,我是家用

    http://zhidao.baidu.com/question/525244706.html?fr=ala&device=mobile&ssid=0&from=844b&am ...

  2. TControl的消息覆盖函数大全(15个WM_函数和17个CM_函数,它的WndProc就处理鼠标与键盘消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...

  3. Vijos P1881 闪烁的星星

    背景 星光闪耀--深蓝色空间 听说过他们的语言 沉默 暮 他们称赞深相互 描写叙述 繁星, 漫天的繁星. 繁星排成一列, 我数一数呀, 一共同拥有N仅仅小星星呢. 星星们是听话的好孩子, 小岛在指挥它 ...

  4. postgresql优化数据的批量插入

    原文:http://www.cnblogs.com/mchina/archive/2012/08/11/2537393.html 有以下几种方法用于优化数据的批量插入. 1. 关闭自动提交:      ...

  5. g++编C++11/C++0x遇到的问题

    在看<Cplusplus Concurrency In Action Practical Multithreading>当遇到第一个样品: #include<iostream> ...

  6. LeetCode_Merge Two Sorted Lists

    一.题目 Merge Two Sorted Lists My Submissions Merge two sorted linked lists and return it as a new list ...

  7. cocos2dx 制作单机麻将(一)

    今天開始打算解说下cocos2dx下怎样制作国标麻将 前半部分先解说麻将的逻辑部分,由于都是代码,可能会比較枯燥无聊. 这部分讲完后,你也能够用其它游戏引擎来制作麻将 后半部分,就解说余下的cocos ...

  8. Lichee (五岁以下儿童) sysconfig1.fex 配置系统

    sysconfig配置系统,作为一个通用的软件平台,还希望通过它.能够适应用户不同的方案.通过给出一个相应的配置.用户的方案就能够自己主动执行,而不须要改动系统里面的代码,或者又一次给出參数. 一. ...

  9. POJ 2002 点hash

    Squares Time Limit: 3500MS   Memory Limit: 65536K Total Submissions: 15489   Accepted: 5864 Descript ...

  10. ZTESoft 持续集成 编年史 之 持续集成建设---自主研发(总括)

    最终选择了自主研发,考虑到我们团队对java以及flex知识的储备,展示层使用夸浏览器的flex开发,后端业务层使用java. 一.方案: BEC + ZCIPAgent + ZCIPServer + ...