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

高效率的排列组合算法(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).rar

    所使用的算法应该是效率最高的算法,而且这两个类都只是对需要排列组合的数组的下标进行处理,所以能对任何类型的数组进行排列组合。

    高效的java版排列组合算法

    主要为大家详细介绍了高效的java版排列组合算法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    字典排序求全排列的算法

    给出了字典排序求取全排列的算法实现,JAVA

    JAVA实现的冒泡排序

    虽然冒泡排序的实现方法非常简单,但是它的效率并不高,特别是对于大规模数据的排序。 然而,我最近发现了一种对冒泡排序进行优化的方法。这种方法的基本思路是在每次循环中增加一个标志位,用于记录本次循环是否...

    高效算法:竞赛、应试与提高必修128例.[法] Christoph Dürr Jill-Jênn Vie(带书签文字版).pdf

    本书旨在探讨如何优化算法效率,详细阐述了经典算法和特殊算法的实现、应用技巧和复杂度验证过程,内容由浅入深,能帮助读者快速掌握复杂度适当、正确率高的高效编程方法以及自检、自测技巧,是参加ACM ICPC、Google...

    基于二分法的改进Apriori关联算法研究

    D_Apriori算法利用逐步逼近的思想越级产生频繁K-项集,引入二分法获取每次需要产生频繁项集中集合的长度,结合排列算法或者取并集算法直接产生频繁K-项集。通过算例分析与实验验证结果表明,在数据量、支持度和事物...

    Java二分查找(普通方法和递归方法)

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 要求: 必须采用顺序存储结构。 必须按关键字大小有序排列。...

    javascript数据结构与算法之检索算法

    二分查找效率更高,但是必须是已经排好序的列表元素集合。 一:顺序查找 顺序查找是从列表的第一个元素开始对列表元素逐个进行判断,直到找到了想要的结果,或者直到列表的结尾都没有找到想要找的元素。 代码如下: ...

    asp.net知识库

    随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,Hashtable,SortedList 这类对象是否...

    notepad的理想替代Notepad++

    藉由加強與優化許多函數及演算法,Notepad++ 致力於減少世界二氧化碳的排放。當使用較少的 CPU 功率,降低電腦系統能源消耗,Notepad++ 間接造就了綠化的環境。多虧它的輕巧與執行效率,Notepad++ 可完美地取代微軟...

    Notepad 5.2

    藉由加強與優化許多函數及演算法,Notepad++ 致力於減少世界二氧化碳的排放。當使用較少的 CPU 功率,降低電腦系統能源消耗,Notepad++ 間接造就了綠化的環境。多虧它的輕巧與執行效率,Notepad++ 可完美地取代微軟...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

Global site tag (gtag.js) - Google Analytics