数据结构---查找

个人介绍

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述
🦁作者简介:一名喜欢分享和记录学习的在校大学生
💥个人主页:code袁
💥 个人QQ:2647996100
🐯 个人wechat:code8896

专栏导航

code袁系列专栏导航
1.毕业设计与课程设计:本专栏分享一些毕业设计的源码以及项目成果。🥰🥰🥰
2.微信小程序开发:本专栏从基础到入门的一系开发流程,并且分享了自己在开发中遇到的一系列问题。🤹🤹🤹
3.vue开发系列全程线路:本专栏分享自己的vue的学习历程。

非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

在这里插入图片描述

在这里插入图片描述
当涉及查找算法时,有许多不同的方法可供选择,每种方法都有其独特的特点和适用场景。以下是一篇关于查找算法的学习笔记,包括算法原理、代码示例和实际例子:


1. 线性查找(Linear Search)

算法原理:线性查找算法,也被称为顺序查找算法,是一种简单的搜索算法,用于在一个元素集合中查找特定元素的位置或确定特定元素是否存在。
它的操作非常直观,它从集合的第一个元素开始,逐一检查每个元素,直到找到目标元素或者遍历整个集合为止。

代码示例

def linear_search(arr, target):
    for i in range(len(arr)):
        if arr[i] == target:
            return i
    return -1

# 示例
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
target = 5
result = linear_search(arr, target)
print("目标值在列表中的索引:", result)

优缺性
(1)适用性:由于线性表有顺序存储和链式存储两种存储方式,顺序查找对这两种存储方式都适用,若对于顺序表,则通过数组的下标依次查找;对于链表,则通过指针依次查找,在链表中只能进行顺序查找。
(2)关键字比较次数:查找成功或不成功,关键字的比较次数始终是n+1次,当定位至第i个元素时,关键字的比较次数为n-i+1。由于这里采用监视哨(哨兵)的程序代码,若不采用监视哨,关键字的比较次数为n。
(3)平均查找长度:ASL成功=(n+1)/2,ASL不成功=n+1。
(4)时间复杂度:顺序查找的时间复杂度为O(n)。
(5)优缺点:顺序查找的优点是对元素的存储没有要求,可以顺序存储和链式存储,且对表内的有序性也没有要求;其缺点是当n较大时,ASL较大,导致效率低。

2. 二分查找(Binary Search)

算法原理:二分查找要求在有序列表中查找目标值,通过比较目标值和列表中间元素的大小关系,缩小查找范围。
其基本步骤如下(设查找表有n个元素):
(1)初始查找范围,置初始变量范围,low=1,high=n;
(2)取中间元素,即mid=⌊(low+high)/2⌋(向下取整,取比它小的最大整数);
(3)将指定查找的关键字与中间元素进行比较,若相等,则表示查找成功,查找的元素即为mid指向的位置;若不相等,根据大于还是小于中间元素,选择中间元素的另一边元素继续进行比较:
①若查找关键字小于中间元素,low不变,high变为mid-1;
②若查找关键字大于中间元素,high不变,low变为mid+1。
(4)重复以上(2)、(3)步骤,直到查找成功或查找范围超出(low>high)为止。
在这里插入图片描述
在这里插入图片描述

代码示例

def binary_search(arr, target):
    low, high = 0, len(arr) - 1
    while low <= high:
        mid = (low + high) // 2
        if arr[mid] == target:
            return mid
        elif arr[mid] < target:
            low = mid + 1
        else:
            high = mid - 1
    return -1

# 示例
arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
target = 13
result = binary_search(arr, target)
print("目标值在列表中的索引:", result)
```。

### 3. 哈希表查找(Hash Table Search)

**算法原理**:哈希表通过哈希函数将键映射到存储桶中,实现快速的查找操作。

**代码示例**:
```python
# 使用Python内置的字典实现哈希表
hash_table = {'A': 1, 'B': 2, 'C': 3, 'D': 4}

# 查找操作
key = 'C'
if key in hash_table:
    print("键'{}'对应的值为{}".format(key, hash_table[key]))
else:
    print("键'{}'不存在".format(key))

3. 分块查找

1、查找思想
分块查找也称为索引顺序查找,它将查找表分为若干块,要求每个块内可以无序,但块间是必须有序的,即上一块的最大关键字大于或小于后一块中的最小或最大关键字值。
另外,还需建立一个索引表,索引表内是按关键字排列有序的,索引表中的一项对应线性表的一块,索引表内由关键字域和指针域组成,前者存放该块内的最大关键字,后者存放指向该块中第一个和最后一个元素的指针(数组下标值)。

#include <stdio.h>
 
// 定义块的结构
struct Block {
    int size;        // 块的大小
    int *data;       // 块内的数据
    int max;         // 块内数据的最大值(用于加速搜索)
};
 
// 分块查找函数
int blockSearch(struct Block blocks[], int numBlocks, int target) {
    int blockIndex = 0;
 
    // 在每个块中进行线性查找,找到包含目标值的块
    while (blockIndex < numBlocks && target > blocks[blockIndex].max) {
        blockIndex++;
    }
 
    // 在找到的块中进行线性查找
    for (int i = 0; i < blocks[blockIndex].size; i++) {
        if (blocks[blockIndex].data[i] == target) {
            return blockIndex * blocks[blockIndex].size + i; // 返回元素的全局索引
        }
    }
 
    // 如果未找到目标值
    return -1;
}
 
int main() {
    // 示例数据
    struct Block blocks[] = {
        {5, (int[]){1, 3, 5, 7, 9}, 9},
        {5, (int[]){11, 13, 15, 17, 19}, 19},
        {4, (int[]){21, 23, 25, 27}, 27}
    };
 
    int numBlocks = sizeof(blocks) / sizeof(blocks[0]);
    int target = 15;
 
    // 执行分块查找
    int result = blockSearch(blocks, numBlocks, target);
 
    if (result != -1) {
        printf("元素 %d 在数组中的索引是 %d。\n", target, result);
    } else {
        printf("元素 %d 不在数组中。\n", target);
    }
 
    return 0;
}

优缺性
1.减小查找范围: 分块查找充分利用了数据集的分块结构,可以迅速定位到包含目标元素的块,从而缩小了查找范围,减少了查找的时间复杂度。

2.适用于分布式存储: 当数据分布在多个块中,每个块都可以存储在不同的存储设备或位置上时,分块查找可以用于分布式存储系统中,提高查找效率。

3.适用于静态数据: 如果数据集是静态的,即不会频繁发生插入、删除等操作,分块查找可以更好地发挥其优势。因为在动态数据集中,频繁的插入和删除可能导致块的重新组织,增加了实现的复杂性。

4.块内线性查找: 在找到包含目标元素的块后,仍需要在该块内进行线性查找。如果块内的元素数量较大,查找效率可能不如其他更高效的算法。

5.对块的依赖性: 分块查找对于块的划分敏感,如果块的划分不合理,可能导致查找效率下降。因此,块的选择需要谨慎,并且在动态数据集中可能需要频繁调整块的划分。

6.不适用于动态数据: 在频繁发生插入和删除操作的动态数据集中,分块查找可能需要频繁地调整块的划分,导致算法复杂度增加,不如一些更适合动态数据的数据结构和算法。

🎉写在最后

🍻伙伴们,如果你已经看到了这里,觉得这篇文章有帮助到你的话不妨点赞👍或 Star ✨支持一下哦!手动码字,如有错误,欢迎在评论区指正💬~

你的支持就是我更新的最大动力💪~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/705960.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis之线程IO模型

引言 Redis是个单线程程序&#xff01;这点必须铭记。除了Redis之外&#xff0c;Node.js也是单线程&#xff0c;Nginx也是单线程&#xff0c;但是他们都是服务器高性能的典范。 Redis单线程为什么能够这么快&#xff01; 因为他所有的数据都在内存中&#xff0c;所有的运算都…

嵌入式系统中判断大小端的方法与实现

第一&#xff1a;大小端基本分析 程序判断计算机是大端的还是小端的&#xff0c;判断的思路是确定一个多字节的值(下面使用的是4字节的整数)&#xff0c;将其写入内存(即赋值给一个变量)&#xff0c;然后用指针取其首地址所对应的字节(即低地址的一个字节)&#xff0c;判断该字…

解决:selenium运行时driver初始化失败 DevToolsActivePort file doesn‘t exist的问题

解决&#xff1a;selenium运行时driver初始化失败 DevToolsActivePort file doesn‘t exist的问题 DevToolsActivePort file doesnt exist报错信息&#xff1a;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b3f8acc1c47d45e3912575896e421567.png)现象&#xff1…

ubuntu软件安装

目录 更新Ubuntu软件下载地址 1. 寻找国内镜像源 2. 备份Ubuntu默认的源地址 3. 更新源服务器列表 4. 更新源 更新Ubuntu软件下载地址 1. 寻找国内镜像源 所谓的镜像源&#xff1a;可以理解为提供下载软件的地⽅&#xff0c;⽐如 Android ⼿机上可以下载软件的 91 ⼿机助…

AnythingLLM 的 Docker 使用

AnythingLLM是使用大语言模型LLM的一站式简便框架。官网的介绍如下&#xff1a; AnythingLLM is the easiest to use, all-in-one AI application that can do RAG, AI Agents, and much more with no code or infrastructure headaches. 1. 使用官方docker 最方便的方法是使…

Day50 代码随想录打卡|二叉树篇---验证二叉搜索树

题目&#xff08;leecode T98&#xff09;&#xff1a; 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右…

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件

SpringBoot整合H2数据库并将其打包成jar包、转换成exe文件 H2 是一个用 Java 开发的嵌入式数据库&#xff0c;它的主要特性使其成为嵌入式应用程序的理想选择。H2 仅是一个类库&#xff0c;可以直接嵌入到应用项目中&#xff0c;而无需独立安装客户端和服务器端。 常用开源数…

Docker部署常见应用之大数据基础框架Hadoop

文章目录 Hadoop简介主要特点核心组件生态系统 Docker Compose 部署集群参考文章 Hadoop简介 Hadoop是一个开源框架&#xff0c;由Apache软件基金会开发&#xff0c;用于在普通硬件构建的集群中存储和处理大量数据。它最初由Doug Cutting和Mike Cafarella创建&#xff0c;并受…

安卓照片找回不再困扰,掌握5个步骤让回忆永不褪色

手机照片记录了过去&#xff0c;承载着我们的回忆&#xff0c;让我们能够在繁忙的生活中找到那份温暖和宁静。然而&#xff0c;随着时间的推移和技术的进步&#xff0c;照片的存储和备份方式也在不断变化。当我们不小心删除了手机里的照片时&#xff0c;那份失落和焦虑便油然而…

【Python】数据处理:SQLite操作

使用 Python 与 SQLite 进行交互非常方便。SQLite 是一个轻量级的关系数据库&#xff0c;Python 标准库中包含一个名为 sqlite3 的模块&#xff0c;可以直接使用。 import sqlite3数据库连接和管理 连接到 SQLite 数据库。如果数据库文件不存在&#xff0c;则创建一个新数据库…

家用洗地机前十名排行榜:2024十大热销款式好用不踩雷

洗地机强大的清洁力和高效的清洁效率&#xff0c;迅速代替了吸尘器、电动拖把、蒸汽拖把的位置&#xff0c;成为家庭地面清洁的新宠&#xff0c;各大厂商也纷纷上新自家新品。但是这个也造成了人们在挑选机型的时候无从下手&#xff0c;甚至很多新手购机&#xff0c;几乎对洗地…

【学习笔记】finalshell上传文件夹、上传文件失败或速度为0

出现标题所述的情况&#xff0c;大概率是finalshell上传文件的过程中的权限不够。 可参照&#xff1a;Finalshell上传文件失败或者进度总为百分之零解决方法 如果不成功&#xff0c;建议关闭客户端重试。 同时建议在设置finalshell的ssh连接时根据不同用户设置多个连接&#xf…

【git使用一】windows下git下载、安装和卸载

目录 &#xff08;1&#xff09;下载安装包 &#xff08;2&#xff09;安装git &#xff08;3&#xff09;安装验证 &#xff08;4&#xff09;卸载git &#xff08;1&#xff09;下载安装包 官网下载地址&#xff1a;Git 国内镜像下载地址&#xff1a;CNPM Binaries Mir…

[C++] 从零实现一个ping服务

&#x1f4bb;文章目录 前言ICMP概念报文格式 Ping服务实现系统调用函数具体实现运行测试 总结 前言 ping命令&#xff0c;因为其简单、易用等特点&#xff0c;几乎所有的操作系统都内置了一个ping命令。如果你是一名C初学者&#xff0c;对网络编程、系统编程有所了解&#xff…

Qt creator day1 练习

自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面&#xff0c;要求&#xff1a;第行代码都有注释 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("贪玩蓝月——是兄弟就来砍我 登入&#…

[亲测好用]10个热门音频剪辑软件分享,快来看看你适合哪种

市面上的音频剪辑软件千千万&#xff0c;要想找到适合自己的音频剪辑软件的话&#xff0c;还是需要多多对比。今天小编总结了市面上比较热门的10款热门音频剪辑软件来进行对比测评&#xff0c;希望可以通过这篇文章可以帮助你找到适合自己的音频剪辑软件。 音频剪辑软件一&…

论文研读|以真实图像为参考依据的AIGC检测

前言&#xff1a;这篇文章介绍几篇AIGC检测的相关工作&#xff0c;其中前几篇文章是以真实图像的特征作为标准进行检测&#xff0c;最后一篇文章就当拓展一下知识边界吧&#xff5e; 目录 Detecting Generated Images by Real Images Only (202311 arXiv)Let Real Images be as…

高速直线导轨驱动与控制,精准稳定的运动核心元件

直线导轨在工业生产中&#xff0c;精度和稳定性是至关重要的。而在各种机械设备中&#xff0c;高精度直线导轨是提高设备运动控制精度和平稳性的核心部件&#xff0c;当我们考虑高速运动时&#xff0c;直线导轨的精度和稳定性是非常重要的因素。 直线导轨系统中如何确保高速运动…

美丽的拉萨,神奇的布达拉宫

原文链接&#xff1a;美丽的拉萨&#xff0c;神奇的布达拉宫 2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT-3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年11月7日&#xff0c;OpenAI首届…

Selenium - 启动后报org.openqa.selenium.InvalidArgumentException: invalid argument错

● 出现的异常&#xff1a; Build info: version: 3.141.59, revision: e82be7d358, time: 2018-11-14T08:25:48 System info: host: DESKTOP-H7TOMMO, ip: 192.168.64.1, os.name: Windows 10, os.arch: amd64, os.version: 10.0, java.version: 1.8.0_131 Driver info: dr…