索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找。

索引查找的过程是:

1)首先根据给定的索引值K1,在索引表上查找出索引值等于K1的索引项,以确定对应子表在主表中的开始位置和长度。

2)然后再根据给定的关键字K2,在对应的子表中查找出关键字等于K2的元素(结点)。

对索引表或子表进行查找时,若表是顺序存储的有序表,则既可进行顺序查找,也可进行二分查找,否则只能进行顺序查找。

一提到“索引”,估计大家第一反应就是“数据库索引”,对的,其实主键建立“索引”,就是方便我们在海量数据中查找。

实现索引查找时常使用的三个术语:

1)主表:这个很简单,要查找的对象,主表在逻辑上被划分为一个一个的子表。

2)索引项:一般我们会用函数将一个主表划分成几个子表,每个子表建立一个索引,这个索引叫做索引项。

3)索引表:索引项的集合也就是索引表。

一般“索引项”包含三种内容:index,start,length

第一:index,也就是索引指向主表的关键字。

第二:start,也就是index在主表中的位置。

第三:length, 也就是子表的区间长度。

下面做一个有关分块索引的实现:

在主表中有10000个数据,现在分成100个子表,每个子表有100条记录,整个索引表有100个索引项对应100个子表。

对于某个子表,把它的所有记录中的最大项作为它对应的索引项的index。

在存储数据的时候,每个子表都有各自的数值的范围,插入一个新的数据时,先找到其要存储的位置(在那张子表中存储),然后查看这张子表是否有剩余的空间,如果有剩余的空间,插入该值然后更新对应的索引项。

程序代码实现

const int MaxSize = 10000;
const int IndexItemNum = 100; //定义主表
struct student_info
{
int score;
//some other attributes
};
typedef struct student_info mainTable[MaxSize]; //定义索引表
struct indexItem
{
int index;
int start;
int length;
};
typedef struct indexItem indexTable[IndexItemNum]; class IndexSearch
{
public:
IndexSearch(); //在主表中添加一个元素,添加后返回它的下标,失败后返回-1
int addElements(int key); //返回搜索值在主表中的下标,如果检索失败返回-1
int searchElements(int key); private:
indexTable index_table;
mainTable main_table; //索引表中索引项的个数
const int indexItem_num; //每个子表存储的数据的个数
const int numPerBlock;
};

  上述代码定义了主表和索引表,同时确定了主表分成多少个子表和每个子表中存储数据的个数。

#include "IndexSearch.h"

int IndexSearch::searchElements(int element)
{
int i,j; //检索索引表
int low = 0;
int high = indexItem_num - 1;
while(low <= high)
{
int mid = (low +high) / 2; if(element > index_table[mid].index)
{
low = mid + 1;
}
else if(element < index_table[mid-1].index)
{
high = mid - 1;
}
else
{
i = mid;//用i暂存结果
break;
} }//while if(low > high)
{
return -1; //检索失败
} //检索主表
low = index_table[i].start;
high = index_table[i].start + index_table[i].length; for(j = low; j < high; j++)
{
if(main_table[j].score == element)
{
break;
}
}//for
if(j < high)
{
return j;
}
else
{
return -1;
} }
int IndexSearch::addElements(int element)
{
int tag = element / numPerBlock;
if(tag > numPerBlock - 1)
{
tag = numPerBlock - 1;
} if(index_table[tag].length < numPerBlock)
{
int start = index_table[tag].start;
int length = index_table[tag].length;
main_table[start + length].score = element; index_table[tag].length++;
if(element > index_table[tag].index)
{
index_table[tag].index = element;
} return start + length;
}
else
{
return -1;
}
} IndexSearch::IndexSearch(): indexItem_num(IndexItemNum), numPerBlock(100)
{
int index = 0;
int start = 0; for(int i = 0; i < 100; i++)
{
index_table[i].length = 0;
index_table[i].index = index;
index_table[i].start = start; index += 100;
start += 100;
}//for }

  初始化子表的个数和每个子表中存储数据的个数,同时实现插入和查找这两个函数。

测试代码:

#include <iostream>
#include <ctime>
#include "IndexSearch.h"
using namespace std; void main()
{
srand(time(0));
IndexSearch searchTool;
int index;
int key;
for(int i = 0; i < 1000; i++)
{
key = rand()%10000; index = searchTool.addElements(key);
cout << "the number: " << key << " is insert in " << index << endl;
} index = searchTool.addElements(2015);
cout << "the number 2015: "<< " is insert in " << index << endl;
//查找刚才插入的这个值
cout << "the number 2015 is stored is the position of "<< searchTool.searchElements(2015) << endl; index = searchTool.addElements(467);
cout << "the number 467: "<< " is insert in " << index << endl;
//查找刚才插入的这个值
cout << "the number 467 is stored is the position of "<< searchTool.searchElements(467) << endl;
}

  

基础算法-查找:线性索引查找(II)的更多相关文章

  1. 基础算法-查找:线性索引查找(I)

    前面介绍的几种查找的算法都是基于数据有序的基础上进行的.但是在实际的应用中,很多数据集可能有惊人的数据量,面对这些海量的数据,要保证记录全部按照当中的某个关键字有序,其时间代价是非常昂贵的,所以这种数 ...

  2. hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)

    基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...

  3. Python 基础算法

    递归 时间&空间复杂度 常见列表查找 算法排序 数据结构 递归 在调用一个函数的过程中,直接或间接地调用了函数本身这就叫做递归. 注:python在递归中没用像别的语言对递归进行优化,所以每一 ...

  4. Java基础算法

    i++;++i; i--;--i; int a=5;int b=a++;++放在后面,表示先使用a的值,a再加1b=5,a=a+1,a=6 int c=5;int d=++c;++放在前面,表示先将c ...

  5. Python <算法思想集结>之初窥基础算法

    1. 前言 数据结构和算法是程序的 2 大基础结构,如果说数据是程序的汽油,算法则就是程序的发动机. 什么是数据结构? 指数据在计算机中的存储方式,数据的存储方式会影响到获取数据的便利性. 现实生活中 ...

  6. PHP基础算法

    1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++ ...

  7. c/c++面试总结---c语言基础算法总结2

    c/c++面试总结---c语言基础算法总结2 算法是程序设计的灵魂,好的程序一定是根据合适的算法编程完成的.所有面试过程中重点在考察应聘者基础算法的掌握程度. 上一篇讲解了5中基础的算法,需要在面试之 ...

  8. c/c++面试指导---c语言基础算法总结1

    c语言基础算法总结 1  初学者学习任何一门编程语言都必须要明确,重点是学习编程方法和编程思路,不是学习语法规则,语法规则是为编程实现提供服务和支持.所以只要认真的掌握了c语言编程方法,在学习其它的语 ...

  9. ACM基础算法入门及题目列表

    对于刚进入大学的计算机类同学来说,算法与程序设计竞赛算是不错的选择,因为我们每天都在解决问题,锻炼着解决问题的能力. 这里以TZOJ题目为例,如果为其他平台题目我会标注出来,同时我的主页也欢迎大家去访 ...

随机推荐

  1. linux服务器在运行210天左右宕机

    减小字体 增大字体 作者:错新网  来源:www.cuoxin.com  发布时间:2014-2-25 19:21:32 错新网讯   最近几天,一批linux线上的服务器接连宕机,当时以为是硬件问题 ...

  2. Windows XP密钥(共38枚)

    翱翔博客(http://hi.baidu.com/guoguo6688/home) Windows XP Professional VOL版密钥:=========================== ...

  3. Netty那点事: 概述, Netty中的buffer, Channel与Pipeline

    Netty那点事(一)概述 Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户ne ...

  4. hdu-Common Subsequence

    http://acm.hdu.edu.cn/showproblem.php?pid=1159 Problem Description A subsequence of a given sequence ...

  5. java的控制流程

    1.顺序结构顺序结构就是指按语句执行的先后顺序,或者说语句出现的先后顺序逐条执行程序语句.语句块,完全是按照程序平台的执行约定进行的,比如第一个 HelloWorld程序:public class H ...

  6. [Jobdu] 题目1283:第一个只出现一次的字符

    题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符. 输入: 输入有多组数据每一组输入一个字符串. 输出: 输出第一个只出现一次的字 ...

  7. C3p0实践

    jar包 c3p0-0.9.2.1.jar mchange-commons-java-0.2.3.4.jar mysql-connector-java-5.1.28-bin.jar 建立数据库 CRE ...

  8. JBoss 系列二十一:JBossCache核心API

    内容简介 本处介绍JBossCache相关的主要API,我们目的通过本部分描述,读者可以使用JBossCache API,在自己的应用中使用JBossCache. Cache接口 Cache 接口是和 ...

  9. PHP的一些函数

    //进制转换类 base_convert //字符转十六进制 binhex

  10. mybatis日记配置Log4j

    拷贝log4j-1.2.16.jar到项目lib下 方式一是在src下新建一个log4j.xml文件,其具体内容如下 <?xml version="1.0" encoding ...