2012年8月15日

编程珠玑:旋转交换技巧

摘要: 1.问题描述将一个n元一维向量向左旋转i个位置。例如,当n=8且i=3时,向量abcdefgh旋转为defghabc。简单的代码使用一个n元的中间向量在n步就能够完成该工作,你能否仅使用数十个额外字节的存储空间,正比于n的时间内完成向量旋转?2.解决思路旋转向量x其实就是交换向量ab的两段,得到向量ba。这里a代表x中的前i个元素。假设a比b短,将b分为bl和br,使得br具有与a相同的长度。交换a和br,也就是将ablbr 。序列a此时已处于其最终的位置,因此现在就集中到交换b的两部分。由于新问题与原来的问题具有相同的形式,我们可以递归地解决之。编程珠玑提供了更简单使用的方法,我们将问题看做 阅读全文

posted @ 2012-08-15 18:11 as_ 阅读(877) 评论(0) 推荐(0) 编辑

编程珠玑:取样问题

摘要: 1.问题描述程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。从概率的角度说,我们希望得到没有重复的有序选择,其中每个选择出现的概率相等。2.解决思路与代码实现编程珠玑上给出了四个函数1).genknuth():算法依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果是有序的代码C++实现:void genknuth(int m, int n) { for(int i = 0;i < 0;i++) { if((bigrand() % (n... 阅读全文

posted @ 2012-08-15 16:00 as_ 阅读(673) 评论(0) 推荐(0) 编辑

编程珠玑:用后缀数组寻找最长重复字符串

摘要: 1.基本概念子串:字符串 S 的子串 r[i..j] , i ≤ j ,表示 r 串中从 i 到 j 这一段,就是顺次排列 r[i],r[i+1],...,r[j] 形成的字符串。后缀:后缀是指从某个位置 i 开始到整个串末尾结束的一个特殊子串。字符串 r 的从 第 i 个字 符 开 始 的 后 缀 表 示 为 Suffix(i) ,也 就 是Suffix(i)=r[i..len(r)] 。后缀数组:后缀数组 SA 是一个一维数组,它保存 1..n 的某个排列 SA[1] ,SA[2] , …… , SA[n] ,并且保证 Suffix(SA[i]) < Suffix(SA[i+1]) 阅读全文

posted @ 2012-08-15 14:19 as_ 阅读(3150) 评论(1) 推荐(0) 编辑

导航