编程珠玑题目集锦

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:
for i=[0,n)
    for j=(i,n)
    {
        len =comlen(&c[i], &c[j]);
        if(len > maxlen)
        {
            maxlen=len;
            maxi=i;
            maxj=j;
        }
    }


其中comlen函数返回两个字符串从开始位置相同字符个数。
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
然后将后缀数组进行排序,扫描邻接数组,即可找出最常重复字符串。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值