算法学习3——搜索算法

搜索算法是计算机科学中用于查找特定数据的核心工具。这些算法广泛应用于各种场景,如查找数据库记录、图遍历以及路径寻找等。本文将介绍三种常见的搜索算法:二分查找、深度优先搜索(DFS)和广度优先搜索(BFS),并提供相应的Python代码示例。

1. 二分查找(Binary Search)

简介:二分查找是一种高效的搜索算法,用于在已排序的数组中查找目标值。其基本思想是将待查找的区间不断折半,缩小搜索范围。二分查找的关键是利用了数据的有序性,通过将问题规模减少一半,快速定位目标值。它比线性查找的时间复杂度更低,适合处理大规模数据。

实现过程

  1. 初始化搜索范围的左右边界leftright
  2. 计算中间位置mid
  3. 比较目标值与中间元素的大小:
    • 如果相等,则找到目标,返回mid
    • 如果目标值小于中间元素,将搜索范围缩小到左半部分。
    • 如果目标值大于中间元素,将搜索范围缩小到右半部分。
  4. 重复上述过程,直到找到目标值或搜索范围为空。

Python代码

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

# 示例
arr = [1, 3, 5, 7, 9, 11]
target = 7
index = binary_search(arr, target)
print(f"元素 {target} 的索引是 {index}")

2. 深度优先搜索(Depth-First Search, DFS)

简介:深度优先搜索是一种用于遍历或搜索树或图的算法。DFS从根节点或起始节点开始,沿着一个分支尽可能深入,直到达到叶节点或目标节点,然后回溯到上一个节点继续搜索其他分支。DFS可以用递归或栈实现,适用于需要探索所有路径或分支的情况。

实现过程

  1. 初始化一个空集合visited用于记录访问过的节点。
  2. 从起始节点开始,访问该节点并将其标记为已访问。
  3. 递归地访问所有未访问的邻接节点。
  4. 如果使用栈实现,则将当前节点入栈并循环处理栈顶节点,直到栈为空。

Python代码

def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start, end=' ')
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)

# 示例
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}
dfs(graph, 'A')

3. 广度优先搜索(Breadth-First Search, BFS)

简介:广度优先搜索是一种用于遍历树或图的算法。BFS从起始节点开始,逐层访问所有邻接节点,然后再访问这些节点的邻接节点。它使用队列实现,适用于寻找最短路径和广度优先遍历的场景。BFS的特点是先访问距离起始节点较近的节点,逐渐扩展到远离起始节点的节点。

实现过程

  1. 初始化一个空集合visited和一个队列queue,将起始节点入队。
  2. 从队列中取出节点,访问它并将其标记为已访问。
  3. 将所有未访问的邻接节点加入队列。
  4. 重复以上过程,直到队列为空。

Python代码

from collections import deque

def bfs(graph, start):
    visited = set()
    queue = deque([start])
    while queue:
        vertex = queue.popleft()
        if vertex not in visited:
            visited.add(vertex)
            print(vertex, end=' ')
            queue.extend(neighbor for neighbor in graph[vertex] if neighbor not in visited)

# 示例
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}
bfs(graph, 'A')

总结

本文介绍了三种常见的搜索算法:二分查找、深度优先搜索(DFS)和广度优先搜索(BFS)。二分查找通过折半搜索已排序数组,深度优先搜索通过递归或栈深度探索树或图,而广度优先搜索通过队列逐层遍历树或图。当然在文章里给出的都是最基础的实例,要想在实际中加以运用,还需要进步不得练习分析。关于更高阶的搜索算法,将在今后的学习中逐步向大家展示。

相关推荐

  1. 算法学习3——搜索算法

    2024-07-22 14:46:15       17 阅读
  2. 算法学习搜索算法之深度优先搜索

    2024-07-22 14:46:15       42 阅读
  3. 算法学习记录3

    2024-07-22 14:46:15       19 阅读
  4. Python搜索算法——二分搜索

    2024-07-22 14:46:15       32 阅读
  5. 算法笔记—二分搜索

    2024-07-22 14:46:15       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 14:46:15       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 14:46:15       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 14:46:15       45 阅读
  4. Python语言-面向对象

    2024-07-22 14:46:15       55 阅读

热门阅读

  1. IaaS是什么的简称?关于IaaS的介绍

    2024-07-22 14:46:15       18 阅读
  2. [C++]——常见内存泄漏场景

    2024-07-22 14:46:15       16 阅读
  3. element表单disabled功能失效问题

    2024-07-22 14:46:15       16 阅读
  4. 塔子哥的浏览记录-小红书2024笔试(codefun2000)

    2024-07-22 14:46:15       21 阅读
  5. [算法题]mari和shiny

    2024-07-22 14:46:15       17 阅读
  6. 面试官:你对ConcurrentHashMap了解多少?

    2024-07-22 14:46:15       16 阅读
  7. 封装的通用链表(list.c/list.h/test_list.c)

    2024-07-22 14:46:15       17 阅读
  8. 将SQL中的占位符替换成参数

    2024-07-22 14:46:15       14 阅读