有些时候我们需要利用程序实现排列组合算法, 下面是我根据网上的代码改写的awk代码, 可实现排列或是组合, 当然元素数目不能太大.

排列

# Language: bash
awk ' BEGIN {    Ndat=3
    for(i=1; i<=Ndat; i++) {P[i]=i}
    YesDone=0
    while(!YesDone) {        for(i=1; i<=Ndat; i++) printf"%d ", P[i]
        print ""
        NextPermut(Ndat, P)
    }
}

function NextPermut(Ndat, P) {    if (Ndat==0) {YesDone=1; return}
    # 从后向前查找,看有没有后面的数大于前面的数的情况P(i-1)<Pi,若有则停在后一个数的位置。
    # 若没有后面的数大于前面的数的情况,说明已经到了最后一个排列,返回
    for(i=Ndat; i>0 && P[i-1]>P[i]; i--) { }
    Iend=i
    if(Iend==1) { YesDone=1; return }

    # 从后查到Iend,查找大于P(Iend-1)的最小的数,记入Ibeg
    Ibeg=Iend
    for (i=Ndat; i>=Iend; i--) { if (P[Iend-1]< P[i] && P[i]< P[Ibeg]) Ibeg=i }

    #交换p[Ibeg]和p[Iend-1]
    tmp=P[Ibeg]; P[Ibeg]=P[Iend-1]; P[Iend-1]=tmp

    #倒置p[Iend]到p[Ndat]
    j=Ndat
    for(i=Iend; i< j; i++) {        tmp=P[j]; P[j]=P[i]; P[i]=tmp
        j--
    }
}
'

组合

# Language: bash
awk ' BEGIN {    m=6; n=4;
    a[1]="A"; a[2]="B"; a[3]="C"; a[4]="D"; a[5]="E"; a[6]="F"

    Comb(m,n)
    #RecComb(m, n, 1, n)
}

function RecComb(m, n, start, count, i,j) { # 递归实现
    for(i=start; i<=m+1-count; i++) {        b[count]=i
        if(count>1) RecComb(m, n, i+1, count-1);
        else { for(j=n; j>0; j--) printf("%s ",a[b[j]]); print "" }
    }
}

function Comb(m, n) { # 非递归
    idx=1
    p[idx]=1                   #取第一个元素
    while(1) {        if(p[idx]>m) {           #取到底了,回退
            if(idx==1) break  #各种情况取完了,不能再回退了
            idx--               #回退到前一个
            p[idx]++          #替换元素
        } else if(idx==n) {       #取够了,输出
            for(i=1; i<=m; i++) printf("%s ", a[p[i]])
            print ""
            p[idx]++          #替换元素
        } else {                #多取一个元素
            idx++
            p[idx]=p[idx-1]+1
        }
    }
}
'

如果是在Python中, 就容易多了, 可参考下面的代码.

# Language: python
import copy
import random
import itertools

n=6
seqIni=list(itertools.combinations('ABCDEFGHIJ', n))
Nseq=len(seqIni)
print Nseq

fh = open("Comb", "w")

for i in seqIni :
    k=' '.join([str(j) for j in i])
    fh.write(k+"\n")

fh.close()

for Nrnd in range (1):
    seq=copy.deepcopy(seqIni)
    if Nrnd==1:
        tmp=seq[1]
        seq[1]=seq[Nseq-1]
        seq[Nseq-1]=tmp
    if(Nrnd>1): random.shuffle(seq)

#   s="%d"%(Nrnd)
#   fh = open("Comb"+s, "w")

#   for i in seq :
#       k=' '.join([str(j) for j in i])
#       fh.write(k+"\n")
#   fh.close()

Ntot=0
for i in range (Nseq):
    if seq[i]!="":
        Ntot += 1
#           if(Ntot>17):
#           print Ntot, seq[i]
#           fh.write("%d "%(Ntot))
#           for kk in seq[i] :
#               k='  '.join([str(jk) for jk in kk])
#               fh.write(k+" ")
#           fh.write("

排列组合算法的实现代码相关推荐

  1. c语言两种排序方法的组合,排列和组合算法的实现方法_C语言经典案例

    排列和组合算法是考查递归的常见算法,这两种算法能用递归简洁地实现. 本人在经过多次摸索和思考之后,总结如下,以供参考. 程序代码如下: #include #include char array[] = ...

  2. c语言排列组合的函数,c语言排列组合算法 排列和组合算法的实现方法_C语言经典案例...

    想了解排列和组合算法的实现方法_C语言经典案例的相关内容吗,在本文为您仔细讲解c语言排列组合算法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:c语言排列组合算法,下面大家一起来学习吧. ...

  3. 二进制全排列 java_排列组合算法真厉害,傻瓜都能学会

    作者:枕边书来源:https://zhenbianshu.github.io/2019/01/charming_alg_permutation_and_combination.html 需求 最近工作 ...

  4. 二进制详解+集合算法的实现笔记

    前言 本篇文章转载自iukey所写的<位运算的威力>(点击蓝色的'位运算威力',即可跳转到原文) 一.有关位运算的基础知识总结 位运算包括:&(与).|(或).^(异或).~(取反 ...

  5. Linux网络编程组播测试代码

    Linux网络编程组播测试代码 (转载) 组播客户端代码如下: #include <sys/types.h> #include <sys/socket.h> #include ...

  6. android listview item 展开动画,android的ListView点击item使item展开的做法的实现代码

    本文介绍了android的ListView点击item使item展开的做法的实现代码,分享给大家,具体如下: 效果图: 原理是点击item的时候,重新measure list的各个item的高度 li ...

  7. 排列组合 离散数学_排列组| 离散数学

    排列组合 离散数学 排列组 (Permutation Group) Let, X be a non-empty set. A permutation of X is a one-one functio ...

  8. 基于python的梯度下降法的实现代码

    基于python的梯度下降法的实现 代码: def _numerical_gradient_no_batch(f, x):h = 1e-4 # 0.0001grad = np.zeros_like(x ...

  9. 蓝桥杯2016c++A组真题代码第十题最大比例

    蓝桥杯2016c++A组真题&代码第十题最大比例 /* 最大比例X星球的某个大奖赛设了M级奖励.每个级别的奖金是一个正整数. 并且,相邻的两个级别间的比例是个固定值. 也就是说:所有级别的奖金 ...

最新文章

  1. 易买网的一些增删改查
  2. 盘点提高国内访问 GitHub 的速度的 9 种方案
  3. Python 之父为什么嫌弃 lambda 匿名函数?
  4. 【NLP傻瓜式教程】手把手带你RCNN文本分类(附代码)
  5. OPENCV-PYTHON将.GIF格式的图像转为PNG格式
  6. 【记录】我在浙江省机器人大赛的第一天
  7. 一分钟关闭百度的搜索热点和相关人物
  8. mysql join不加关联条件的含义
  9. 从零实现深度学习框架——逻辑回归中的数值稳定
  10. Remoting示例
  11. ngnix有版本要求吗_新版本探秘:比赛/活动等其他系统的新增与优化~
  12. cs231n softmax作业笔记
  13. 如何使用轻快PDF阅读器编辑PDF文件
  14. vue.js3D立方体旋转播放特效
  15. kali linux虚拟机镜像的安装(详细手把手教你)
  16. 服务器简介(一):服务器定义、服务器特点、服务器分类、服务器软件
  17. 20分钟掌握前端编写 CLI 工具
  18. terraform 安装及命令
  19. 幂果支招:哪里找免费的Mac版音频剪辑软件
  20. 微软服务器管理员证书,微软认证 Azure 管理员培训

热门文章

  1. 【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 )
  2. 【Android 异步操作】HandlerThread 示例 ( 初始化并执行 | 获取Looper | 获取 Handler | 获取消息队列 | 设置空闲队列 | 代码示例 )
  3. idea Empty git --version output:解决
  4. poj 3984
  5. 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局...
  6. 【BZOJ4764】弹飞大爷 LCT
  7. Thread 小总结
  8. 套接字(socket)与socket 编程
  9. windows 程序员电脑设置
  10. iOS夯实:RunLoop