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

算法分析
分块查找的平均查找长度为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 ...
随机推荐
- Oracle分割字符串 REGEXP_SUBSTR用法
分割字符串中所有指定字符,然后成多行参数说明,参数1: 待分割字符串参数2:正则表达式参数3:起始位置,从第几个字符开始正则表达式匹配(默认为1)参数4:标识第几个匹配组,默认为1参数5:模式('i' ...
- Linux配置简单采集
#!/bin/bash #CPU逻辑个数 cpu_processor=$(cat /proc/cpuinfo | grep processor | wc -l) #CPU物理个数 cpu_num=$( ...
- vue.js在visual studio 2017下的安装
1.打开"工具"菜单->"NuGet 包管理器"->"管理解决方案 Nuget 的程序包": 在红色标识的地方输入vue: 2. ...
- Java知多少(67)面向字符的输入流
字符流是针对字符数据的特点进行过优化的,因而提供一些面向字符的有用特性,字符流的源或目标通常是文本文件. Reader和Writer是java.io包中所有字符流的父类.由于它们都是抽象类,所以应使用 ...
- Docker for Windows 代理设置(linux container)
https://blog.csdn.net/mzhangsf/article/details/79747979
- 每一个开发人员都应该有一款自己的App
[谋哥每天一干货] 这篇文章不是鸡汤,是谋哥自己的感悟了. 谋哥近期每日一干货,坚持每天写,才发现这个事情你要是能坚持一年超级难.365天无论刮风下雨.心情好或不好.生病或生气.每天 ...
- printf打印输出null问题的跟踪
最近在工作中,遇到一处 printf输出有null的情况,在此记录一下,问题分析的过程. 测试代码很简单,本机为64位操作系统: #include <stdio.h> #include & ...
- golang IO 流抽象与应用
https://blog.csdn.net/pmlpml/article/details/82930191
- MySQL 错误 1366:1366 Incorrect integer value
错误提示:General error: 1366 Incorrect integer value: '' for column 'pay_type' at row 1 (SQL: INSERT INT ...
- mybatis与hibernate区别与应用场景
hibernate:是一个标准化的ORM框架.入门的门槛较高,不需要程序写sql,语句就自动生成了.对sql进行优化.修改比较困难. 应用场景:适用于中小企业需求变化不多的项目,比如后台管理系统,er ...