免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: rdcwayx
打印 上一主题 下一主题

排列组合问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-04-03 13:32 |显示全部楼层
自定义的next_collection,呵呵。
效率比上面的代码有提高,结构又清晰。

论坛徽章:
0
12 [报告]
发表于 2007-04-03 22:26 |显示全部楼层
代码


  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>
  5. #include "combination.hpp" //这个文件的代码在下一个帖子,是老美的作品。

  6. int main()
  7. {
  8.   using namespace std;
  9.   using benbear::next_combination;
  10.   typedef vector<char> vec_char;
  11.   vec_char thestr;
  12.   copy(istream_iterator<char>(cin),istream_iterator<char>(),back_insert_iterator<vec_char>(thestr));
  13.   sort(thestr.begin(),thestr.end());
  14.   for(int i=1;i<=thestr.size();i++)
  15.   {
  16.     do
  17.     {
  18.       do
  19.       {
  20.          copy(thestr.begin(),thestr.begin()+i,ostreambuf_iterator<char>(cout));
  21.          cout << endl;
  22.       } while(next_permutation(thestr.begin(),thestr.begin()+i));
  23.     }while(next_combination(thestr.begin(),thestr.begin()+i,thestr.end()));
  24.   }
  25.   return 0;
  26. }

复制代码

[ 本帖最后由 doctorjxd 于 2007-4-3 22:43 编辑 ]

论坛徽章:
0
13 [报告]
发表于 2007-04-03 22:34 |显示全部楼层
还是顺手把combination.hpp的内容给你贴上来吧。
是老美的作品。



  1. // Combination algorithm implementation

  2. // Copyright (C) 2004, BenBear
  3. //
  4. // This file is an algorithm of the combination. This library is free
  5. // software; you can redistribute it and/or modify it under the terms
  6. // of the GNU General Public License as published by the Free Software
  7. // Foundation; either version 2, or (at your option) any later
  8. // version.

  9. // This library is distributed in the hope that it will be useful, but
  10. // WITHOUT ANY WARRANTY; without even the implied warranty of
  11. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12. // General Public License for more details.

  13. // You should have received a copy of the GNU General Public License
  14. // along with this library; see the file COPYING.  If not, write to
  15. // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
  16. // MA 02111-1307, USA.

  17. #include <algorithm>

  18. namespace benbear
  19. {

  20. using namespace std;

  21. template <typename BiIterator>
  22. void
  23. sort_combination (BiIterator first, BiIterator last)
  24. {
  25.   if (first == last) // no element
  26.     return;

  27.   BiIterator i = first;
  28.   ++i;
  29.   if (i == last)     // one element
  30.     return;
  31.   
  32.   int half = distance (first, last) / 2;  // half of the length
  33.   BiIterator middle = first;
  34.   advance (middle, half);  // middle += half

  35.   sort_combination (first, middle);     // sort first part
  36.   sort_combination (middle, last);      // sort second part

  37.   inplace_merge (first, middle, last);  // merge two parts
  38. }

  39. template <typename BiIterator>
  40. void
  41. adjust_combination (BiIterator first, BiIterator middle, BiIterator last)
  42. {
  43.   // the front part or the back part have no elements
  44.   if ((first == middle) || (middle == last))
  45.     return;

  46.   sort_combination (first, middle);
  47.   sort_combination (middle, last);

  48.   BiIterator b = middle;
  49.   --b;
  50.   BiIterator j = lower_bound (middle, last, *b);
  51.   reverse (j, last);
  52.   reverse (middle, last);
  53. }

  54. template <typename BiIterator>
  55. void
  56. init_combination (BiIterator first, BiIterator middle, BiIterator last,
  57.     bool min)
  58. {
  59.   sort_combination (first, last);

  60.   if (min == false)
  61.     {
  62.       // the max combination
  63.       reverse (first, last);
  64.       reverse (first, middle);
  65.     }
  66. }

  67. template <typename BiIterator>
  68. bool
  69. next_combination (BiIterator first, BiIterator middle, BiIterator last)
  70. {
  71.   if ((first == middle) || (middle == last))
  72.     return false;

  73.   // last element of [first, middle)
  74.   BiIterator b = middle;
  75.   --b;

  76.   if (*b < *middle)
  77.     {
  78.       BiIterator j = b;
  79.       while ((++b != last) && (*j < *b))
  80. {
  81.    iter_swap (j, b);
  82.    j = b;
  83. }
  84.       return true;
  85.     }

  86.   BiIterator e = last;
  87.   --e;
  88.   while (e != middle)
  89.     {
  90.       BiIterator k = e;
  91.       --k;
  92.       if (!(*k < *e))
  93. e = k;
  94.       else
  95. break;
  96.     }
  97.   
  98.   BiIterator f = e;
  99.   ++f;
  100.   while ((f != last) && !(*f < *e))
  101.     ++f;

  102.   if (!(*first < *e))
  103.     {
  104.       reverse (first, middle);
  105.       reverse (first, last);
  106.       return false;
  107.     }

  108.   if (*b < *e)
  109.     {
  110.       BiIterator bb = b;
  111.       while ((++bb != e) && !(*b < *bb))
  112. ;
  113.       reverse (bb, f);
  114.       reverse (b, f);
  115.     }
  116.   else
  117.     {
  118.       BiIterator i = b;
  119.       while (!(*--i < *e))
  120. ;
  121.       
  122.       BiIterator j = last;
  123.       while (!(*i < *--j))
  124. ;

  125.       iter_swap (i, j);
  126.       reverse (++i, middle);
  127.       reverse (i, j);
  128.     }
  129.   return true;
  130. }

  131. template <typename BiIterator>
  132. bool
  133. prev_combination (BiIterator first, BiIterator middle, BiIterator last)
  134. {
  135.   if ((first == middle) || (middle == last))
  136.     return false;
  137.   
  138.   BiIterator b = middle;
  139.   --b;
  140.   
  141.   if (*middle < *b)
  142.     {
  143.       BiIterator i = upper_bound (first, middle, *middle);
  144.       if (i != b)
  145. iter_swap (i, middle);
  146.       else
  147. {
  148.    BiIterator s = middle;
  149.    while ((++s != last) && !(*s < *middle))
  150.      ;
  151.    reverse (b, s);
  152. }

  153.       return true;
  154.     }
  155.   
  156.   BiIterator e = last;
  157.   --e;
  158.   while (e != middle)
  159.     {
  160.       BiIterator k = e;
  161.       --k;
  162.       if (!(*k < *e))
  163. e = k;
  164.       else
  165. break;
  166.     }
  167.   
  168.   BiIterator f = e;
  169.   ++f;
  170.   while ((f != last) && !(*f < *e))
  171.     ++f;

  172.   if (f == last)
  173.     {
  174.       reverse (first, last);
  175.       reverse (first, middle);
  176.       return false;
  177.     }

  178.   BiIterator i = upper_bound (first, middle, *f);
  179.   if (i == b)
  180.     {
  181.       BiIterator s = f;
  182.       while ((++s != last) && !(*s < *f))
  183. ;

  184.       reverse (b, f);
  185.       reverse (b, s);
  186.     }
  187.   else
  188.     {
  189.       iter_swap (i, f);
  190.       reverse (++i, f);
  191.       reverse (i, middle);
  192.     }
  193.   return true;
  194. }

  195. } // end of namespace benbear



复制代码

论坛徽章:
0
14 [报告]
发表于 2007-04-04 15:32 |显示全部楼层
自己理解最深入的语言就是效率最高的语言。
自己一知半解,写一条语句都要费半天力的语言就是效率最低的语言。

论坛徽章:
0
15 [报告]
发表于 2007-04-04 15:43 |显示全部楼层
没有必要为语言的优劣而争论。

语言没有差别,
差别产生于不同人不同的理解。

世间的事物绝大多数都不能用好与坏来简单区分。但不同的人基于不同的立场,都会有不同的结论。

论坛徽章:
0
16 [报告]
发表于 2007-04-04 15:45 |显示全部楼层
本贴有可能变成水贴,呵呵。

论坛徽章:
0
17 [报告]
发表于 2007-04-05 10:23 |显示全部楼层
不宜继续扯下去。

[ 本帖最后由 doctorjxd 于 2007-4-5 10:26 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP