搜索算法
搜索算法用于在数据集合中查找特定元素,是计算机科学中的基础算法。
二分查找
概述
二分查找是一种高效的搜索算法,要求数据已经有序排列。
算法步骤
- 初始化左指针和右指针
- 计算中间位置
- 比较中间元素与目标值
- 根据比较结果调整搜索范围
实现
python
def binary_search(arr, target):
left = 0
right = 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 = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]
target = 23
result = binary_search(arr, target)
print(f"元素 {target} 在索引 {result} 处") # 元素 23 在索引 5 处复杂度分析
- 时间复杂度: O(log n)
- 空间复杂度: O(1)
深度优先搜索
概述
深度优先搜索(DFS)是一种图遍历算法,沿着一条路径尽可能深地探索,直到到达终点。
算法步骤
- 访问起始节点
- 递归访问未访问的相邻节点
- 回溯到上一个节点继续探索
实现(递归)
python
def dfs(graph, node, visited=None):
if visited is None:
visited = set()
visited.add(node)
print(node, end=' ')
for neighbor in graph[node]:
if neighbor not in visited:
dfs(graph, neighbor, visited)
return visited
# 示例图
graph = {
'A': ['B', 'C'],
'B': ['A', 'D', 'E'],
'C': ['A', 'F'],
'D': ['B'],
'E': ['B', 'F'],
'F': ['C', 'E']
}
print("DFS 遍历结果:")
dfs(graph, 'A') # A B D E F C实现(迭代)
python
def dfs_iterative(graph, start):
visited = set()
stack = [start]
while stack:
node = stack.pop()
if node not in visited:
visited.add(node)
print(node, end=' ')
# 逆序添加以保持顺序
for neighbor in reversed(graph[node]):
if neighbor not in visited:
stack.append(neighbor)
return visited
print("\nDFS 迭代遍历结果:")
dfs_iterative(graph, 'A') # A C F E B D广度优先搜索
概述
广度优先搜索(BFS)是一种图遍历算法,按层遍历节点。
算法步骤
- 访问起始节点
- 依次访问所有相邻节点
- 对每个相邻节点重复步骤 2
实现
python
from collections import deque
def bfs(graph, start):
visited = set()
queue = deque([start])
visited.add(start)
while queue:
node = queue.popleft()
print(node, end=' ')
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)
return visited
# 示例
print("\nBFS 遍历结果:")
bfs(graph, 'A') # A B C D E F最短路径
python
def bfs_shortest_path(graph, start, end):
visited = {start}
queue = deque([(start, [start])])
while queue:
node, path = queue.popleft()
if node == end:
return path
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, path + [neighbor]))
return None # 无路径
# 示例
path = bfs_shortest_path(graph, 'A', 'F')
print(f"\n最短路径: {path}") # 最短路径: ['A', 'C', 'F']复杂度分析
- 时间复杂度: O(V + E),V 为顶点数,E 为边数
- 空间复杂度: O(V)