在介绍查找算法前咱们先重温几个重要概念:算法
1)数据:客观事物的符号表示,是全部能输入到计算机中,并能被计算机程序处理的符号的总称。如数学计算中用到的整数和实数,文本编辑中用到的字符串,多媒体程序处理的图形、图像、声音及动画等经过特殊编码定义后的数据。数据库
2)数据元素:数据的基本单位,在计算机中一般做为一个总体进行考虑和处理。数据元素也称记录,用于描述一个完整的对象,该对象能够是一名学生的信息(记录),某一次棋局,图中的某一个顶点等。数组
3)数据项:组成数据元素的、有独立含义的、不可分割的最小单位。如学生记录中的学号、姓名、性别等都属于数据项。数据结构
4)数据结构:相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括逻辑结构(逻辑表示)和存储结构(物理实现)。ide
5)查找表:由同一类型的数据元素(或记录)构成的集合,能够由线性表、树结构等多种数据结构来实现。函数
6)关键字:数据元素(或记录)中的某个数据项的值,至关于“数据库”知识中一行记录的主码(PRIMARY KEY)。性能
typedef struct /*定义数据元素结构体*/ { KeyType key; /*关键字*/ OtherType other; /*其余数据项*/ } Element; typedef struct /*以顺序表结构定义查询表*/ { /*顺序表借助数组存储数据,所以须要空间基地址base(数组头)和当前长度length(数组长度)*/ Element *base; int length; } SSTable; /*SSTable表示顺序查询表*/
7)查找:根据给定的某个值,在查找表中肯定一个其关键字等于给定值的数据元素(或记录)。一样能够类比数据库的数据查询。针对不一样的数据结构,查找算法也会有所不一样。动画
8)平均查找长度:衡量查找算法性能的一个标准。编码
在查找表的数据结构中,线性表是最简单的一种。spa
分块查找又称索引顺序查找,后一个名称更能反映查找的特性,这是一种性能介于顺序查找和折半查找之间的查找方法。
在该查找算法中,除了查询表外,还须要为查询表创建一个索引表。
创建索引表的过程分三步:
1)将查询表分块,分红若干个子表,取出每一个子表中的第一个数据元素的地址做为索引表中第一个数据元素的其中一个数据项;
2)取出每一个子表中的最大关键字做为索引表每一个数据元素的关键字;
3)根据关键字对每一块进行排序。
分块查找的过程分两步:
1)经过折半查找肯定待查记录所在的块(子表)。如给定关键字27,第一个块的最大关键字为22,第二个块的最大关键字为35,则待查数据位于第二个块。
2)在块中顺序查找。从第二个块中的第一个数据元素开始遍历。
/*--------索引表--------*/ typedef struct { KeyType maxkey; /*每一块的最大关键字*/ Element *first; /*每一块的首元素地址*/ } IndexElement; typedef struct { IndexElement *base; int length; } Index; CreatIndex(Index &i); /*--------分块查询--------*/ /*********分块*********/ DivideBlock(SSTable t, Index &i, int blocknum) /*传递参数包括查询表,索引表的引用,切分块数*/ { int avg_length = t.length / blocknum; int j = k = 1; while(j < t.length) { i.base[K].maxkey = Max(t, j, avg_length); /*Max()函数能够求出查询表t中 base[n](j <= n < j + avg_length)的最大关键字*/ /*若出现 n > t.length 的状况,给予相应处理*/ i.base[k].first = &t.base[j]; i.length++; j = j + avg_length; k++; } } /*********查找**********/ int Blo_Search(SSTable t, Index i, Keytype key) { /*对索引表折半查找*/ /*对块顺序查找*/ }
优势:
进行插入、删除操做时,只要肯定该元素所在的块,就能在块内插入或删除数据元素。因为块内元素无序,插入和删除时不须要大量移动数据元素。
缺点:
须要额外增长索引表的存储空间,并对索引表排序。