查找:分块查找算法分析

数据分块存储,分块查找特点:块内无序、块间有序。

1.分块查找的算法思想

1.使用顺序查找查索引

设置一个索引表,

索引表数据结构设计:

cpp 复制代码
//索引表
typedef struct {
    ElemType maxValue;
    int low,high;
}Index;

//顺序表存储实际元素
ElemType List[100] ;

分块查找,又称索引顺序查找,算法过程如下:

  1. "索引表"中保存每个分块的最大关键字和分块的存储区间。
  2. 在索引表中确定待查记录所属的分块(可顺序、可折半)
  3. 再在分块内进行顺序查找

2.使用折半查找查索引

  • 若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指分块中查找
  • 原因:最终low左边一定小于目标关键字,high右边一定大于目标关键字。而分块存储的索引表中保存的是各个分块的最大关键字。

2.查找效率分析(ASL)

ASL=查索引表的平均查找长度+查分块的平均查找长度

假设,长度为n的查找表被均匀地分为b块,每块s个元素。则 n = s b n = sb n=sb

设索引查找和块内查找的平均查找长度分别为L1、Ls,则分块查找的平均查找长度为 A S L = L 1 + L s ASL=L1+Ls ASL=L1+Ls

1.采用顺序查找查索引表

则索引查找的长度为: L 1 = b + 1 2 L1 = \frac{b+1}{2} L1=2b+1块内查找长度为: L s = s + 1 2 Ls = \frac{s+1}{2} Ls=2s+1则分块查找的平均查找长度为: A S L = s 2 + 2 s + n 2 s ASL = \frac{s^2+2s+n}{2s} ASL=2ss2+2s+n

当s = n \sqrt{n} n 时,ASL最小为: n + 1 \sqrt{n}+1 n +1.

2.折半查找查索引表

则 L 1 = l o g 2 ( b + 1 ) L1 =log_2(b+1) L1=log2(b+1), L s = s + 1 2 Ls =\frac{s+1}{2} Ls=2s+1, A S L = [ l o g 2 ( b + 1 ) ] + s + 1 2 ASL =[log_2(b+1)] + \frac{s+1}{2} ASL=[log2(b+1)]+2s+1

若查找表是"动态查找表",则采用链式存储存放元素。

相关推荐
Giser探索家2 小时前
无人机桥梁巡检:以“空天地”智慧之力守护交通生命线
大数据·人工智能·算法·安全·架构·无人机
budingxiaomoli5 小时前
算法--滑动窗口(二)
算法
ID_180079054735 小时前
淘宝实时拍立淘按图搜索数据|商品详情|数据分析提取教程
算法·数据分析·图搜索算法
l1t5 小时前
Lua与LuaJIT的安装与使用
算法·junit·单元测试·lua·luajit
极客智造6 小时前
线性数据结构深度解析:数组、链表、栈与队列的实现与应用
数据结构·链表
拉不动的猪6 小时前
函数组件和异步组件
前端·javascript·面试
怪兽20146 小时前
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
java·缓存·面试
Emilia486.7 小时前
【Leetcode&nowcode】代码强化练习(二叉树)
算法·leetcode·职场和发展
墨染点香7 小时前
LeetCode 刷题【135. 分发糖果】
算法·leetcode·职场和发展
Zhu_S W7 小时前
Redis跳表:高效有序数据结构的深度剖析
数据结构·数据库·redis