编程任务:
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
我自己到是写出来了,但是不知道理没理解对,总觉得貌似性能不够好。$file = file('1.txt');
$m = 'wanderer';//搜索的单词
$str = '';
foreach ($file as $line => $v) {
$arr = explode(' ', $v);
$key = array_search($m, $arr);
if ($key !== false) {
$str .= ($line + 1) . ',' . ($key + 1) . ' ';
}
}
var_dump($str);
var_dump(memory_get_usage()); //输出占用内存
/*结果为:
string '94,22 96,25 ' (length=12)
int 3049936
*/不知道各位高手们还有更优化的方法没,多多指教
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
我自己到是写出来了,但是不知道理没理解对,总觉得貌似性能不够好。$file = file('1.txt');
$m = 'wanderer';//搜索的单词
$str = '';
foreach ($file as $line => $v) {
$arr = explode(' ', $v);
$key = array_search($m, $arr);
if ($key !== false) {
$str .= ($line + 1) . ',' . ($key + 1) . ' ';
}
}
var_dump($str);
var_dump(memory_get_usage()); //输出占用内存
/*结果为:
string '94,22 96,25 ' (length=12)
int 3049936
*/不知道各位高手们还有更优化的方法没,多多指教
1、把圣经(bbe.txt)背熟 (预处理数据)
2、飞快的回答出这个单词在第几行第几个单词位置 (从预处理的数据中能够很快的获取相关单词的信息)预处理数据的想法:
将文本数据的单词转到key/value的形式。key为单词,value为所在的行列信息。这样每个单词都可以通过key值快速索引。算法的简单思路:
循环读取文件,每次读取一行,然后计算这一行的所有单词,已经存在的key,追加value,不存在的key,记录key/value。最后就能形成key/value的集合。因为元操作只是循环读取每一行,所以算法复杂度应该是O(n),而每次读取一行,能避免占用大量内存。
有一款程序《162100帖吧》采用的是关系型文本数据库,可能用得上,它的说明为:1、程序采用关系型文本数据库技术:
2、定位读取记录——运行快捷,第100000条记录与第100条记录的读取速度是一样的
3、精密存储数据——精密计算数据存放位置,定位写入,只写该写的地方,而不是全写数据,从而不会出现损失数据的情况
4、空间毫不浪费——被删除记录遗留的空闲空间被详细记载、优化分配、充分利用,超级超强承载地址为:http://download.162100.com/。建议看一看,有没有帮助。