📜  Python搜索算法(1)

📅  最后修改于: 2023-12-03 14:46:44.737000             🧑  作者: Mango

Python搜索算法

搜索算法是指在给定数据集合中查找特定元素的过程。Python提供了多种搜索算法,每种都适用于不同的数据集大小和特性。

1. 线性搜索

线性搜索是最简单最直接的搜索算法,它遍历整个数据集合以寻找目标元素。对于小型数据集合来说,线性搜索效率很高,但对于较大的集合,就需要更快的算法。

代码示例:

def linear_search(data, target):
    for i in range(len(data)):
        if data[i] == target:
            return i
    return -1  # 如果没找到就返回-1

data = [1, 3, 5, 7, 9]
target = 5

result = linear_search(data, target)
if result == -1:
    print("未找到该元素")
else:
    print("找到该元素,下标为:", result)

输出结果:

找到该元素,下标为: 2
2. 二分搜索

二分搜索是一种更高效的算法,它利用了数据集合的特性,即数据已经排好序。二分搜索通过将数据集合一分为二,递归的方式查找目标元素。对于大型的、已经按一定规则排好序的数据集合来说,二分搜索是一种非常高效的算法。

代码示例:

def binary_search(data, target, low, high):
    if low > high:
        return -1
    
    mid = (low + high) // 2
    if target == data[mid]:
        return mid
    elif target < data[mid]:
        return binary_search(data, target, low, mid-1)
    else:
        return binary_search(data, target, mid+1, high)

data = [1, 3, 5, 7, 9]
target = 5

result = binary_search(data, target, 0, len(data)-1)
if result == -1:
    print("未找到该元素")
else:
    print("找到该元素,下标为:", result)

输出结果:

找到该元素,下标为: 2
3. 广度优先搜索

广度优先搜索(BFS)是一种用于解决图或树中搜索问题的算法。在广度优先搜索中,它会首先对根节点周围的所有节点进行访问,然后是这些节点周围的所有节点,依此类推。这种搜索方式可以用来寻找图或树中的最短路径问题。

代码示例:

from queue import Queue

graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

def bfs(graph, start, target):
    visited = set()
    queue = Queue()
    queue.put(start)
    
    while queue:
        node = queue.get()
        if node == target:
            return True
        visited.add(node)
        for n in graph[node]:
            if n not in visited:
                queue.put(n)
    
    return False

start = 'A'
target = 'F'

result = bfs(graph, start, target)
if result:
    print("找到了目标节点")
else:
    print("未找到目标节点")

输出结果:

找到了目标节点
4. 深度优先搜索

深度优先搜索(DFS)也是一种用于解决图或树中搜索问题的算法。在深度优先搜索中,它会尽可能遍历树或图中的一个分支,直到达到叶子节点,然后返回继续遍历它。这种搜索方式可以用来寻找图或树中的所有路径问题。

代码示例:

graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

def dfs(graph, start, target, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    
    if start == target:
        return True
    
    for n in graph[start]:
        if n not in visited:
            if dfs(graph, n, target, visited):
                return True
    
    return False

start = 'A'
target = 'F'

result = dfs(graph, start, target)
if result:
    print("找到了目标节点")
else:
    print("未找到目标节点")

输出结果:

找到了目标节点