以下是一道腾讯php程序员面试题目,在网上看到的,具体可以查看 http://www.xhttp.cn/2010/05/2 。
【编程任务】:
1、我们碰到了大麻烦,一个新来的传教士惹恼了上帝,上帝很愤怒,要求我们把圣经(bbe.txt)背熟,直至他说哪个单词,我们就要飞快的回答出这个单词在第几行第几个单词位置。听说你是个优秀的程序员,那么髟助我们完成这个不可能的任务吧。
要求如下:
1)/myworks /example/bbe.txt,98版本英文圣经一本
2)输入部分要求如下:php ./example.php [单词]
3)输出部分如下:[单词] 1,2 2,4 5,6 表示:此单词在1行2列(第二个单词),2行4列...
说明:
1)此文本 4MB之巨...
2)单词的含义:由英文字母(大小写),数字(0-9)组成的串
3)提供给你的机器OS为ubuntu 9.10,内存只有1G,而且,很不幸的,其中700M用来做了别的
4)上机考试不允许上网,但我装了man文档以及读取CHM以及PDF的阅读器,在电脑的桌面的CHM文件夹中,有相应的PHP参考手册 5)算法复杂度要求不能大于O(N^2)(就是N的平方)
6)什么?PHP低效且用起来不顺手,好的,你可以用别的语言来实现。但注意:提供给你的机器上只有python 2.4/perl 5.8/gcc[g++] 4.1
【分析思路】:
1,首先分析 bbe.txt 文件,生成索引。
索引文件以 单词为key, 值就是 位置字符串(1,2 3,4 5,6 )。
2,将索引压缩后,分片保存在不同文件中。
3, 查询时,依次读取不同索引文件到内存中,进行检索。
4, 其实,2、3部分可以使用哈希函数,分别映射到不同的索引文件。检索的时候,根据检索词哈希后的值可以直接确定需要调入那个索引文件。这样精确定位之后,不但省时间,而且省内存,呵呵。
5, 查询的时候,读取索引文件到内存中,直接使用数组下标即可找到答案。
(以上为思路分析,代码欠奉。)