3、分块查找——查找算法

3、分块查找 (又称 索引顺序查找)[性能介于 顺序查找 和 折半查找之间]

  索引表
最大关键字 22 48 86
  起始地址 1 7 13
22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53
表及其索引表

块的查找 既可以顺序查找,也可以折半查找。

因为上表块中记录是无序的,所以只能是顺序查找。

分块查找平均查找长度:ASLbs=Lb+Lw

Lb:查找索引表确定所在块的平均查找长度。

Lw:块中查找元素的平均查找长度。

一般情况下,长度为n的表均匀分成b块,每块有s个记录,即b=[n/s] ;

假定表中每个记录查找概率相等,则每块查找概率为 1/b ;

块中每个记录的查找概率为 1/s;

用顺序查找确定所在块的平均查找长度为 ASLbs=Lb+Lw=(1/2)( (n/s) + s ) + 1

平均查找长度跟表长n有关,还和每一块中记录个数s有关。

当s取√n (根号n) ,ASLbs取最小值 √n +1 。

比顺序查找有改进,但远不及折半查找

分块查找优点:

在表中插入和删除元素时,只要找到该元素对应的块,就可以在该块内进行插入和删除运算。

由于块内无序,故插入删除容易,无需大量移动。

如果线性表既要快速查找,又要经常动态变化,则可以使用分块查找。

分块查找缺点:

要增加一个索引表的存储空间,并对初始索引表进行排序运算。


原文地址:https://www.cnblogs.com/LinQingYang/p/11780770.html

时间: 2024-10-22 23:48:23

3、分块查找——查找算法的相关文章

试探究一种查找素数算法

解题思路:构造链表,使用筛除法 例如:求10以内素数 链表初始化:2 3 4 5 6 7 8 9 10 进行第一轮筛选后:2 3 5 7 9 也就是用2后面的数去除2, 第二轮筛选后:2 3 5 7 也就是用3后面的数去除3, 第三轮筛选后:2 3 5 7 也就是用5后面的数去除5 第四轮筛选后:2 3 5 7 代码: #include <stdio.h> #include <stdlib.h> #define N 1e5 // over this it is so slowly

php 二分查找法算法详解

一.概念:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 二.代

一个关于汉字查找的算法的猜想

有没有想过当你按下ctrl+F的时候程序是怎样做到查找你要查找的内容,例如在这篇文章里查询"程序设计"我的猜想是它首先会查找到所有有"程"字的词语,将下标存在一个数组里,在查找,直到把这片文章查完,然后再在含有"序"字的地方,过程同上,然后查"设"字,然后再查"计",这用递归应该比较合适,因为操作都是相似的,有限步之内能完成的.所以可以递归,现在就是要设计出程序,加油. 就在刚才想到了另一种办法,就是当查到

常用查找排序算法

1.折半查找算法: 对于一个已排好序的数组,若要查找某元素是否属于数组中,则可以用这种算法. 返回找到的元素在数组中的下标,找不到则返回-1 #include <stdio.h> #define LEN 8 int a[LEN] = { 1, 3, 3, 3, 4, 5, 6, 7 }; int binarysearch(int number) { int mid, start = 0, end = LEN - 1; while (start <= end) { mid = (start

查找和排序的基本操作:查找排序算法大集合

重点 查找算法着重掌握:顺序查找.二分查找.哈希表查找.二叉排序树查找. 排序算法着重掌握:冒泡排序.插入排序.归并排序.快速排序. 顺序查找 算法说明 顺序查找适合于存储结构为顺序存储或链接存储的线性表. 算法思想 顺序查找也称为线形查找,属于无序查找算法.从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功:若扫描结束仍没有找到关键字等于k的结点,表示查找失败. 算法实现 int sequenceSearch(int a[], int valu

文本查找查找命令的grep 、egrep、fgrep用法的详解

一.学习目标 了解并能熟悉运用grep.egrep.fgrep命令. 二.学习内容 1.grep.egrep.fgrep命令的意思和用法格式 : grep:是使用基本正则表达式定义的模式来过滤文本的命令. # grep [options] PATTERN  [FILE,...] egrep  :是使用扩展正则表达式的模式来过滤文本的命令. # egrep [options] PATTERN  [FILE,...] fgrep:不支持正则表达式,是使用文字本身的意义的模式来过滤文本的命令. # f

数组元素查找(查找指定元素第一次在数组中出现的索引)

import java.util.Scanner; /* * 需求:数组元素查找(查找指定元素第一次在数组中出现的索引) * (1)给定数组int[] arr={5,7,3,2,5} * (2)要查询的元素通过键盘录入的方式确定 * (3)定义一个查找数组元素第一次出现位置的方法(注:要查找的元素就是键盘录入的数据) * *分析: * A:定义数组int[] arr={5,7,3,2,5}; * B:键盘录入一个被查询的数据 * C:写方法实现查找指定元素在数据中第一次出现的索引 * 遍历数组,

C言语二分查找(折半查找)算法及代码

二分査找也称折半査找,其长处是查找速度快,缺陷是请求所要査找的数据必需是有序序列.该算法的根本思惟是将所要査找的序列的两头地位的数据与所要査找的元素停止比拟,假如相等,则表现査找胜利,不然将以该地位为基准将所要査找的序列分为阁下两局部.接下来依据所要査找序列的起落序纪律及两头元素与所查找元素的巨细关系,来选择所要査找元素能够存在的那局部序列,对其采取异样的办法停止査找,直至可以肯定所要查找的元素能否存在,详细的运用办法可经过下面的代码详细理解. #include <stdio.h> binar

查找与排序01,线性查找,时间复杂度,算法

线性查找,肯定是以线性的方式,在集合或数组中查找某个元素.本篇包括: 通过代码来理解线性查找 时间复杂度 什么是算法 通过代码来理解线性查找 什么叫"线性"?还是在代码中体会吧. 首先需要一个集合或数组,如何得到呢?就生成一个固定长度的随机数组吧.然后输入一个查找key,如果找到就返回元素的索引,没找到就返回-1,就这么简单. class Program { private static int[] arr; private static Random r = new Random()