/*
名称:索引查找(分块查找)
说明:本程序写的有不少问题,用的是STL,可能STL内部的机制不是很熟悉,一直没改成功先贴上来。以后有时间在重新修改吧。
对于索引查找来说,从某种程度上说,其是二分查找和顺序查找的一种折中。它要求有两个表一个索引表,每个索引表中的索引对应一个元素表(此处的索引即为对应元素表中元素的最大值)。还要求表间有序,表内无序。这样首先在索引表中查到待查找元素是在哪个元素表中,然后在对应的元素表中进行查询。
其时间复杂度分为两部分,一个是在索引表中查找,为(b+1)(如果采取顺序查找的话,当然这里也可以采取折半查找)次(b为分的块数,也就是索影表中元素的个数)。另一个是在元素表中的查找为(n+1)。
*/
#include<iostream>
#include <vector>
#include <typeinfo>
#define MAXSIZE 100
using namespace std;
//索引节点
typedef struct Indexnode
{
int max_data;
vector <int> *p_index; //?????
}IndexNode;
//创建索引表
void CreateIndexTable(vector<IndexNode> &index_table,vector<int> &ElemTable)
{
int val = 0;
vector<int>:: iterator iter;
vector<IndexNode>:: iterator iter1;
//找到单个元素表中最大的数,用它构造节点,插入索引表中
for(iter = ElemTable.begin();iter != ElemTable.end();++iter)
{
if(*iter >= val)
val = *iter;
}
//在索引表中找到其要插入的位置
for(iter1 = index_table.begin();iter1 != index_table.end();++iter1)
{
if(val <= iter1->max_data)
break;
}
//构造要插入的索引表结点
IndexNode *temp = new IndexNode;
temp->max_data = val;
temp->p_index = &ElemTable; //?????
index_table.insert(iter1,*temp); //插入索引表结点
}
//索引查找
int SearchIndex(vector<IndexNode> &index_table,int key)
{
vector<IndexNode>:: iterator iter1;
vector<int> *elem_index;
int i = 0,pre_num = 0;
for(iter1 = index_table.begin();iter1 != index_table.end();++iter1)
{
if(key <= iter1->max_data)
break;
else
{
elem_index = iter1->p_index ; //????
// cout<<"size is :"<<elem_index.size()<<endl;
//pre_num = pre_num + (iter1->p_index)->size();
// pre_num = pre_num+(*elem_index).size();
//未完待续。。。。
}
}
for( i = 0;i < (*elem_index).size();++i)
{
if(key == (*elem_index)[i])
break;
}
if(i == (*elem_index).size())
return -1;
else
return pre_num+i;
}
//输入单个元素表
void InputElem(vector<int> & ElemTable)
{
int val = 0;
cin>>val;
while(val != -1)
{
ElemTable.push_back(val);
cin>>val;
}
cout<<"input completely"<<endl;
}
int main()
{
int val = 0,i = 0;
vector<IndexNode> index_table;
index_table.resize(100);
vector<int> ElemTable1;
vector<int> ElemTable2;
vector<int> ElemTable3;
//输入元素表
InputElem(ElemTable1);
InputElem(ElemTable2);
InputElem(ElemTable3);
//构造索引表
CreateIndexTable(index_table,ElemTable1);
CreateIndexTable(index_table,ElemTable2);
CreateIndexTable(index_table,ElemTable3);
//出错地点???(为什么找到第一个向量表,其size函数却不能使用)
cout<<(*(index_table[0].p_index)).size()<<endl;
while(1)
{
cout<<"please input data you want to search:"<<endl;
int val;
cin>>val;
val = SearchIndex(index_table,val);
cout<<"位置为:"<<val<<endl;
}
return 0;
}