建立数据库本地索引的C++实现源代码

第二题:

现在有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;
}


 

可能效率还不是很好,大家有更好的办法欢迎指出。。。

 

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值