一、排序
冒泡排序、选择排序、插入排序、 快速排序、归并排序、桶排序
二、枚举
三、二分查找与二分答案
四、搜索(DFS)
DFS(DFS基础、回溯、剪枝、记忆化)
1.DFS算法(深度优先搜索算法)
深度优先搜索( DFS )是一种用于遍历或搜索图或树的算法,它从起始节点开始,沿着一条路径一直深入直到无法继续为止,然后回溯到上一个节点继续探索。 DFS 使用栈来记录遍历的路径,它优先访问最近添加到栈的节点。
DFS 的主要优点是简单且易于实现,它不需要额外的数据结构来记录节点的访问情况,仅使用栈来存储遍历路径。然而, DFS 可能会陷入无限循环中,因为它不考虑节点是否已经访问过。
对于一个连通图,深度优先搜索遍历的过程如下:
(1)从图中某个顶点v出发,访问v;
(2)找到刚访问过的顶点的第一个未被访问的邻接点,访问该顶点。 以该顶点为新顶点,重 复此步骤, 直至刚访问过的顶点没有未被访问的邻接点为止。
(3)返回前一个访问过的且仍有未被访问的邻接点的顶点,找出该顶点的下一个未被访问的邻接点, 访问该顶点。
(4)重复步骤 (2) 和(3), 直至图中所有顶点都被访问过,搜索结束。
顶点访问序列:v1 -> v2 -> v4 -> v8 -> v5 -> v3 -> v6 -> v7
DFS 使用栈来记录遍历的路径,它优先访问最近添加到栈的节点。
显然, 深度优先搜索遍历连通图是一个递归的过程。 为了在遍历过程中便千区分顶点是否已
被访问,需附设访问标志数组 visited[n] , 其初值为 "false", 一旦某个顶点被访问,则其相应的分
量置为 "true"。
python语言:
# 图的DFS遍历
def dfs(graph, start, visited):
# 访问当前节点
print(start, end=' ')
# 标记当前节点为已访问
visited[start] = True
# 遍历当前节点的邻居节点
for neighbor in graph[start]:
# 如果邻居节点未被访问,则继续深度优先搜索
if not visited[neighbor]:
dfs(graph, neighbor, visited)
# 图的邻接表表示
graph = {
'1': ['2', '3'],
'2': ['2', '4', '5'],
'3': ['1', '6', '7'],
'4': ['2','8'],
'5': ['2','8'],
'6': ['3','7'],
'7': ['3','6'],
'8': ['4','5']
}
# 标记节点是否已访问的列表
visited = {node: False for node in graph}
# 从节点A开始进行DFS遍历
print("DFS遍历结果:")
dfs(graph, '1', visited)
C++ / C语言:
算法1.深度优先搜索遍历连通图
// 1. 深度优先搜索遍历连通图
bool visited[MVNum];