接触过数据库的对索引这个概念应该非常熟悉,通过建立索引,能大大的提高查询效率。
索引查找分为3种:
1、稠密、稀疏索引,两者概念大体相同,只不过稠密索引是每个搜索码都对应一个索引值,稀疏一个搜索码可能对应多个索引值
2、分块索引,把数组分块,索引中记录每个块中最大的值,并把索引按max排序,块内部可无序
3、倒排索引,我代码中没有实现这个,因为这个太简单了,只需要分割文本中关键字,把关键字作为索引,数组中对应的index作为值,插到一个字符串中即可
#include<iostream>
#define INFINITY 65535
using namespace std;
struct Object{
void* value;
int key;
};
struct Index{
int i;
//block index
int max;
int length;
void* value[5];
//dense index
//int key;
//void* value;
};
int main(){
Object _obj[5];
Index _index[5];
//b1
_obj[0].key=12;
_obj[0].value=(void*)"i'm 12";
//b2
_obj[1].key=107;
_obj[1].value=(void*)"i'm 107";
_obj[2].key=36;
_obj[2].value=(void*)"i'm 36";
//b3
_obj[3].key=18;
_obj[3].value=(void*)"i'm 18";
_obj[4].key=72;
_obj[4].value=(void*)"i'm 72";
//block index
for(int i=0;i<5;i++){
_index[i].max=INFINITY;
}
_index[0].max=12;
_index[0].length=1;
_index[0].value[0]=&_obj[0];
_index[1].max=107;
_index[1].length=2;
_index[1].value[0]=&_obj[1];
_index[1].value[1]=&_obj[2];
_index[2].max=72;
_index[2].length=2;
_index[2].value[0]=&_obj[3];
_index[2].value[1]=&_obj[4];
for(int i=0;i<3;i++){
for(int j=1;j>=0;j--){
if(_index[j].max>_index[j+1].max){
swap(_index[j],_index[j+1]);
}
}
}
for(int i=0;i<5;i++){
_index[i].i=i;
}
for(int i=0;i<5;i++){
cout<<_index[i].i<<' ';
}
cout<<endl;
for(int i=0;i<5;i++){
cout<<_index[i].max<<' ';
}
cout<<endl;
for(int i=0;i<5;i++){
if(_index[i].max<INFINITY){
for(int j=0;j<_index[i].length;j++){
cout<<(char*)((Object*)_index[i].value[j])->value<<' ';
}
}
}
cout<<endl;
//dense index
/*
for(int i=0;i<5;i++){
_index[i].key=_obj[i].key;
_index[i].value=&_obj[i];
}
for(int i=0;i<5;i++){
for(int j=3;j>=0;j--){
if(_index[j].key>_index[j+1].key){
swap(_index[j],_index[j+1]);
}
}
}
for(int i=0;i<5;i++){
_index[i].i=i;
}
for(int i=0;i<5;i++){
cout<<_index[i].i<<' ';
}
cout<<endl;
for(int i=0;i<5;i++){
cout<<_index[i].key<<' ';
}
cout<<endl;
for(int i=0;i<5;i++){
cout<<(char*)((Object*)_index[i].value)->value<<' ';
}
cout<<endl;*/
return 0;
}