1.1基本介绍
1.2 准备工作
² 5个源文件
Test0.txt, Test1.txt,Test2.txt, Test3.txt, Test4.txt
里面包含了一些英文句子,由单词组成,空格分开
² Index.txt
由文件ID和文件的绝对路径构成,一个文件占一行
² Result.txt
显示结果的文件,倒排索引表将在里面显示出来,单词后面跟的文件ID
1.3算法描述
² 使用C++的STL中的MAP存储索引表,string 存储单词,vector存储文件ID,循环读入文件,将文件中的单词一个一个读入进来,再添加上文件ID,直到所有的文件都被处理完。遍历索引表MAP,输出结果。
² 字典树建立,例程将26个字母映射成0~25的数字,每读入一个的单词插入单词的同时建立起字典树,每个字母有26个后继,用malloc动态分配空间,
该程序将求出输入以某个字符串为前缀的单词数量。
1.4算法说明
² 只能分割英文单词,建立索引表,中文词组无法分割出来
² 没有添加对符号的处理,符号只能随其紧挨的单词一起出现
² 没有统计单词频率信息
² 没有将单词统一处理成为它们的原型,增加了索引表的长度
² 因为map默认按键值弱排序,因此输出的结果是按单词的字典序输出
² index.txt,result.txt是用freopen重定向打开的,这2个文件必须在源代码的同一目录下才能运行成功。
源输入文件是以绝对路径保存在index.txt中,移植运行时需改变路径
源代码:
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <map>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
map<string,vector<int>> indextable; // 倒排索引表
void init() // 初始化表
{
indextable.clear();
}
int main()
{
//重定向到index.txt读入,输出到result.txt. index.txt,result.txt都在当前目录下
freopen("index.txt","r",stdin);
freopen("result.txt","w",stdout);
init();
int id;
string filepath; // 文件路径名
while(cin>>id>>filepath)
{
ifstream fin(filepath.c_str()); // 打开文件路径下的文件
string s;
while(fin>>s) // 一个单词一个单词的读入
{
indextable[s].push_back(id); // 把当前单词对应的的文件名加入到单词对应的ID数组中
}
}
map<string,vector<int>>::iterator map_it; // 索引迭代器
map_it = indextable.begin();
while(map_it != indextable.end()) // 遍历整个索引表输出,因为MAP的键值是严格弱排序,因此输出是字典序
{
string tmp = map_it->first;
cout << tmp << " ";
for(int i = 0;i != indextable[tmp].size();i++)
cout << indextable[tmp][i] << " ";
cout << endl;
map_it++;
}
cin.get();
cin.get();
return 0;
}
来自于:http://m.blog.csdn.net/blog/lentty1452/8679813