数据结构与算法(五)检索(查找)基本算法

概念

  • 检索表:待查找的数据容器,例如线性表、树表(树、二叉树、B/B+树)等
  • 关键字:key
  • 关键字值:key对应的value
  • 检索/查找:Search

1. 线性表的检索

1.1 顺序检索

可用于所有线性表,包括顺序表和链表。

1.2 二分法检索

只能用于顺序表(数组)。

1.2.1 黄金分割点检索

与二分法检索类似,但是分割检索区间的方式不同;二分法以二等分的方式分割检索区间,黄金分割点以0.618比例方式分割检索区间

1.3 精算点检索

如果检索表是有序而且分布均匀的,可通过计算估算检索位置。只能用于顺序表。

1.3 分块检索

是顺序检索的一种改进方法。效率介于顺序检索和二分查找之间。分块检索不要求检索表中所有记录关键字有序排列,但要求把检索表分成若干块,并且各块之间按key大小有序。即块间有序、块内无序。

1.4 跳跃表

又叫跳表,一种基于有序链表的扩展,具有二分查找的查找效率,又具有链表的插入/删除效率。

2. 树表的检索

2.1 二叉检索树/二叉查找树(BST:Binary Search Tree)

  • 是一个二叉树
  • 左子树不空,则左子树上所有结点的值小于根结点的值
  • 右子树不空,则右子树上所有结点的值大于根结点的值
  • 查找时比较次数不超过树的深度

2.1.1 平衡二叉树/AVL树

平衡因子的绝对值不超过1的二叉树(网上查到都是说平衡二叉树是二叉检索树)。

平衡因子:该结点的左子树深度减去右子树深度的差

  • 插入或删除结点可能导致不平衡,需要调整

2.2 B树/B+树

B树是一种平衡的多路检索树(平衡N叉检索树)

B树的特点:

  • 一个结点最多有N-1个键(key)
  • 一个结点最多有N棵子树
  • 除根结点外,所有非终端结点至少有[N+1/2]棵子树

B+树的特点:

  • 是一种B树的变形树
  • 有n棵子树的结点含有n个键(key)
  • 节点的每个键是对应子树的最大(或最小)键
  • 所有叶子结点包含了全部键的信息

3. 哈希检索

前两种检索方式,键在检索表中的位置都是随机的,或者说是相对的,与其键(key)不存在某种确定的关系。
哈希检索是一种直接利用键来确定记录在检索表中位置的技术。

  • 哈希函数
  • 哈希地址冲突(collision)

3.1 地址冲突的消解策略

在数据插入时,可能发生插入的位置已经存在数据,即有地址冲突。如何解决这个问题?

3.1.1 开发定址法

从插入的位置开始,查找一个最近的空地址用于存储记录。

  1. 线性探查法
    将哈希表看作是环形表,从当前地址往后查:(d+1)%m、(d+2)%m…,m为哈希表的长度
  2. 平方查找法
    以(d+i)%m的方式查,i取值:12 , -12 , 22 , -22
  3. 随机探查法
    选取随机数作为地址位移来计算下一个地址

3.1.2 拉链法

将哈希地址相同的键的记录链接到同一个单链表中。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java数据结构与算法的学习对于程序员来说非常重要。数据结构是算法的基础,而算法又是程序的灵魂。要学好算法,需要将数据结构学习到位。在面试中,数据结构与算法常常是考察的重点。 Java中常用的数据结构与算法有很多种。其中包括数组、栈、队列、链表、树结构基础、二叉树、Huffman树、多路查找树(如2-3树、2-3-4树、B树、B树)和图结构等。 数据结构在计算机中用于存储和组织数据的方式。它指的是相互之间存在特定关系的数据元素的集合。数据结构通常与高效的检索算法和索引技术有关。根据数据的逻辑结构,可以简单地将数据结构分为线性结构和非线性结构。在线性结构中,数据元素之间存在一对一的关系,如数组、栈、队列和链表。而非线性结构中,数据元素之间存在一对多或多对多的关系,如树和图。 在Java中,我们可以使用各种数据结构和算法来解决不同的问题。例如,我们可以使用数组来存储一组数据,使用链表来实现动态数据结构,使用树结构来表示层次关系,使用图来表示网络结构等。同时,我们也可以利用各种算法来对这些数据结构进行操作和处理,如排序、查找、删除等。 因此,学习Java数据结构与算法是程序员必备的技能之一。它可以帮助我们优化程序的性能,提高代码的可读性和可维护性,同时也能够在面试中展示我们的专业能力和解决问题的能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [数据结构与算法详解(含算法分析、动图图解、Java代码实现、注释解析)](https://blog.csdn.net/yuan2019035055/article/details/120262225)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Java中常用数据结构及方法](https://blog.csdn.net/qq_41101966/article/details/128364279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值