攻克数据结构和算法——第五天:查找

简介: 查找过程中,往往是依据数据元素的某个数据项进行查找,这个数据项通常是数据的关键字。关键字:是数据元素中某个数据项的值,用以标识一个数据元素。

一,查找的基本概念


一是数据如何组织——查找表,

二是在查找表上如何查找——查找方法


1,查找表是由同类型的数据元素(或记录)构成的集合。


2,对查找表基本操作


●1)查询某个数据元素是否在查找表中;

●2)检索某个数据元素的各种属性;

●3)在查找表中插入一个数据元素;

●4)从查找表中删去某个数据元素。


3,查找表分类


●静态查找表

仅作查询和检索操作的查找表。


●动态查找表

"查询”结果"不在查找表中”→数据元素插入到查找表中; ;

"查询”结果为"在查找表中”的数据元素→删除。


查找过程中,往往是依据数据元素的某个数据项进行查找,这个数据项通常是数据的关键字。

关键字:是数据元素中某个数据项的值,用以标识一个数据元素。


若关键字能标识唯一的一个数据元素,

则称为主关键字。

若关键字能标识若干个数据元素,

则称为次关键字。


4,平均查找长度ASL


给定值与关键字比较次数的期望值


4ddab40d6ef3415ab15f641d171c28e0.png


5,常见的查找算法:


1)顺序查找

2)二分查找

3)索引查找

4)哈希查找


二,顺序查找


顺序查找基本思想

●从表中指定位置(一般为最后一一个,第0个位置设为岗哨)的记录开始,沿某个方向将记录的关键字与给定值相比较,若某个记录的关键字和给定值相等,则查找成功;


●反之,若找完整个顺序表,都没有与给定关键字值相等的记录,则此顺序表中没有满足查找条件的记录,查找失败。


●空间复杂度: O(1)

●时间复杂度:

查找算法的基本运算是给定值与顺序表中记录关键字值的

比较。


最好情况: O(1)

最坏情况: O(n)

平均情况: O(n)


c3445331608b472fac43bc2ada483f04.png


代码实现:


typedef struct{        //查找表的数据结构
    ElemType *elem;    //元素存储空间基址,建表时按实际长度分配,0号单元留空作为哨兵
    int TableLen;      //表的长度
}SSTable;
int Search_Seq(SSTable ST,ElemType key) {
    ST.elem[0] = key; //哨兵
    for(i=ST.TableLen;ST.elem[i]!=key;--i) { // 从后往前查找
        return i; //若表中不存在关键字为key的元素,将查找到i为0时退出for循环。
    }
}


将ST.elem[0]称为"哨兵"。引入它的目的是使得Search_Seq内的循环不必判断数组是否会越界,因为满足i==0时,循环一定会跳出。引入哨兵的目的是避免很多不必要的判断语句,从而提高程序效率。


三,折半查找


1,有序表:如果顺序表中的记录按关键字值有序,即: R[i].key≤R[i+ 1].key (或R[i].key≥R[i+ 1].key),

i=1,2...n-1,则称顺序表为有序表。

1 3 7 10 12 124

有序表



1 3 7 13 12 124

无序表


将待查关键字与有序表中间位置的记录进行比较,若相等,查找成功,若小于,则只可能在有序表的前半部分,若大于则只可能在有序表的后半部分,因此,经过一次比较,就将查找范围缩小一半,这样一直进行下去直到找到所需记录或记录不在查找表中。


2,代码实现:


int BinarySearch(DataType SL[], KeyType key, int n){
/*在长度为n的有序表SL中折半查找其关键字等于key的记录*/
/*查找成功返回其在有序表中的位置,查找失败否返回0*/
    int low=1;
    int high=n;
    while(low< =high){
        mid=(loW+ high)/2;
        if(key == SL[mid].key) {return mid;}
        else if( key> SL[mid].key) low=mid+ 1;
            else high=mid-1;
    }
    return 0;
}


3,折半查找特点


折半查找的查找效率高;

平均查找性能和最坏性能相当接近;

折半查找要求查找表为有序表;

并且,折半查找只适用于顺序存储结构。


4,性能分析:


以深度为h的满二叉树为例, 即: n=2^h-1 并且查找概率相等,则


ac251337a48a4be2a3ba72f78275af23.png


当n> 50时,可得近似结果

ASL≈log2(n+1)-1


四,索引查找


在现代社会,数据充斥着我们的生活,正因为大量的数据才能有现在如此现代化的社会,但是大量的数据也给人们带来了很大的困扰。并且有的数据是很杂乱的,会导致查找困难。


所以我们想到了一种方法,就是建立索引。


索引说白了就是一个关键字,一个能帮助你更方便查找的关键字,可以是很多东西,一个字母,一个字符串,一个数字等等。


1,索引使用方法

●先分析数据规律,建立索引

●再根据索引|进行快速定位

●在定位的地方进行细致搜索


889f2536cdae4c7b954ca8115b7dc0fe.png


先分块,块间有序,就可以快速定位到块。


2,索引表的构建

1) 分块:


第Rk块中所有关键字< Rk+1块中所有关键字,(k=1, 2, ..L-1)


2)建立索引项:


关键字项:记载该块中最大关键字值;

指针项:记载该块第一 个记录在表中位置。


3)所有索引项组成索引表。


3aa1ea9e4d65424892d3b47c1935f3f2.png


3,索引表的查找


分两步,第一步是索引表的查找,第二步是查找表的查找。


索引表是有序的。


4,例子:


93b2aa147a9244c5b20ba41e832b419c.png


5,索引表的顺序查找算法思想描述


首先根据待查找关键字在索弓|表当中定位块。定位的方法是:只要key>索引块i的最大关键值,则i++, 定位下一个索引项;直到定位到索引块,或者把索弓|项都定位完也没有比key关键字大的索引项。


如果定位到块,则在块内部进行顺序查找。


6,代码实现:


int IndexSequelSearch(IndexType |s[], DataType s[], int m, KeyType key){
/*索引表为Is[0]-Is[m-1],顺序表为s */
    i=0;
    while(i <m && key>ls [i ].key) i++; /*块间查找*/
        if(i= =m)return -1; /*查找失败*/
        else{
            /*在块内顺序查找*/
            j=ls[ i ].Link;
            while(Key!=s[j].key &&j<Is[ i+1 ].Link)j++;
            if(key = = s[j].key)return j; /*查找成功*/
            else return -1; /*查找失败*/
    }
}


typedef struct IndexType
{   
    KeyType key;
    int Link;
} IndexType;


7,性能分析:


ASL=ASL(索引表)+ASL (块内)


04bca1365216432794dd6c7a7ca613d6.png

20e58a981eb7453f97c67e6d07763645.png


五,哈希查找

目录
相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
49 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
116 4
|
10天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
47 20
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
110 23
|
2月前
|
算法
数据结构之蜜蜂算法
蜜蜂算法是一种受蜜蜂觅食行为启发的优化算法,通过模拟蜜蜂的群体智能来解决优化问题。本文介绍了蜜蜂算法的基本原理、数据结构设计、核心代码实现及算法优缺点。算法通过迭代更新蜜蜂位置,逐步优化适应度,最终找到问题的最优解。代码实现了单链表结构,用于管理蜜蜂节点,并通过适应度计算、节点移动等操作实现算法的核心功能。蜜蜂算法具有全局寻优能力强、参数设置简单等优点,但也存在对初始化参数敏感、计算复杂度高等缺点。
62 20
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
机器学习/深度学习 算法 C++
数据结构之鲸鱼算法
鲸鱼算法(Whale Optimization Algorithm,WOA)是由伊朗研究员Seyedali Mirjalili于2016年提出的一种基于群体智能的全局优化算法,灵感源自鲸鱼捕食时的群体协作行为。该算法通过模拟鲸鱼的围捕猎物和喷出气泡网的行为,结合全局搜索和局部搜索策略,有效解决了复杂问题的优化需求。其应用广泛,涵盖函数优化、机器学习、图像处理等领域。鲸鱼算法以其简单直观的特点,成为初学者友好型的优化工具,但同时也存在参数敏感、可能陷入局部最优等问题。提供的C++代码示例展示了算法的基本实现和运行过程。
57 0
|
2月前
|
算法 vr&ar 计算机视觉
数据结构之洪水填充算法(DFS)
洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
59 0