当前位置: 首页 > news >正文

数据结构篇--分离链表vs线性探测

实验目的:从内存占用量、查找成功所需探测次数等方面来比较分离链表和线性探测。

假设:Item和link各占用一个机器字(machine word)的内存空间。

分离链表

假设表有 M M M 个列表,每个列表的平均链长为 4 4 4。则:

  • 总项数 N = α × M = 4 M N=\alpha\times M=4M N=α×M=4M ,因为平均链长为 4 4 4,意味着负载因子 α = 4 \alpha = 4 α=4
  • 成功查找每个项所需的平均探测次数为 2 2 2,因为
    首先,假设某个列表的长度为 L L L,那么成功查找第 1 1 1 个项所需的探测次数为 1 1 1,成功查找第 2 2 2 个项所需的探测次数为 2 2 2,… ,查找第 L L L 个项所需的探测次数为 L L L,从而成功查找每个项所需的平均探测次数等于 ( 1 + 2 + ⋯ + L ) / L = L ( L + 1 ) 2 L = L + 1 2 ≈ L 2 (1+2+\cdots+L)/L=\frac{L(L+1)}{2L}=\frac{L+1}{2}\approx\frac{L}{2} (1+2++L)/L=2LL(L+1)=2L+12L
    接着,每个列表的平均长度为 α \alpha α,那么成功查找每个项所需的平均探测次数就等于 α 2 = 2 \frac{\alpha}{2}=2 2α=2
  • 内存占用量为 9 M 9M 9M 个机器字,因为
    • 存储项需要 4 M 4M 4M 个机器字,因为共有 N = 4 M N=4M N=4M 个项。
    • 存储链接需要 5 M 5M 5M 个机器字,因为 4 M 4M 4M 个项对应有 4 M 4M 4Mnext指针, M M M 个列表对应有 M M M 个头指针。

线性探测

下面分别从两个角度来比较分离链表和线性探测:

  • 相同内存占用量下,比较两者在查找成功时所需的平均探测次数。
  • 相同的查找成功时所需的平均探测次数下,比较两者的内存占用量。

对比查询性能

假设线性探测跟分离链表有相同的内存占用量,即 N = 4 M N=4M N=4M M ′ = 9 M M'=9M M=9M,则:

  • 线性探测的装载因子 α = N / M ′ = 4 / 9 \alpha=N/M'=4/9 α=N/M=4/9
  • 线性探测在查找成功时所需的平均探测次数为 1.4 1.4 1.4,因为根据性质14.3,线性探测在查找成功时所需的平均探测次数公式为 1 2 ( 1 + 1 1 − α ) \frac{1}{2}(1+\frac{1}{1-\alpha}) 21(1+1α1)
  • 跟分离链表相比,线性探测在查找成功时所需的平均探测次数少了 0.3 = ( 2 − 1.4 ) / 2 0.3=(2-1.4)/2 0.3=(21.4)/2

对比内存占用量

假设线性探测跟分离链表在查找成功时所需的平均探测次数相同,也是 2 2 2,则

  • 线性探测的装载因子 α = 2 / 3 \alpha=2/3 α=2/3,因为根据性质14.3,线性探测在查找成功时所需的平均探测次数公式为 1 2 ( 1 + 1 1 − α ) = 2 \frac{1}{2}(1+\frac{1}{1-\alpha})=2 21(1+1α1)=2
  • 线性探测占用的内存量为 6 M 6M 6M,因为假设线性探测跟分离链表里存储的项数相同,都为 4 M 4M 4M,那么线性探测占用的内存量 M = N / α = 4 M × 3 / 2 = 6 M M=N/\alpha=4M\times 3/2=6M M=N/α=4M×3/2=6M
  • 跟分离链表相比,线性探测所需的内存占用量少了 0.33 ≈ ( 9 M − 6 M ) / 9 M 0.33\approx(9M-6M)/9M 0.33(9M6M)/9M

结论

通过对比在相同假设下(项和链接各占一个机器字)分离链表和线性探测在内存占用与查找性能方面的表现,可以得出以下结论:

  1. 在相同内存占用量下,线性探测表现出更优的查找性能。

    • 当两者都占用 9 M 9M 9M 个机器字内存时,分离链表( N = 4 M N=4M N=4M 项, α = 4 \alpha=4 α=4)的平均查找成功探测次数为 2 2 2 次。
    • 而线性探测( N = 4 M N=4M N=4M 项,装载因子 α = 4 / 9 \alpha=4/9 α=4/9)的平均查找成功探测次数仅为 1.4 1.4 1.4 次。
    • 这意味着线性探测比分离链表快 30%
  2. 在达到相同的查找性能时,线性探测能实现更低的内存占用。

    • 当两者都达到平均查找成功探测次数为 2 2 2 次时,分离链表需要 9 M 9M 9M 个机器字内存。
    • 而线性探测( N = 4 M N=4M N=4M 项,装载因子 α = 2 / 3 \alpha=2/3 α=2/3)只需 6 M 6M 6M 个机器字内存。
    • 这意味着线性探测比分离链表节省约 33% 的内存

综合来看,从性能(查找速度)和内存效率的角度,线性探测在这些比较场景下都展现出优于分离链表的表现。

总结

虽然分离链表在实现上可能更简单,并且性能退化更平稳,但在相同的资源约束下(内存或查找时间),线性探测在单位性能下能够更有效地利用内存,或在单位内存下提供更快的查找速度。 这表明在许多应用中,如果主要目标是优化性能和内存效率,开放寻址方法(如线性探测)通常是更好的选择。

http://www.dtcms.com/a/240428.html

相关文章:

  • 深入理解Spring Boot中的Filter机制:原理、注册与实战应用
  • 数据结构-文件
  • 怎么让Comfyui导出的图像不包含工作流信息,
  • Oracle11g安装包
  • nodejs express 打包部署
  • 洞见未来医疗:RTC技术如何重塑智慧医疗新生态
  • [拓扑优化] 1.概述
  • mcts蒙特卡洛模拟树思想
  • 抽象类和接口(全)
  • 土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
  • 学习记录之nestjs---基本认识
  • QT开发技术【ffmpeg EVideo录屏软件 一】
  • vue+cesium示例:3D热力图(附源码下载)
  • pkg-config --cflags --libs opencv4详细解释
  • LangGraph基础知识(Graph-GraphState)
  • Ansible 错误处理:确保高效自动化
  • 大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
  • 河南建筑安全员C证考试常见题及答案解析
  • MyBatis中关于缓存的理解
  • stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)
  • 门静脉高压——检查
  • FreeRTOS学习01_移植FreeRTOS到STM32(图文详解)
  • 从0到1构建我的AI星逻系统: LLM智能控制 + Streamlit前端实战
  • Netty
  • 简繁体智能翻译软件
  • ThreadLocal 源码
  • 7种分类数据编码技术详解:从原理到实战
  • 学习日记-day25-6.9
  • ArcGIS应用与FLUS模型预测:从安装到土地利用建模,数据管理、地图制作、遥感解译、空间分析、地形分析及案例分析攻略
  • 篇章二 论坛系统——系统设计