查找->静态查找表->分块查找(索引顺序表)

时间:2022-02-05 08:21:08

文字描述

  分块查找又称为索引顺序查找,是顺序查找的一种改进方法.在此查找算法中,除表本身外, 还需要建立一个”索引表”.索引表中包括两项内容:关键字项(其值为该字表内的最大关键字)和指针项(指示该子表的第一个记录在表中位置)。索引表按关键字有序,则表或者有序或者分块有序。所谓“分块有序”指的是第二个子表中所有记录的关键字均大于第一个子表中的最大关键字,第三个子表中的所有关键字均大于第二个子表中的最大关键字,,,,以此类推。

  因此分块查找算法需分两步进行:

  先确定待查记录所在的块(子表)。由于索引项组成的索引表按关键字有序,则确定块的查找可以用顺序查找,也可以用折半查找。

  再在块中顺序查找。如果块中记录是任意排列的,就只能是顺序查找。

示意图

查找->静态查找表->分块查找(索引顺序表)

算法分析

  分块查找的平均查找长度为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 ;
}

分块查找(索引顺序表)

运行

查找->静态查找表->分块查找(索引顺序表)

查找->静态查找表->分块查找(索引顺序表)的更多相关文章

  1. 线性表 及Java实现 顺序表、链表、栈、队列

    数据结构与算法是程序设计的两大基础,大型的IT企业面试时也会出数据结构和算法的题目, 它可以说明你是否有良好的逻辑思维,如果你具备良好的逻辑思维,即使技术存在某些缺陷,面试公司也会认为你很有培养价值, ...

  2. Oracle数据库 查看表是否是 索引组织表的方法

    1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一 ...

  3. 查看Oracle当前用户下的信息(用户,表视图,索引,表空间,同义词,存储过程函数,约束条件)

    0.表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user ...

  4. 分块查找&lpar;Blocking Search&rpar;

    1.定义 分块查找(Blocking Search)又称索引顺序查找.它是一种性能介于顺序查找和二分查找之间的查找方法. 2.基本思想 分块查找的基本思想是: (1)首先查找索引表 索引表是有序表,可 ...

  5. c语言完成分块查找

    首先要把一系列数组均匀分成若干块(最后一个可以不均匀) 每块中元素任意排列,即块中数字无序,但是整个块之间要有序.因此也存在局限性. #include<stdio.h> //分块查找法 v ...

  6. javascript实现数据结构:线性表--简单示例及线性表的顺序表示和实现

    线性表(linear list)是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成. 其中: 数据元素的个数n定义为 ...

  7. C&num;顺序表&lpar;数据结构&rpar;

    xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷......这是要闹哪样?这都让我一个郁闷了一个晚上.闲来无聊,回顾下之前学的C#数据结构,数据结构的重 ...

  8. 聚集索引、非聚集索引、聚集索引组织表、堆组织表、Mysql&sol;PostgreSQL对比、联合主键&sol;自增长、InnoDB&sol;MyISAM(引擎方面另开一篇)

    参考了多篇文章,分别记录,如下. 下面是第一篇的总结 http://www.jb51.net/article/76007.htm: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(cluste ...

  9. 数据结构之顺序表,c&num;实现

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

随机推荐

  1. maven---install报错

    若maven项目在install或者run的时候出现莫名奇妙的问题,应该考虑是否在pom.xml中引入的包是否为最新的包: 因为在本地maven仓库中已经存在的包就不会再下载,所以可以从这方面排查问题 ...

  2. js 字符串转换成数字的三种方法

    在js读取文本框或者其它表单数据的时候获得的值是字符串类型的,例如两个文本框a和b,如果获得a的value值为11,b的value值为9 ,那么a.value要小于b.value,因为他们都是字符串形 ...

  3. 利用 css 制作简单的提示框

    在网页开发中,为了提高用户体验,经常会用到一些提示框来引导用户,这里分享下一些简单的提示框的制作 1.首先类似一个长方形右上角一个关闭按钮 这里用到的主要是一些定位的知识,运用relative和abs ...

  4. SICP 习题 &lpar;1&period;9&rpar; 解题总结

    SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...

  5. boost&colon;&colon;asio 使用 libcurl

    curl 使用 asio 的官方样例 http://curl.haxx.se/libcurl/c/asiohiper.html, 但这个例子用起来有很明细的 bug,asio 异步IO 只注册一次,也 ...

  6. SpringMVC传参

    @Controller @RequestMapping("/user") public UserController extends BaseController{ @InitBi ...

  7. CentOS下安装node

    下载 wget https://nodejs.org/dist/v7.7.4/node-v7.7.4-linux-x64.tar.gz 解压 tar -zxvf node-v7.7.4-linux-x ...

  8. ●POJ 1113 Wall

    题链: http://poj.org/problem?id=1113 题解: 计算几何,凸包 题意:修一圈围墙把给出的点包围起来,且被包围的点距离围墙的距离不能小于L,求围墙最短为多少. 答案其实就是 ...

  9. 运用PIL库 用来美白,磨皮,瘦脸等操作!

    1.安装pillow库: 在cmd下,输入简单的命令: pip install pillow  即可安装pillow库. 2.PIL库的简介: 1. PIL库主要有2个方面的功能: (1) 图像归档: ...

  10. C&num; 移除Response Header,403调整返回为404Make IIS return a 404 status code instead of 403

    Server Information Revealed For the benefit of those who land here through a google/bing search:: He ...