查找->静态查找表->分块查找(索引顺序表)
文字描述
分块查找又称为索引顺序查找,是顺序查找的一种改进方法.在此查找算法中,除表本身外, 还需要建立一个”索引表”.索引表中包括两项内容:关键字项(其值为该字表内的最大关键字)和指针项(指示该子表的第一个记录在表中位置)。索引表按关键字有序,则表或者有序或者分块有序。所谓“分块有序”指的是第二个子表中所有记录的关键字均大于第一个子表中的最大关键字,第三个子表中的所有关键字均大于第二个子表中的最大关键字,,,,以此类推。
因此分块查找算法需分两步进行:
先确定待查记录所在的块(子表)。由于索引项组成的索引表按关键字有序,则确定块的查找可以用顺序查找,也可以用折半查找。
再在块中顺序查找。如果块中记录是任意排列的,就只能是顺序查找。
示意图

算法分析
分块查找的平均查找长度为ASLbs = Lb+Lw, 其中Lb为查找索引表确定所在块的平均查找长度,Lw为在块中查找元素的平均查找长度。
一般情况下,为进行分块查找,可以将长度为n的表均匀地分成b块,每块含有s个记录,即b=[n/s];又假定表中每个记录的查找概率相等,则每块查找的概率为1/b,块中每个记录的查找概率为1/s。
若用顺序查找确定所在块,顺序查找子表中的元素,则分块查找的平均查找长度为

若用折半查找确定所在块,顺序查找子表中的元素,则分块查找的平均查找长度为

代码实现
//./a.out 5 13 19 21 37 56 64 75 80 88 92 #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define DEBUG #define MAX_SIZE 50
#define BLOCK_SIZE 5 typedef struct{
int start;
int end;
int key;
}Index_K; //分块查找算法
int block_search(int key, int a[], Index_K index_k[], int len)
{
int i = ;
int j = ;
int k = -;
//顺序查找确定所在块
while((index_k[i].start>=) && (key>index_k[i].key))
i+=;
if(index_k[i].start < ){
return k;
}
//顺序查找子表中的元素
for(j = index_k[i].start; j<=index_k[i].end; ++j){
if(key == a[j])
k = j;
}
return k;
} //顺序打印整型数组中的元素
void print(int a[], int len)
{
int i = ;
for(i=; i<len; i++){
printf("[%d]:%d ", i, a[i]);
}
printf("\n");
return;
} int main(int argc, char *argv[])
{
if(argc < )
return -; int a[MAX_SIZE] = {};
Index_K index_k[MAX_SIZE/BLOCK_SIZE+]; int i = , j = , len = , key = ;
for(i=; i<argc; i++){
a[i-] = atoi(argv[i]);
}
len = i-; #ifdef DEBUG
printf("输入数据:");
print(a, len);
#endif
printf("索引表:\n");
i = j = ;
while(i<len){
index_k[j].start = i;
index_k[j].end = ((i+BLOCK_SIZE)>(len-))?(len-):(i+BLOCK_SIZE);
index_k[j].key = ((i+BLOCK_SIZE)>(len-))?a[len-]:a[i+BLOCK_SIZE];
printf("index_k[%d].start=%d .end=%d .key=%d\n", j, index_k[j].start, index_k[j].end, index_k[j].key);
j += ;
i += BLOCK_SIZE;
i += ;
}
index_k[j].start = index_k[j].end = index_k[j].key = -; while(){
printf("输入key:");
scanf("%d", &key);
if(key<)
break;
printf("key(%d) 位于 %d\n", key, block_search(key, a, index_k, len));
}
return ;
}
分块查找(索引顺序表)
运行

查找->静态查找表->分块查找(索引顺序表)的更多相关文章
- 线性表 及Java实现 顺序表、链表、栈、队列
数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...
- Oracle数据库 查看表是否是 索引组织表的方法
1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...
- 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)
0.表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user ...
- 分块查找(Blocking Search)
1.定义 分块查找(Blocking Search)又称索引顺序查找.它是一种性能介于顺序查找和二分查找之间的查找方法. 2.基本思想 分块查找的基本思想是: (1)首先查找索引表 索引表是有序表,可 ...
- c语言完成分块查找
首先要把一系列数组均匀分成若干块(最后一个可以不均匀) 每块中元素任意排列,即块中数字无序,但是整个块之间要有序.因此也存在局限性. #include<stdio.h> //分块查找法 v ...
- javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现
线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...
- C#顺序表(数据结构)
xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷......这是要闹哪样?这都让我一个郁闷了一个晚上.闲来无聊,回顾下之前学的C#数据结构,数据结构的重 ...
- 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql/PostgreSQL对比、联合主键/自增长、InnoDB/MyISAM(引擎方面另开一篇)
参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...
- 数据结构之顺序表,c#实现
using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...
随机推荐
- PHP优化——从语言到业务
经常有人说php速度慢,其实语言层面的速度差异和实际的业务相比,不在一个数量级. 业务的瓶颈往往在于io,而不是CPU. 0x0 语言 语法 单引号和双引号 单引号不解析字符串里的变量,而双引号会解析 ...
- Android Launcher分析和修改7——AllApp全部应用列表(AppsCustomizeTabHost)
今天主要是分析一下Launcher里面的所有应用列表.Android4.0 Launcher的所有应用列表跟2.X比较大的区别就是多了Widget的显示.下面会详细分析Launcher里面有关所有应用 ...
- 【emWin】例程十五:触摸校准实例——五点校准法
介绍: 该例程介绍如何校准4.3寸.7寸液晶显示屏.校准方法如下: 1.进入以下界面,用户可选择是否进入校准界面进行液晶校准 *点击屏幕任何地方可进入校准界面 *不采取任何操作,几秒钟后会进入触摸测试 ...
- CentOS 配置集群机器之间SSH免密码登录
SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层和传输层基础上的安全协议.SSH 是目前较可靠,专为远 ...
- Android KK 找不到<cutils/properties.h>
一直通过property来控制android系统的号码匹配位数,之前的项目都工作的好好的,但到了KK时,在sqlite库中引用property的相关方法,却一直编译error... 折腾了好久,发现从 ...
- 第三百九十八节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5系统环境设置
第三百九十八节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署CentOS6.5系统环境设置 1.Linux安装配置 注意事项: 虚拟机网卡桥接模式 不要拨VPN 如果,网络怎么都 ...
- Android实现电话录音功能
需求分析 电话录音是在通话的时候进行录音,所以需要使用一个服务来完成功能. 需要监听电话的状态,分为三种状态: 空闲状态 TelephonyManager.CALL_STATE_IDLE 响铃状态 ...
- [CNN] Tool - Deep Visualization
From: http://www.infoq.com/cn/news/2016/12/depth-neural-network-fake-photos 当时大部分的DNN在识别图像中对象的过程中主要依 ...
- jmeter中split分隔字符
jmeter中自带了split函数,但是,注意但是,不能使用"-",","等等符合,否则会报错. 没办法,转投入beanshell的怀抱,使用split,发现& ...
- centos6安装mysql8 shell脚本
下载mysql安装包: wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86-64.t ...