11 2013 档案

摘要:这篇文章翻译自coolest way to generate combination,但不是全译,如有错误欢迎指出。文章中把他们这个快速生成所有的组合的方法称为 cool-lex方法,特点是最后可以优化成没有循环和分支判断语句的执行代码。下面,我们先来介绍一些定义。什么是前缀,什么是后缀我就不罗嗦了。定义\(S =s_1 ,s_2,s_3,\cdots s_m\)是一个字符串序列,字母集合为0,1。\(Sb = s_1 b,s_2 b,s_3 b,\cdots s_m b\) , \( S[i]=s_i\),\(first(S)=s_1\),\(last(S)=s_m\),\( \vec(S) 阅读全文
posted @ 2013-11-29 18:56 huangnima 阅读(1369) 评论(2) 推荐(0)
摘要:这方面的一般算法是递归,可是递归的效率略坑。另外一个经典的算法是next permutation,即从右边开始找到第一个非增序(从右到左)的最短序列,然后将这个序列最左端的数调换为递增序中第一个比他大的数,然后将右端排序为降序(从右到左),这样就得到了比当前排列刚刚好大一点的新的排列。如此往复就可以生成所有的排列,初始的是1234...n,最后是n....4321。每次生成的过程中都需要扫描尾端得到最短序列,然后二分查找第一个比他大的数,然后替换,然后剩下的重排序(其实重排序只需要将替换之后的排列逆序就可以了)。可以看出每次生成都需要交换大于等于两个位置的数,平摊下来代价仍然很大。下文所说的生 阅读全文
posted @ 2013-11-28 22:26 huangnima 阅读(1402) 评论(0) 推荐(0)
摘要:常数时间生成集合划分本文章是Shin-ichiro KAWANO and Shin-ichi NAKANO的论文 constant time generation of set partition的部分翻译,限于译者的水平,不保证准确,本文最后的插图也是来自此论文。绪论在实践中常常需要生成一个包含N个元素的K子集划分。其中每个子集都是非空子集,而且全集中每个元素都是相互可区分的,但是子集中的元素没有顺序观念,只是一个集合。因此我们给全集中每个元素生成一个标号,按任意顺序排列元素,然后从1标号到N。因此前述问题可以等价为1-N这些自然数分割为K个子集,下面要描述的算法就是这样一个渐进意义上的常数 阅读全文
posted @ 2013-11-10 23:41 huangnima 阅读(696) 评论(1) 推荐(0)