建立数据库本地索引的C++实现源代码
2014-01-23 13:42
781 查看
第二题:
现在有100W条学生数据,格式如下:
姓名---------------描述
张三---------------爱好篮球
李四---------------爱好足球
王五---------------IT从业者,喜欢C++
姓名字段不超过4个汉字,描述字段不超过50个汉字,请实现一个查系统,要求如下:
1) 可以根据姓名快速查到描述信息
2) 可以根据描述信息(这里假设只通过一个字),比如“爱”,找到对应的姓名张三和李四
3) 不能利用现在的数据库系统
不考虑效率,采用STL容器实现:
考虑搜索效率,建立数据库本地索引,采用STL容器实现:
可能效率还不是很好,大家有更好的办法欢迎指出。。。
现在有100W条学生数据,格式如下:
姓名---------------描述
张三---------------爱好篮球
李四---------------爱好足球
王五---------------IT从业者,喜欢C++
姓名字段不超过4个汉字,描述字段不超过50个汉字,请实现一个查系统,要求如下:
1) 可以根据姓名快速查到描述信息
2) 可以根据描述信息(这里假设只通过一个字),比如“爱”,找到对应的姓名张三和李四
3) 不能利用现在的数据库系统
不考虑效率,采用STL容器实现:
// TestSTL.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <map> #include <string> #include <iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { map<string,string>person; person.insert(map<string,string>::value_type("张三","爱好篮球")); person.insert(map<string,string>::value_type("李四","爱好足球")); person.insert(map<string,string>::value_type("王五","喜欢读书")); map<string,string>::iterator iter= person.find("张三"); if(iter == person.end()) { cout<< "没有此人信息" <<endl; } else { cout<< (*iter).second<<endl; } map<string,string>::iterator iter2= person.begin(); for (;iter2!=person.end();iter2++) { if (!(*iter2).second.find("爱"))//string的find函数,找到返回0 { cout<< (*iter2).first << endl; } else { //cout<< (*iter2).second << endl; } } system("pause"); return 0; }
考虑搜索效率,建立数据库本地索引,采用STL容器实现:
// TestSTL.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <map> #include <vector> #include <string> #include <iostream> using namespace std; #define CHS_NUM (1000) //#define REPEAT_NUM (1000) int _tmain(int argc, _TCHAR* argv[]) { //map<string,string>person; //person.insert(map<string,string>::value_type("张三","爱好篮球")); //person.insert(map<string,string>::value_type("李四","爱好足球")); //person.insert(map<string,string>::value_type("王五","喜欢读书")); map<int,string>person;//个人姓名 person.insert(map<int,string>::value_type(1,"张三"));//先后插入第1-N条记录 person.insert(map<int,string>::value_type(2,"李四")); person.insert(map<int,string>::value_type(3,"王五")); map<int,string>description;//个人信息描述 description.insert(map<int,string>::value_type(1,"爱好篮球")); description.insert(map<int,string>::value_type(2,"爱好足球")); description.insert(map<int,string>::value_type(3,"喜欢看书")); //建索引(多字符集编码,不能用unicode的wchar_t) map<string,int>chs; chs.insert(map<string,int>::value_type("爱",0));//用string数组、vector也一样 chs.insert(map<string,int>::value_type("好",1)); chs.insert(map<string,int>::value_type("篮",2)); chs.insert(map<string,int>::value_type("球",3)); chs.insert(map<string,int>::value_type("足",4)); chs.insert(map<string,int>::value_type("喜",5)); chs.insert(map<string,int>::value_type("欢",6)); chs.insert(map<string,int>::value_type("看",7)); chs.insert(map<string,int>::value_type("书",8)); //每个汉字关联所在的第X条记录 vector<int> chs_index[CHS_NUM];//有CHS_NUM个汉字 chs_index[0].push_back(1);//(爱)第一条记录有这个汉字 chs_index[0].push_back(2);//(爱)第二条记录有这个汉字 chs_index[1].push_back(1);//(好)第一条记录有这个汉字 chs_index[1].push_back(2);//(好)第二条记录有这个汉字 //经常做“这种”搜索,建本地索引后的搜索效率会大大提高 map<string,int>::iterator iterKey =chs.find("爱"); int iKey=(*iterKey).second;//“爱”所在索引 //vector<int>::iterator iter= chs_index[iKey].begin(); for (int i=0; i<chs_index[iKey].size();i++)//遍历“汉字”向量 { cout << "第" << (i+1) << "条记录:" << person[i+1] << endl; } system("pause"); return 0; }
可能效率还不是很好,大家有更好的办法欢迎指出。。。
相关文章推荐
- iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?
- C#数据库编程(建立数据库表,数据库的连接,实现的源代码)
- C#数据库编程(建立数据库表,数据库的连接,实现的源代码)
- python实现简易数据库之一——存储和索引建立
- python实现简易数据库之一——存储和索引建立
- 从B树谈到数据库的索引实现原理
- 多样化实现Windows Phone 7本地数据库访问<下>
- 学习实践:使用模式,原则实现一个C++数据库訪问类
- 使用OrmLite数据库实现本地的账号登录,注册功能
- 基于Mysql Connector(C++)的数据库连接池的实现
- C++ 倒排索引的实现
- 数据库中索引的结构和什么情况下不适合建索引,数据库索引是如何实现的?
- 为数据库建立索引
- C#实现本地复制文件或者文件夹建立副本取名功能
- 数据库查询速度优化 1 建立索引
- mysql 数据库建立索引
- 本地文本索引及java的HashMap实现
- lucene对数据库建立索引
- sqlite本地数据库存储实现的流程
- 建立索引提高数据库查询速度的原理