`
wmj2003
  • 浏览: 99691 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

高效率的排列组合算法(java实现)

阅读更多
  1. packageBeanUtil;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importcom.work.core.exception.OurException;
  5. /**
  6. *统计任三出现的最多的几率的组合
  7. *
  8. *@authorwangmingjie
  9. *@date2009-1-1下午01:22:19
  10. */
  11. publicclassCopy_2_of_StatisAnyThree{
  12. //组合算法
  13. //本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标
  14. //代表的数被选中,为0则没选中。
  15. //首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
  16. //然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为
  17. //“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
  18. //当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得
  19. //到了最后一个组合。
  20. //例如求5中选3的组合:
  21. //11100//1,2,3
  22. //11010//1,2,4
  23. //10110//1,3,4
  24. //01110//2,3,4
  25. //11001//1,2,5
  26. //10101//1,3,5
  27. //01101//2,3,5
  28. //10011//1,4,5
  29. //01011//2,4,5
  30. //00111//3,4,5
  31. publicstaticvoidmain(String[]args){
  32. Copy_2_of_StatisAnyThrees=newCopy_2_of_StatisAnyThree();
  33. s.printAnyThree();
  34. }
  35. /**
  36. *
  37. */
  38. publicvoidprintAnyThree(){
  39. int[]num=newint[]{1,2,3,4,5,6};
  40. print(combine(num,3));
  41. }
  42. /**
  43. *从n个数字中选择m个数字
  44. *@parama
  45. *@paramm
  46. *@return
  47. */
  48. publicListcombine(int[]a,intm){
  49. intn=a.length;
  50. if(m>n){
  51. thrownewOurException("错误!数组a中只有"+n+"个元素。"+m+"大于"+2+"!!!");
  52. }
  53. Listresult=newArrayList();
  54. int[]bs=newint[n];
  55. for(inti=0;i<n;i++){
  56. bs[i]=0;
  57. }
  58. //初始化
  59. for(inti=0;i<m;i++){
  60. bs[i]=1;
  61. }
  62. booleanflag=true;
  63. booleantempFlag=false;
  64. intpos=0;
  65. intsum=0;
  66. //首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边
  67. do{
  68. sum=0;
  69. pos=0;
  70. tempFlag=true;
  71. result.add(print(bs,a,m));
  72. for(inti=0;i<n-1;i++){
  73. if(bs[i]==1&&bs[i+1]==0){
  74. bs[i]=0;
  75. bs[i+1]=1;
  76. pos=i;
  77. break;
  78. }
  79. }
  80. //将左边的1全部移动到数组的最左边
  81. for(inti=0;i<pos;i++){
  82. if(bs[i]==1){
  83. sum++;
  84. }
  85. }
  86. for(inti=0;i<pos;i++){
  87. if(i<sum){
  88. bs[i]=1;
  89. }else{
  90. bs[i]=0;
  91. }
  92. }
  93. //检查是否所有的1都移动到了最右边
  94. for(inti=n-m;i<n;i++){
  95. if(bs[i]==0){
  96. tempFlag=false;
  97. break;
  98. }
  99. }
  100. if(tempFlag==false){
  101. flag=true;
  102. }else{
  103. flag=false;
  104. }
  105. }while(flag);
  106. result.add(print(bs,a,m));
  107. returnresult;
  108. }
  109. privateint[]print(int[]bs,int[]a,intm){
  110. int[]result=newint[m];
  111. intpos=0;
  112. for(inti=0;i<bs.length;i++){
  113. if(bs[i]==1){
  114. result[pos]=a[i];
  115. pos++;
  116. }
  117. }
  118. returnresult;
  119. }
  120. privatevoidprint(Listl){
  121. for(inti=0;i<l.size();i++){
  122. int[]a=(int[])l.get(i);
  123. for(intj=0;j<a.length;j++){
  124. System.out.print(a[j]+"\t");
  125. }
  126. System.out.println();
  127. }
  128. }
  129. }
分享到:
评论

相关推荐

    高效的java版排列组合算法

    下面将详细介绍高效的Java版排列组合算法的实现。 一、排列组合算法的概念 排列组合算法是指从n个元素中选择m个元素的所有可能的组合。例如,从5个元素中选择3个元素的排列组合有10种可能的组合:{1,2,3}、{1,2,4}...

    关于各种排列组合java算法实现方法

    本文将探讨两种不同的Java实现方法,分别基于二进制状态法和递归思想,用于生成排列组合。 首先,我们来看第一种方法:**二进制状态法**。这种方法的核心思想是利用二进制数来表示每个排列,然后通过遍历所有可能的...

    页面算法模拟(java实现)

    在这个Java实现的项目中,我们将探讨两种主要的页面替换算法:FIFO(先进先出)和LRU(最近最少使用)。这两种算法都是为了解决虚拟存储系统中的缓存问题,即如何决定哪些页面应该被替换到磁盘,以便为新的或已修改...

    各种排序算法java实现

    在提供的文件中,我们可以看到有四种经典的排序算法的Java实现:插入排序、冒泡排序、选择排序以及希尔排序。 **插入排序**: 插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据...

    三种线性排序算法Java实现

    本资源提供的Java实现包括了三种线性排序算法:桶排序(Bucket Sort)、基数排序(Radix Sort)和计数排序(Counting Sort)。这三种算法在特定条件下可以达到线性的平均或最好时间复杂度,效率相对较高。 1. **桶...

    字典排序求全排列的算法

    总之,字典排序求全排列的算法通过Java实现,结合了回溯法和深度优先搜索策略,遵循字典序规则生成所有可能的排列。理解并掌握这种算法有助于提升编程能力和解决复杂问题的能力。在实际应用中,这种算法可用于生成...

    Burrows-Wheeler压缩算法JAVA实现

    4. **Java实现**: - Java中实现BWT,可以使用`Collections.sort()`函数来排序字符数组,实现全排列和排序的过程。 - 为了存储和处理全排列,可以使用`ArrayList`或自定义的`Matrix`类来保存旋转字符串。 - 可以...

    经典算法问题的java实现<一>

    在本资源中,我们关注的是"经典算法问题的java实现&lt;一&gt;",这通常涉及到计算机科学中的基础算法,特别是那些用Java编程语言实现的。这些算法是解决各种计算问题的关键,包括排序、搜索、图论、动态规划等。Java作为一...

    62种常见算法(JAVA,C实现都有)

    C语言的实现强调效率和内存管理,而Java的实现则更注重代码的清晰性和可维护性。通过比较两种语言的实现,开发者可以深化对算法本质的理解,同时提升编程技巧。 总的来说,"62种常见算法(JAVA,C实现都有)"是IT...

    完整B树算法Java实现代码

    在计算机科学中,B树(B-tree)是一种自平衡的多路查找树,它的设计目的是为了优化磁盘或网络存储环境下的数据检索效率。B树的主要特点是每个节点可以拥有多个子节点,这与二叉树(最多两个子节点)不同。其核心思想...

    遗传算法 tsp java

    《遗传算法在旅行商问题(TSP)中的应用——基于Java实现》 旅行商问题(Traveling Salesman Problem,简称TSP)是一个经典的组合优化问题,它询问的是:给定一个城市列表,一个旅行商如何规划一条路线,使得他能...

    常用排序算法的java实现(冒泡、插入、选择、希尔、归并、快排)

    本篇文章将详细讲解标题中提到的六种常见排序算法的Java实现。 1. **冒泡排序**:冒泡排序是最基础的排序算法之一,它通过不断交换相邻的逆序元素来逐渐将较大的元素“浮”到数组的前端。在Java中,冒泡排序的基本...

    java实现的4种排序算法(冒泡、快速、插入、选择)

    Java作为广泛应用的编程语言,提供了丰富的工具来实现各种排序算法。以下是根据标题和描述中提到的四种排序算法——冒泡排序、快速排序、插入排序和选择排序的详细说明。 **冒泡排序(BuddleSort)**: 冒泡排序是...

    排序算法-基于Java实现的排序算法之BubbleSort实现.zip

    总的来说,"排序算法_基于Java实现的排序算法之BubbleSort实现"这个项目提供了学习和实践冒泡排序算法的机会。通过分析和编写这样的代码,不仅可以加深对排序算法的理解,也能提升Java编程技巧。同时,它也提醒我们...

    数据结构与算法java版-不是很高清,不过还算全

    "数据结构与算法java版"这个资源虽然清晰度不高,但内容较为全面,涵盖了数据结构和算法的核心概念。 1. **数据结构**:数据结构是指在计算机中组织和存储数据的方式,它允许我们以高效的方式访问和修改数据。主要...

    Huffman 霍夫曼 无损压缩 算法实现 java

    总的来说,通过Java实现的霍夫曼无损压缩算法,可以有效地压缩文本数据,减少存储空间。配合`binview`这样的工具,可以方便地查看和分析压缩后的数据。在实际应用中,霍夫曼编码常与其他压缩算法结合使用,如LZ77或...

    Rijndael扩展算法及其JAVA实现

    ### Rijndael扩展算法及其Java实现 #### 引言 Rijndael算法作为高级加密标准(AES)的基础,在信息安全领域占据着极其重要的地位。它不仅被广泛应用于美国政府、商业、金融以及军事领域,同时也成为了全球范围内...

    探究-贪心算法解决背包问题(Java实现)

    为了用Java实现贪心算法解决背包问题,我们可以按照以下步骤进行: 1. 定义物品类(Item),包含物品的重量(weight)和价值(value)。 ```java public class Item { int weight; int value; public Item(int ...

    组合数学全排列算法(转)

    #### 排列算法分类 在组合数学中,常见的全排列算法有以下几种: 1. **递归算法** - **原理**:递归算法的基本思想是从n个元素中选择第一个元素,然后对剩下的n-1个元素进行递归求解,直到只剩下一个元素为止。 -...

Global site tag (gtag.js) - Google Analytics