查找之索引查找

/*
名称:索引查找(分块查找)
说明:本程序写的有不少问题,用的是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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值