您的位置:首页 > 编程语言

编程珠玑题目集锦

2015-11-15 16:48 417 查看
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

for i=[0,n)  
    for j=(i,n)  
    {  
        len =comlen(&c[i], &c
4000
[j]);  
        if(len > maxlen)  
        {  
            maxlen=len;  
            maxi=i;  
            maxj=j;  
        }  
    }  

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

int comlen(char * p, char * q)  
{  
    i=0;  
    while(*p && (*p++ == *q++))  
        i++;  
    return i;  
}  

解法2:建立后缀数组(指向字符的指针数组)
对banana后缀数组为:
a[0]: banana
a[1]:anana
...
a[5]:a
然后将后缀数组进行排序,扫描邻接数组,即可找出最常重复字符串。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: