84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
用C或C++实现从一个比较大的txt文件里查找一个单词,txt文件里每行一个单词,按a~z从上到下排列,有什么好的算法,用什么数据结构可以提高查询的速度和效率??
闭关修行中......
这种情况考虑下面这种数据结构: 字典树(DictTree)
typedef struct _dict_tree_ { struct _dict_tree_ * dt[TREENODENUM]; char c ; char flag ; }DT ;
具体操作就是
所谓的26叉树,按照每个字母对应的子节点存储。 然后逐行读取单词后插入到树中,比如说: 单词:abandon 插入树的顺序就是 a->b->a->n->d->o->n 插入每个字母对应这个树的子节点
int len = strlen(str); while( i < len ) { index = str[i] - 97 ; /*通过 index 来找到子节点*/ if( pt->dt[index] == NULL ) { pt->dt[index] = ( DT *)malloc( sizeof( DT) ); pt->dt[index]->c = str[i] ; pt->dt[index]->flag = EMPTY ; for( j = 0 ; j < TREENODENUM ; j++ ) { pt->dt[index]->dt[j] = NULL ; } } pt = pt->dt[index] ; i++; }
查找就是顺着字母判断子节点是否为空
int len = strlen(str); while( i != len ) { index = str[i] - 97 ; if( pt->dt[index] == NULL ) return 0 ; pt = pt->dt[index] ; i++; }
如果允许对txt文件预处理的话,可以用倒排索引来实现。
如果txt文件只查一次、以后再也用不到的话,那就没有。
按你的题目来看,似乎这些单词都是排过序的?如果是有序的话,就可以按照二分的方法来做。先读取文件总共由多少行,然后以第一个字符来查找,再按照第二个字符,以此类推,这个算法的好处是不用读取所有文件到内存中。
如果修改一下问题,这个txt文件有1T大,怎么弄会好点。声望不够,改不了。
这种情况考虑下面这种数据结构: 字典树(DictTree)
具体操作就是
所谓的26叉树,按照每个字母对应的子节点存储。 然后逐行读取单词后插入到树中,比如说: 单词:abandon 插入树的顺序就是 a->b->a->n->d->o->n 插入每个字母对应这个树的子节点
查找就是顺着字母判断子节点是否为空
如果允许对txt文件预处理的话,可以用倒排索引来实现。
如果txt文件只查一次、以后再也用不到的话,那就没有。
按你的题目来看,似乎这些单词都是排过序的?如果是有序的话,就可以按照二分的方法来做。先读取文件总共由多少行,然后以第一个字符来查找,再按照第二个字符,以此类推,这个算法的好处是不用读取所有文件到内存中。
如果修改一下问题,这个txt文件有1T大,怎么弄会好点。声望不够,改不了。