数据结构:图文详解 - 动态查找、静态查找、散列查找

前言

  • 查找是 数据结构中的重要操作
  • 今天,我将主要讲解介绍 查找的相关知识,如查找算法等,希望你们会喜欢。

目录

示意图


1. 简介

  • 本节将介绍关于 查找 的相关基础概念
  • 具体请看下图:

示意图


2. 查找 需求场景

  • 对于不同的查找需求场景,会采用不同的查找类型,最终采用的查找方式(查找算法)也有所不同

  • 具体如下

示意图

  • 下面,将根据不同的查找需求类型,讲解对应的查找算法

3. 静态查找

  • 定义:仅作 查找操作
  • 面向的数据结构:静态查找表
  • 算法:顺序查找、有序查找、线性索引查找
  • 具体介绍如下

3.1 顺序查找

  • 具体介绍如下

示意图

3.2 有序查找

  1. 主要算法有:二分查找、插值 & 斐波那契
  2. 本文 主要介绍 = 二分查找(也称:折半查找)
  • 定义

示意图

  • 具体实现
public class BinarySearch {

    /**
     * 二分查找方法
     *  @param srcArray:有序数组
     * @param des:需要查找的元素
     */
    public static int binarySearch(int[] srcArray, int des){

        int low = 0; // 比较区间第1位
        int high = srcArray.length-1; // 比较区间最后1位
        int middle ; // 区间的中间位置
        
        
        while(low <= high) {

            // 1. 通过折半,求出区间的中间位置
            middle = low +  (high - low)>>1;
             // 此处需特别注意以下:
           // a. mid = (low + high) / 2:当low、high都是比较大的数时,可能造成上溢除
           // b. 采用右移的位运算代替除2,提高效率

            // 2. 比较给定值和中间值
                // 2.1 若给定值 = 中间记录,则查找成功,返回该位置
            if(des == srcArray[middle]) {
                return middle;

                // 2.2 若给定值 < 中间记录,则 在中间记录的左半区 继续查找
                // 即 将比较区间的最后1位 设置为 原中间位置的前1位
            }else if(des <srcArray[middle]) {
                high = middle - 1;

                // 2.3 若给定值 > 中间记录,则 在中间记录的右半区 继续查找
                // 即 将比较区间的首位 设置为原中间位置的后1位
            }else {
                low = middle + 1;
            }
        }
        // 若比较区间的第1位 ≥ 最后1位,则表示查找失败,返回-1
        return -1;
    }


    /**
     * 执行 二分查找方法
     */
    public static void main(String[] args) {

        // 定义1个有序表数组
        int[] src = new int[]{1, 4, 5, 7, 8, 13,20,28};
        // 输出结果
        System.out.println("需要查找数据的数组下标 = " + binarySearch(src,8));

    }
    
}
  • 测试结果
需要查找数据的数组下标 = 4
  • 二分查找的变式

对于二分查找存在一定的优 & 缺点,所以衍生出2种二分查找的变式方法:插值查找 & 斐波那契查找。具体如下:

区别主要在于:比较元素(中间元素)的计算

对比

3.3 线性索引查找

  • 面向的数据结构:索引表

关于 索引 的介绍如下

示意图

  • 本文主要介绍的线性索引查找算法 = 稠密索引、分块索引、倒排索引。具体介绍如下:

示意图


4. 动态查找

  • 定义:作 查找、插入 & 删除操作
  • 面向的数据结构:动态查找表
  • 算法:二叉排序树、平衡二叉排序树(AVL树)&多路查找树
  • 具体介绍如下

4.1 二叉排序树

也称:二叉查找树、二叉搜索树

  • 特点
    示意图

  • 作用 & 应用场景

示意图

4.2 平衡二叉排序树(AVL树)

属于 二叉搜索树的一种特殊类型

  • 特点

示意图

  • 具体介绍

示意图

4.3 多路查找树

  • 具体介绍如下
    示意图

  • 多路查找树的类型介绍 & 对比
    http://blog.csdn.net/wtyvhreal/article/details/46442091

示意图


5. 散列查找

  • 定义:通过关键字获取记录
  • 面向的数据结构:散列表
  • 算法:散列技术
  • 具体介绍如下

5.1 散列技术

  • 简介

示意图

5.2 散列函数的设计(构造方法)

  • 简介
    即,该如何构造出 散列函数
    示意图

  • 具体构造方法介绍 & 对比

示意图

5.3 散列冲突

  • 简介 & 解决方案

示意图

  • 解决方案介绍

示意图


6. 总结

  • 本文主要讲解了数据结构中的查找相关知识
  • 下面我将继续对 数据结构,有兴趣可以继续关注Carson_Ho的安卓开发笔记

请帮顶 / 评论点赞!因为你的鼓励是我写作的最大动力!

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页