1. 程式人生 > >建立資料庫本地索引的C++實現原始碼

建立資料庫本地索引的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;
}
可能效率還不是很好,大家有更好的辦法歡迎指出。。。