13. 算法入门 - Intro to Algorithms_哔哩哔哩_bilibili
1. 简介
在第 13 集中,视频主要介绍了算法,解释了算法的重要性及其在计算机科学中的核心地位。视频详细讲解了几种经典排序算法,如选择排序和归并排序,并介绍了图搜索算法中的 Dijkstra 算法。通过示例和伪代码,深入浅出地讲解了这些算法的实现和复杂度。
2. 排序算法
2.1 选择排序
选择排序(Selection Sort)是一种基础的排序算法,其核心思想是每次找到数组中的最小元素,并将其与数组的当前元素交换位置。具体步骤如下:
- 从数组的第一个元素开始,找到最小的元素。
- 将最小元素与第一个元素交换位置。
- 从第二个元素开始重复这个过程,直到数组完全有序。
伪代码:
for i from 0 to n - 1:
minIndex = i
for j from i to n - 1:
if array[j] < array[minIndex]:
minIndex = j
swap(array[i], array[minIndex])
选择排序的时间复杂度为 O(n ^ 2),因为其需要两层嵌套循环来找到最小元素并进行交换。因此,当数组规模增大时,其效率会显著降低。
2.2 归并排序
归并排序(Merge Sort)是一种更高效的排序算法,其核心思想是分治法。具体步骤如下:
- 检查数组大小是否大于 1,如果是,则将数组分成两部分。
- 递归地对两部分分别进行归并排序。
- 将这两部分合并成一个有序数组。
伪代码:
def mergeSort(array):
if len(array) > 1:
mid = len(array) // 2
leftHalf = array[:mid]
rightHalf = array[mid:]
mergeSort(leftHalf)
mergeSort(rightHalf)
i = j = k = 0
while i < len(leftHalf) and j < len(rightHalf):
if leftHalf[i] < rightHalf[j]:
array[k] = leftHalf[i]
i += 1
else:
array[k] = rightHalf[j]
j += 1
k += 1
while i < len(leftHalf):
array[k] = leftHalf[i]
i += 1
k += 1
while j < len(rightHalf):
array[k] = rightHalf[j]
j += 1
k += 1
归并排序的时间复杂度为 O(n * log n),因为它将数组不断分割,然后合并,分割过程是对数级的,而合并过程是线性级的。
3. 图搜索算法
3.1 Dijkstra 算法
Dijkstra 算法是一种用于寻找加权图中最短路径的经典算法。其步骤如下:
- 从起始节点开始,初始化所有节点的距离为无穷大,起始节点的距离为 0。
- 每次选择当前最小距离的未访问节点,更新其相邻节点的距离。
- 一旦所有节点都被访问过,算法结束,最短路径即为已确定的最小距离。
伪代码:
def dijkstra(graph, start):
dist = {node: float('inf') for node in graph}
dist[start] = 0
visited = set()
while len(visited) < len(graph):
current = min((node for node in dist if node not in visited), key=dist.get)
visited.add(current)
for neighbor, cost in graph[current].items():
if neighbor not in visited:
new_cost = dist[current] + cost
if new_cost < dist[neighbor]:
dist[neighbor] = new_cost
return dist
Dijkstra 算法的改进版本将复杂度降低到 O(n * log n + l)(n 是节点数,l 是线条数),使其能够处理更大规模的图数据。
4. 总结
- 选择排序时间复杂度为
O(n ^ 2),适用于小规模数据。 - 归并排序时间复杂度为
O(n * log n),效率较高。 - Dijkstra 算法用于加权图的最短路径搜索,复杂度较低,适合大规模图搜索。