【Python查找算法】二分查找、线性查找、哈希查找

这篇具有很好参考价值的文章主要介绍了【Python查找算法】二分查找、线性查找、哈希查找。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1 二分查找算法

 2 线性查找算法

3 哈希查找算法


1 二分查找算法

        二分查找(Binary Search)是一种用于在有序数据集合中查找特定元素的高效算法。它的工作原理基于将数据集合分成两半,然后逐步缩小搜索范围,直到找到目标元素或确定目标元素不存在。

【Python查找算法】二分查找、线性查找、哈希查找,Python算法30篇,算法,python

以下是二分查找的工作原理的详细说明: 

  1. 有序数据集合:首先,数据集合必须是有序的,通常是按升序或降序排列的。这一点非常重要,因为二分查找的核心思想是根据中间元素与目标元素的大小关系来确定搜索范围。

  2. 初始化指针:初始化两个指针,一个指向数据集合的第一个元素(左指针),另一个指向最后一个元素(右指针)。

  3. 确定中间元素:计算左指针和右指针的中间位置,即 (left + right) // 2。这将确定搜索区域的中间元素。

  4. 比较中间元素:将中间元素与目标元素进行比较:

    • 如果中间元素等于目标元素,搜索成功,返回中间元素的索引。
    • 如果中间元素大于目标元素,说明目标元素应该在左半部分,将右指针移到中间元素的左侧一位,即 right = mid - 1
    • 如果中间元素小于目标元素,说明目标元素应该在右半部分,将左指针移到中间元素的右侧一位,即 left = mid + 1
  5. 重复步骤3和4:在每次比较后,缩小搜索范围,继续比较直到找到目标元素或搜索范围为空(即左指针大于右指针)。

  6. 返回结果:如果找到目标元素,返回它的索引;如果搜索范围为空仍未找到目标元素,返回一个指示未找到的值(通常是 -1)。

以下是一个简单的示例,演示如何使用二分查找在有序数组中查找目标元素:

def binary_search(arr, target):
    left, right = 0, len(arr) - 1  # 初始化左右指针,分别指向数组的起始和结束位置
    
    while left <= right:  # 当左指针不大于右指针时,继续搜索
        mid = (left + right) // 2  # 计算中间位置
        
        if arr[mid] == target:  # 如果中间元素等于目标元素,搜索成功
            return mid  # 返回中间元素的索引
        elif arr[mid] < target:  # 如果中间元素小于目标元素,说明目标在右半部分
            left = mid + 1  # 移动左指针到中间元素的右侧一位
        else:  # 否则,目标在左半部分
            right = mid - 1  # 移动右指针到中间元素的左侧一位
    
    return -1  # 如果搜索范围为空仍未找到目标元素,返回 -1 表示未找到

# 示例用法
sorted_list = [1, 2, 3, 4, 7, 9]
target_element = 7
result = binary_search(sorted_list, target_element)
if result != -1:
    print(f"元素 {target_element} 在索引 {result} 处找到。")
else:
    print("元素未找到。")

上述代码演示了如何使用二分查找在有序列表 sorted_list 中查找目标元素 7。根据工作原理,二分查找的时间复杂度为 O(log n),其中 n 是数据集合的大小,这使得它非常适合在大型有序数据集合中查找目标元素。

 2 线性查找算法

        线性查找(Linear Search)是一种简单的搜索算法,也称为顺序查找。它的工作原理是逐个遍历数据集合中的元素,直到找到匹配的元素或遍历整个集合。

原理:

  1. 从数据集合的第一个元素开始,逐个检查每个元素,直到找到匹配的元素或遍历整个集合。

  2. 如果找到与目标元素匹配的元素,返回该元素的索引(位置)。

  3. 如果遍历整个集合都没有找到匹配的元素,返回特定的“未找到”值(通常是 -1)。

以下是线性查找的原理示例:

数据集合: [2, 4, 7, 1, 9, 3]
要查找的元素: 7

初始状态:
  ↓
[2, 4, 7, 1, 9, 3]
 ^
 
第一次比较:元素 2 与目标 7 不匹配,继续下一个元素。
  ↓
[2, 4, 7, 1, 9, 3]
    ^

第二次比较:元素 4 与目标 7 不匹配,继续下一个元素。
  ↓
[2, 4, 7, 1, 9, 3]
       ^

第三次比较:元素 7 与目标 7 匹配,找到了目标元素。
  ↓
[2, 4, 7, 1, 9, 3]
          ^
          
目标元素 7 找到在索引 2 处。

        上述示意图演示了如何使用线性查找在给定的数据集合中查找目标元素 7。算法从数据集合的第一个元素开始逐个比较,直到找到匹配的元素或遍历整个集合。

        这个示意图反映了线性查找的工作原理,即逐个遍历数据元素以寻找匹配项。如果目标元素存在于数据集合中,线性查找将找到该元素的索引。如果目标元素不存在,则遍历整个数据集合后返回特定的未找到值(通常是 -1)。

以下是一个Python线性查找示例代码:

def linear_search(arr, target):
    """
    线性查找函数

    Parameters:
    - arr: 待查找的列表
    - target: 要查找的目标元素

    Returns:
    - 如果找到目标元素,返回其索引;否则返回 -1。
    """
    for i in range(len(arr)):  # 遍历列表中的每个元素
        if arr[i] == target:  # 如果当前元素与目标元素匹配
            return i  # 返回匹配元素的索引
    return -1  # 如果遍历完整个列表未找到匹配元素,返回 -1 表示未找到

# 示例用法
my_list = [2, 4, 7, 1, 9, 3]
target_element = 7

result = linear_search(my_list, target_element)  # 调用线性查找函数

if result != -1:
    print(f"元素 {target_element} 在索引 {result} 处找到。")
else:
    print("元素未找到。")

        在上述代码中,linear_search 函数用于执行线性查找。它接受两个参数:要查找的列表 arr 和目标元素 target。函数逐个遍历列表中的元素,如果找到匹配的元素,则返回匹配元素的索引;如果遍历完整个列表都没有找到匹配元素,则返回 -1 表示未找到。

        示例用法演示了如何调用 linear_search 函数来查找目标元素 7 在列表 my_list 中的位置。如果找到目标元素,程序将打印出找到的索引,否则打印 "元素未找到。"。

3 哈希查找算法

        哈希查找(Hash Search)是一种高效的搜索算法,它利用哈希函数将键映射到存储位置,并在该位置查找目标元素。哈希查找适用于快速查找和检索,特别适用于大型数据集合。以下是哈希查找的详细解释和示例:

工作原理:

  1. 哈希表:哈希查找的核心是哈希表,它是一个数据结构,由键-值对组成。哈希表内部使用哈希函数将键转换为存储位置(索引),然后将键和值存储在该位置。

  2. 哈希函数:哈希函数接受一个键作为输入,并生成一个索引(位置),通常是一个整数。好的哈希函数应该具有以下特性:

    • 对于相同的输入键,始终生成相同的索引。
    • 将不同的输入键均匀地映射到不同的索引,以减少冲突。
    • 生成的索引应尽可能分散,以降低冲突的可能性。
  3. 查找过程:要查找目标元素,哈希函数首先计算目标元素的哈希值(索引),然后在哈希表的该位置查找对应的值。如果找到匹配的值,查找成功;否则,表示未找到目标元素。

示例代码:

以下是一个使用Python的哈希查找示例代码,我们将使用字典作为哈希表来演示:

# 创建一个哈希表(字典)
my_dict = {'apple': 3, 'banana': 2, 'cherry': 5, 'date': 1, 'grape': 4}

# 要查找的目标键
target_key = 'banana'

# 使用哈希查找
if target_key in my_dict:
    value = my_dict[target_key]
    print(f"The value of {target_key} is {value}")
else:
    print(f"{target_key} not found")

        在上述示例中,我们首先创建了一个哈希表 my_dict,其中包含键-值对。然后,我们定义了要查找的目标键 target_key'banana'。通过使用哈希查找,我们可以直接访问哈希表中的值,而不需要逐个遍历整个集合。如果目标键存在于哈希表中,我们将获得与该键关联的值。

        请注意,哈希查找的效率非常高,因为它通常具有常量时间复杂度 O(1)。然而,哈希函数的设计和解决冲突的方法对算法的性能至关重要。合适的哈希函数和处理冲突的方法可以确保高效的哈希查找。

4 应用

  1. 线性查找(Linear Search):

    • 工作原理:逐个遍历数据集合,查找目标元素。
    • 应用:适用于小型无序数据集合,或当数据无序且不频繁查找时。常见于简单的列表或数组。
  2. 二分查找(Binary Search):

    • 工作原理:适用于有序数据集合,将数据集合分成两半,逐步缩小搜索范围。
    • 应用:适用于大型有序数据集合,如数组或有序列表。常见于数据库索引等高效查找场景。
  3. 哈希查找(Hash Search):

    • 工作原理:通过哈希函数将键映射到存储位置,查找时直接访问该位置。
    • 应用:适用于快速查找,如字典、散列表(哈希表)等数据结构。常用于处理大量数据的快速索引。
  4. 二叉搜索树查找(Binary Search Tree Search):文章来源地址https://www.toymoban.com/news/detail-714056.html

    • 工作原理:通过二叉搜索树的有序性,在左子树或右子树中查找目标元素。
    • 应用:适用于维护有序数据集合,如数据库索引、字典实现等

到了这里,关于【Python查找算法】二分查找、线性查找、哈希查找的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】【Python3、动态规划、贪心、二分查找】力扣1671. 得到山形数组的最少删除次数

    1671. 得到山形数组的最少删除次数 给定一个整数数组 nums ,我们定义该数组为山形数组当且仅当: nums 的长度至少为 3。 存在一个下标 i 满足 0 i len(nums) - 1 且: nums[0] nums[1] ... nums[i - 1] nums[i] nums[i] nums[i + 1] ... nums[len(nums) - 1] 现在,给定整数数组 nums ,我们的目标是将其变为

    2024年01月18日
    浏览(53)
  • 数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

    目录 开放地址法(Open Addressing) 线性探测(Linear Probing) 散列表查找性能分析 平方探测(Quadratic Probing)  定理 平方探测法的查找与插入 双散列探测法(Double Hashing)  再散列(Rehashing) 分离链接法(Separate Chaining) 平均查找次数 分离链接法的散列表实现 常用处理冲突的

    2024年02月08日
    浏览(66)
  • 折半查找(二分查找)的两种方法及实现 Python

    概念: 在计算机科学中,折半查找,也称二分查找,是一种在有序数组中查找某一特定元素的搜索算法。 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一

    2024年02月09日
    浏览(41)
  • chatgpt使用python写一段二分查找的demo

    以下是一个Python实现的简单二分查找算法的代码示例: 这个代码示例实现了一个二分查找算法,用于在已排序的列表中查找目标值。它通过不断将搜索范围缩小为左半部分或右半部分来快速定位目标值,从而提高了查找效率。如果找到目标值,它会返回目标值的索引,否则返

    2024年02月09日
    浏览(72)
  • 代码随想录Python:704. 二分查找,27. 移除元素

    数组是非常基础的数据结构。 数组是存放在连续内存空间上的相同类型数据的集合。 题目: 给定一个  n  个元素有序的(升序)整型数组  nums  和一个目标值  target   ,写一个函数搜索  nums  中的  target ,如果目标值存在返回下标,否则返回  -1 。 题目链接:. - 力扣

    2024年02月13日
    浏览(53)
  • 【算法系列篇】二分查找——这还是你所知道的二分查找算法吗?

    在生活中,我们往往会遇到在数组中查找某个确定的元素的时候,通常我们会选择使用暴力解法,这样虽然简单,但是时间复杂度是O(N),时间效率比较低。那么是否有方法可以使得在具有二段性的数组中找某一特定的元素的时间复杂度低于0(N)呢?答案是肯定的,当我们可以

    2024年02月11日
    浏览(52)
  • 【算法系列 | 8】深入解析查找算法之—二分查找

    心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第8讲,讲一下查找算法的二分查找 查找算法是很常见的一类问题,主

    2024年02月07日
    浏览(55)
  • C++二分算法(二分查找&二分答案)细节详解

     二分算法可以分为 二分查找 和 二分答案 。 以在一个 升序数组 中查找一个数为例。它每次考察数组当前部分的 中间元素 ,如果中间元素刚好是要找的,就结束搜索过程;如果中间元素小于所查找的值,那么左侧的只会更小,不会有所查找的元素,只需到右侧查找;如果

    2024年02月08日
    浏览(53)
  • 【算法】二分查找(整数二分和浮点数二分)

    大家好!今天我们来学习二分查找算法,这是一种效率很高的算法哦! 目录 1. 整数二分 2. 整数二分模板 3. 整数二分模板题 3.1 洛谷 P2249 【深基13.例1】查找 3.2 Acwing789. 数的范围 4. 浮点数二分 5. 浮点数二分模板 6. 浮点数二分模板题 6.1 Acwing 790.数的三次方根 6.2 洛谷 P1024 [

    2024年02月10日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包