03=搜索算法(顺序搜索、二分搜索和插值搜索)

一、搜索

1.1 顺序搜索

  • 顾名思义,按顺序进行搜索的方式。其结构如下:在这里插入图片描述

  • 时间复杂度为O( n 2 n^{2} n2),一般在数据没有进行排序使用此方法

# -*- coding: utf-8 -*-  
# time: 2022/10/11 11:54  
# file: search.py  
# author: Meng  
# description:  
  
# 顺序搜索  
def order_search(item, alist):  
    # 关键词 "in" 1 in [1, 2, 3] => True    
    if item in alist:  
        print(f'{item}在alist中')  
    else:  
        print(f'{item}不在alist中')  
  

def main():  
    alist = [12, 18, 13, 16, 14, 17, 15]  
    item = 16  
    order_search(item, alist)       # => 16在alist中  
    item = 20  
    order_search(item, alist)       # => 20不在alist中  
  
  
if __name__ == '__main__':  
    main()

1.2 二分搜索

  • 二分搜索的搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。 其结构如下:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcTrMwfj-1665462837877)(C5=专题研究/C5.11=数据结构/Image/Pasted%20image%2020221011114259.png)]

  • 时间复杂度为O( l g ( n ) lg(n) lg(n)),需要在数据排序后使用此方法

# -*- coding: utf-8 -*-  
# time: 2022/10/11 11:54  
# file: search.py  
# author: Meng  
# description:  


# 二分搜索  
def binary_search(item, alist):  
    left, right = 0, len(alist)-1  
    while left <= right:  
        mid = (left + right)//2  
        if alist[mid] < item:       # 如果查找值大于中间值  
            left = mid + 1  
        elif alist[mid] > item:     # 如果查找值小于中间值  
            right = mid - 1  
        else:                       # 如果查找值等于于中间值  
            print(f'{item}在alist中')  
            return  
    print(f'{item}不在alist中')  
  
  
def main():  
    alist = [i for i in range(12, 19)]  # => [12, 13, 14, 15, 16, 17, 18]  
    item = 16  
    binary_search(item, alist)       # => 16在alist中  
    item = 20  
    binary_search(item, alist)       # => 20不在alist中  
  
  
if __name__ == '__main__':  
    main()

1.3 插值搜索

  • 插值搜索是二分搜索的改良版本,改良的部分是每次与目标元素做比较的元素并非搜索区域内的中间元素,此元素的位置需要通过如下公式计算得出 x = i t e m − A [ l e f t ] ( r i g h t − l e f t ) A [ r i g h t ] − A [ l e f t ] x=\frac{item-A[left](right-left)}{A[right]-A[left]} x=A[right]A[left]itemA[left](rightleft)其中 i t e m item item为待查找的元素, l e f t left left r i g h t right right为最左边和最右边的索引。举个例子,假设有这样一个数组[0,10,20,30,40,50,60,70,80,90] ,我们可以发现,每个相邻元素的差均为 10 ,满足均匀分布。如果要查找元素 70 ,我们首先可以计算数组中小于等于 70 的元素占所有元素的比例的期望值 p= ( 70 − 0 ) ( 90 − 0 ) = 7 9 \frac{(70-0)}{(90-0)}=\frac{7}{9} (900)(700)=97,而数组的长度 n 我们知道等于 10 ,所以我们期望查找的索引值就为 [n×p]=7 ,对应的元素为 70 ,恰好就是我们要找的元素。这样,原本用二分法需要查找 3 次的用插值查找只用查找 1 次,大大提高了查找的效率。
  • 时间复杂度为O( l o g ( l o g   n ) log(log\ n) log(log n)),需要在数据排序后使用此方法。不满足均匀分布的数据其效率可能不如二分法。
# 插值搜索  
def interpolation_search(item, alist):  
    left, right = 0, len(alist)-1  
    while left <= right:  
        if item > alist[-1] or item < alist[0]:  
            print(f'{item}不在alist中')  
            return -1  
        mid = left + int((right - left) * (item - alist[left]) / (alist[right] - alist[left]))  
        if alist[mid] < item:       # 如果查找值大于中间值  
            left = mid + 1  
        if alist[mid] > item:       # 如果查找值小于中间值  
            right = mid - 1  
        if alist[mid] == item:      # 如果查找值等于于中间值  
            print(f'{item}在alist中')  
            return mid  
    print(f'{item}不在alist中')  
  
  
def main():  
    alist = [i for i in range(8, 19, 2)]  # => [8, 10, 12, 14, 16, 18]  
    item = 16  
    interpolation_search(item, alist)       # => 16在alist中  
    item = 20  
    interpolation_search(item, alist)       # => 20不在alist中  
  
  
if __name__ == '__main__':  
    main()

1.4 参问文章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java常见的搜索算法包括: 1. 二分搜索(Binary Search):在有序数组中查找指定元素,时间复杂度为O(logn)。 2. DFS(深度优先搜索):沿着树的深度遍历树的节点,可以用来查找符合条件的路径。 3. BFS(广度优先搜索):按照层次遍历树的节点,可以用来解决最短路径问题。 4. A*算法:带有启发式的广度优先搜索算法,可以用来解决最短路径问题。 5. 最小生成树算法(如Kruskal算法、Prim算法):用于求解最小生成树问题。 6. Floyd算法:用于求解最短路径问题。 7. Dijkstra算法:用于求解最短路径问题。 8. 哈希搜索:在哈希表中查找指定元素,时间复杂度为O(1)。 ### 回答2: Java中常见的搜索算法包括线性搜索二分搜索、深度优先搜索和广度优先搜索。 线性搜索是最简单的搜索算法之一,顺序遍历目标集合,逐个比较元素与目标值是否相等。如果找到了目标值,则返回其索引;否则,返回指定的“未找到”值。 二分搜索是一种高效的搜索算法,要求目标集合为有序。它通过重复地将目标集合一分为二,并比较中间元素与目标值的大小关系,以确定目标值所在的范围。二分搜索的时间复杂度为O(log n),远低于线性搜索的O(n)。 深度优先搜索(DFS)是一种递归的搜索算法,它从起始节点开始,沿着路径尽可能深地搜索,直到找到目标节点或达到搜索边界。如果找到了目标节点,则返回其路径;否则,返回指定的“未找到”值。 广度优先搜索(BFS)是一种迭代的搜索算法,它从起始节点开始,逐层地向外发散搜索,直到找到目标节点或搜索完所有可能的节点。广度优先搜索通常借助队列来实现,保证先搜索完当前层的节点再搜索下一层。 以上是Java中常见的搜索算法,它们在不同的场景中都有不同的应用。根据具体的需求和数据结构,选择合适的搜索算法可以提高程序的效率和性能。 ### 回答3: Java常见的搜索算法有以下几种: 1. 顺序搜索:也称为线性搜索,逐个比较待搜索元素和目标元素,直到找到目标元素或搜索完所有元素。它的时间复杂度是O(n)。 2. 二分搜索:要求被搜索的数组或有序列表是已排序的,通过不断缩小搜索范围,每次将搜索区间缩小一半,直到找到目标元素或搜索区间为空。它的时间复杂度是O(logn)。 3. 插值搜索:类似于二分搜索,但是根据目标元素和搜索区间的分布情况,通过插值的方式来确定下一次搜索的位置,进一步缩小搜索范围。它的平均时间复杂度是O(loglogn)。 4. 广度优先搜索(BFS):通过逐层地遍历图或树的所有节点,找到目标元素。可以用于求解最短路径等问题。 5. 深度优先搜索(DFS):通过递归或栈的方式深入到图或树的最底层,然后回溯到上一层继续搜索,直到找到目标元素。可以用于求解迷宫问题、拓扑排序等问题。 6. 哈希搜索:利用哈希函数将待搜索的元素映射到一个桶中,以提高搜索的效率。常见的哈希搜索算法有线性探测法、二次探测法和链地址法。 7. 强化学习:在机器学习中,强化学习算法可以通过与环境交互来搜索最优策略。常见的算法有Q-learning、Deep Q Network(DQN)等。 这些搜索算法在不同场景下有不同的应用,根据具体的问题需求选择适合的搜索算法可以提高程序的效率和性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伤心兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值