编程珠玑题目集锦

来源:互联网 发布:依云软件官方网站 编辑:程序博客网 时间:2024/05/18 12:39

1. 10^n个整数(亿级)的排序


输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个数都小于等于n,且n=10^7。
输出:得到按从小到大升序排列的包含所有输入的整数的列表。

《编程珠玑》中提出的问题,有三种解法:

(1)磁盘合并排序

先将所有数据分成多个小文件,多个小文件采用内部排序后,再用多路合并排序完成排序输出。

        总数据为n, 内存中采用内部排序最多m。先分成n/m个小文件,再内部排序,第三部读取所有小文件,每次将最小的数输出即可。

(2)多通道

0~10^k-1

10^k~2*10^k-1

...

分成m个通道,读m次,每次读取在通道范围内的数,按顺序写到对应的输出文件,完成排序。

(3)bitmap排序

在内存中开10^7比特,均初始化为0,若出现则设置为1,输出为1的数即可。



2.  包含32位整数的顺序文件,至多包含40亿个整数,查找不存在的整数。有足够内存;只有上百B内存

解法1:bitmap

解法2:二分查找

给一个整数范围,选取一个计数中点,然后计算上下范围的个数,较小的一半范围内必定包含遗漏元素。

3.  n维向量向左旋转i个位置。如n=8,i=3,abcdefgh变成defghabc

解法1:开i个额外空间

解法2:t=x[0],然后0<——i<——2i<——3i...需要0覆盖时,选t。若数据没有全动,从x[1]继续执行。

解法3: reverse(0,i-1); reverse(i,n-1);reverse(0,n-1)

cba defgh, cba hgfed, defgh abc


4. 给一个单词词典,找出变位词集。如abc、cba、bca等为变位词

第一步,对输入文件进行签名,如badd签名成a1b1d2、abdd等。

第二步,按签名对字符串排序

第三部,合并统一签名字符串


5. 找出一个字符串中最长的重复子字符串。如abacdbac中的bac。

解法1:

[cpp] view plaincopy


  1. for i=[0,n)  
  2.     for j=(i,n)  
  3.     {  
  4.         len =comlen(&c[i], &c[j]);  
  5.         if(len > maxlen)  
  6.         {  
  7.             maxlen=len;  
  8.             maxi=i;  
  9.             maxj=j;  
  10.         }  
  11.     }  



其中comlen函数返回两个字符串从开始位置相同字符个数。

[cpp] view plaincopy


  1. int comlen(char * p, char * q)  
  2. {  
  3.     i=0;  
  4.     while(*p && (*p++ == *q++))  
  5.         i++;  
  6.     return i;  
  7. }  


解法2:建立后缀数组(指向字符的指针数组)

对banana后缀数组为:

a[0]: banana

a[1]:anana

...

a[5]:a

然后将后缀数组进行排序,扫描邻接数组,即可找出最常重复字符串。

0 0
原创粉丝点击