用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大,怎么弄会好点。声望不够,改不了。