免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2007-04-02 10:08 |只看该作者
不行,在BEGIN 里面用的话,貌似得这么写 ^_^
awk -vword="good" 'BEGIN { print word; }'

论坛徽章:
0
22 [报告]
发表于 2007-04-02 11:54 |只看该作者
如果你只是求若干字母的排列组合,可以用下面的代码编译后: echo "abaccedf" | ./mytool
我的机器上求8个字母的全排列也只要0.91秒。
要是不输出到屏幕上,而是重定向到文件里,比如 echo "abcdefgh" | ./mytool > data.txt
只需要0.16秒

求全排列的程序


  1. #include <iostream>
  2. #include <vector>
  3. #include <iterator>
  4. #include <algorithm>

  5. int main()
  6. {
  7.   using namespace std;
  8.   typedef vector<char> vec_char;
  9.   vec_char thestr;
  10.   copy(istream_iterator<char>(cin),istream_iterator<char>(),back_insert_iterator<vec_char>(thestr));
  11.   sort(thestr.begin(),thestr.end());
  12.   while(next_permutation(thestr.begin(),thestr.end()))
  13.   {
  14.      copy(thestr.begin(),thestr.end(),ostreambuf_iterator<char>(cout));
  15.      cout << endl;
  16.   }
  17.   return 0;
  18. }

复制代码

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
23 [报告]
发表于 2007-04-02 12:47 |只看该作者
很奇怪,你的第一个mytool程序,我只有一行的输出
$ echo "abaccedf" | ./mytool
abaccefd

可能我们的环境不一样。我公司用Solaris.但在自己电脑上用cygwin。

但是你最新的mytool, 我可以得到正常输出。只需3秒左右。

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
24 [报告]
发表于 2007-04-02 13:14 |只看该作者
原帖由 rdcwayx 于 2007-4-2 07:37 发表


7 9999999
./c1: line 8: 0000008: value too great for base (error token is "0000008"

7个9 输出正确,但是还是有后面的问题。


是取字符串固定位置的字符的操作又用错了,而且应该用7进制,却用成10进制了
今天上班在机器上测了一下:  :
  1. array=(a c r d m a g)
  2. loop=`perl -e "print 6 x ${#array[@]}"`
  3. loop=`echo "obase=10; ibase=7; $loop" | bc -l`

  4. for ((i=1; i<=loop; i++))
  5. do
  6.         j=`echo "obase=7; ibase=10; $i" | bc -l`
  7.         j=`printf %07d $j`
  8.         echo  ${array[${j:0:1}]} ${array[${j:1:1}]} ${array[${j:2:1}]} \
  9.               ${array[${j:3:1}]} ${array[${j:4:1}]} ${array[${j:5:1}]} \
  10.               ${array[${j:6:1}]}
  11. done #>file

  12. #sort file | uniq
复制代码

---------------------------------------------------
这样写频繁调用外部命令,效率很低。还是用awk,perl,或像doctorjxd 那样用C写 效率会比较高。

[ 本帖最后由 yjh777 于 2007-4-2 13:30 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2007-04-02 13:44 |只看该作者
原帖由 rdcwayx 于 2007-4-2 12:47 发表
很奇怪,你的第一个mytool程序,我只有一行的输出
$ echo "abaccedf" | ./mytool
abaccefd

可能我们的环境不一样。我公司用Solaris.但在自己电脑上用cygwin。

但是你最新的mytool, 我可以得到 ...



开始给的mytool是只输出一行,便于在脚本中分行处理。但是每次起一个进程速度很慢。
后来给的C++代码是输出全部的序列。

echo "abaccedf" | ./mytool 在我的机器上显示全部序列用0.21秒。
echo "abaccedf" | ./mytool > result.txt 花0.05秒。
但是 cat result.txt 也花0.20 秒。 说明时间主要花在IO上。

我用的是FreeBSD。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
26 [报告]
发表于 2007-04-02 13:59 |只看该作者
原帖由 doctorjxd 于 2007-4-2 13:44 发表



开始给的mytool是只输出一行,便于在脚本中分行处理。但是每次起一个进程速度很慢。
后来给的C++代码是输出全部的序列。

echo "abaccedf" | ./mytool 在我的机器上显示全部序列用0.21秒。
e ...


是这样啊,那么你的电脑确实不错。跑得很快啊。

论坛徽章:
0
27 [报告]
发表于 2007-04-02 16:33 |只看该作者

标准的next_permutation实现方式

  1. public boolean nextPermutation(int[] a) {
  2.                 int i, j;
  3.                 for (i = a.length - 1; i > 0; i--) {
  4.                         if (a[i] > a[i - 1]) {
  5.                                 break;
  6.                         }
  7.                 }
  8.                 i--;
  9.                 if (i == -1)
  10.                         return false;
  11.                 for (j = a.length - 1; j >= 0; j--) {
  12.                         if (a[j] > a[i])
  13.                                 break;
  14.                 }
  15.                 int t = a[j];
  16.                 a[j] = a[i];
  17.                 a[i] = t;
  18.                 for (i = i + 1, j = a.length - 1; i < j; i++, j--) {
  19.                         t = a[i];
  20.                         a[i] = a[j];
  21.                         a[j] = t;
  22.                 }
  23.                 return true;
  24.         }
复制代码

论坛徽章:
0
28 [报告]
发表于 2007-04-02 18:18 |只看该作者
还是模板的效率高




  1.   template<typename _BidirectionalIterator>
  2.     bool
  3.     next_permutation(_BidirectionalIterator __first,
  4.                      _BidirectionalIterator __last)
  5.     {
  6.       // concept requirements
  7.       __glibcxx_function_requires(_BidirectionalIteratorConcept<
  8.                                   _BidirectionalIterator>)
  9.       __glibcxx_function_requires(_LessThanComparableConcept<
  10.             typename iterator_traits<_BidirectionalIterator>::value_type>)
  11.       __glibcxx_requires_valid_range(__first, __last);

  12.       if (__first == __last)
  13.         return false;
  14.       _BidirectionalIterator __i = __first;
  15.       ++__i;
  16.       if (__i == __last)
  17.         return false;
  18.       __i = __last;
  19.       --__i;

  20.       for(;;)
  21.         {
  22.           _BidirectionalIterator __ii = __i;
  23.           --__i;
  24.           if (*__i < *__ii)
  25.             {
  26.               _BidirectionalIterator __j = __last;
  27.               while (!(*__i < *--__j))
  28.                 {}
  29.               std::iter_swap(__i, __j);
  30.               std::reverse(__ii, __last);
  31.               return true;
  32.             }
  33.           if (__i == __first)
  34.             {
  35.               std::reverse(__first, __last);
  36.               return false;
  37.             }
  38.         }
  39.     }


复制代码

论坛徽章:
84
每日论坛发贴之星
日期:2015-12-29 06:20:00每日论坛发贴之星
日期:2016-01-16 06:20:00每周论坛发贴之星
日期:2016-01-17 22:22:00程序设计版块每日发帖之星
日期:2016-01-20 06:20:00每日论坛发贴之星
日期:2016-01-20 06:20:00程序设计版块每日发帖之星
日期:2016-01-21 06:20:00每日论坛发贴之星
日期:2016-01-21 06:20:00程序设计版块每日发帖之星
日期:2016-01-23 06:20:00程序设计版块每日发帖之星
日期:2016-01-31 06:20:00数据库技术版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-16 06:20:00程序设计版块每日发帖之星
日期:2016-01-14 06:20:00
29 [报告]
发表于 2007-04-02 18:25 |只看该作者
这个帖可以转到 C/C++ 版了,名为排列组合算法。

论坛徽章:
0
30 [报告]
发表于 2007-04-02 18:28 |只看该作者
原帖由 rdcwayx 于 2007-4-2 13:59 发表


是这样啊,那么你的电脑确实不错。跑得很快啊。


我的计算机是Celeron(R) CPU 2.53GHz,256M memory.
是两年前配置的。

难道是FreeBSD比Cygwin的Gcc速度快很多?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP