假如10個學生數據(學號 成績)不重複,查找數據的思路:ios
1.從頭至尾順序遍歷。O(N)數組
2.排序後,二分查找。O(logN)大數據
3.創建索引,直接定位。O(1)ui
如何創建索引?spa
此處假設學生學號數據類型int,範圍【0,100】。3d
學生的學號做爲數據存放數組的索引下標。code
實際狀況中,學號每每以字符串方式存在,數據也多位於文件中,則能夠將字符串和文件中地址位置進行關聯。查找時,經過字符串查找到文件地址,進而直接獲取數據便可。由於學號具備惟一性,因此將學號和地址做爲一對hash值進行存儲便可。或者按照學號進行排序存儲,搜索按照二分查找學號,進而找到對應的地址(文件中的位置或者內存中的位置),進而快速獲取對應的數據。此方法適用於大數據量的預處理。排序
#include <iostream>索引
#include <memory>內存
#include <string>
#include "StringTools.h"
using namespace std;
struct StStudent
{
string no;
int score;
};
void printStudent(const StStudent& student)
{
cout<<"student "<<student.no<<" "
<<"score: "<<student.score<<endl;
}
// 10 23 34 83 28 25 82 73 92 13
int main()
{
const int INVALIDATE_INDEX = -1;
// create index when read data
int data_index[101];
memset(data_index,INVALIDATE_INDEX,sizeof(data_index));
StStudent arr[10];
// start read data
int tmp[10] = {10,23,34,83,28,25,82,73,92,13};
for (int i= 0; i<10; ++i)
{
StStudent student;
student.no = StringTools::toString(tmp[i]);
student.score = i*10+5; // score assignment
arr[i] = student;
// build index for item
data_index[tmp[i]] = i;
}
// 1.input find NO.
int findNo = 34;
// 2.find index
int findIndex = data_index[findNo];
if (findIndex == INVALIDATE_INDEX)
{
cout<<"can not find NO."<<endl;
}
else
{
StStudent findItem = arr[findIndex];
printStudent(findItem);
}
return 0;
}
student 34 score: 25
Program ended with exit code: 0