一道关于查找的算法题
是我在别处看见的,没有什么思路,跪求各位大侠给个思路,谢了。
注意:请尽可能详细描述你的数据结构、系统架构、设计思路等。建议多写一些伪代码或者流程说明。
1. 考虑一个字符串替换的过程,在一个文本文件中含有一些文本内容和一些需要替换的变量,变量的格式为“$Var$”,原来的“$”使用“$$”进行转义,原来的“$$”表示为“$$$”。我们将含有变量的文件称为模板(文件名为t),文本文件的平均长度为100K。另外,还有一系列的变量文件,里面为变量名和变量值的对应关系(文件名为1.v , 2.v… n.v),每个变量文件包含的变量数在百万数量级,且变量排列次序不定。现要求将,模板里的变量分别用变量文件里的变量替换,并将生成的文件写成(1.r, 2.r… n.r)。
要求:从算法和实现上和实现技术上的细节对程序进行优化,尽量使程序高效。程序运行环境为2G内存,4CPU。阐明主要思路,给出伪码和说明,可以着重指出你使用的优化技术。
例子:模板文件为
This is an $FF$ $$. I like $FF$ and $FA$。
变量文件为
1.v
FF : banana
FA : apple
2.v
FA: 苹果
FF : 香蕉
则生成文件为
1.r
This is an banana $$. I like banana and apple。
2.r
This is an香蕉 $$. I like 香蕉and苹果。
[解决办法]
值得学习,
[解决办法]
强烈建议你用脚本来做这个东西,或者引入一个c++的正则表达式类。
如果用脚本perl的话,就是一个正则式替换的问题,缺点是脚本语言的速度可能会比较慢。
如果引入c++的正则式类的话,应该问题也比较简单,缺点是很多c++的正则表达式的表示方式比较混乱。
[解决办法]
要效率就不用脚本,简单的读出写入文件就可以了,中间判断一下$并进行处理。
[解决办法]
[解决办法]
这个东西的实现明显不复杂,复杂的是优化,这里面确实有很多东西优化。
1,既然每个文件的条数都百万数量级的,查找肯定是最影响性能的。既然有2G内存,4CPU可以用,不妨考虑分段使用二叉树(这个我不能肯定,因为既然是无序的,同时又可以使用多CPU,所以对并行算法要做一个分析),并且用四个进程来进行检索(每个进程都独占一个CPU)。思路是每个进程只读指定大小的块(比如只读20M),由于索引是唯一的,如果一个进程找到了,那么所有4个进程就都可以结束,转而处理下一个文件。
2,由于检索是需要时间的,从磁盘读取同样需要时间,所以可以加入预读机制。既在处理过程中另外有一个进程负责I/O。由于I/O不会占用很多的时间,所以不需要独占一个CPU。
3,使用异步I/O,使CPU的等待时间进一步减少。
4,让负责I/O的进程负责把结果写入文件,因为使用了异步I/O,所以不会太占用CPU的。
我能想到的大概就这么多了,主要的部分应该是对查找的优化和内存使用的优化。因为这种东西的瓶颈就两个,一个是磁盘读写速度不够,容易造成CPU等待,另一个就是条目太多,查找会很慢。所以,尽可能的并行吧!