13 算法入门(Intro to Algorithms)

141 阅读3分钟

13. 算法入门 - Intro to Algorithms_哔哩哔哩_bilibili

1. 简介

在第 13 集中,视频主要介绍了算法,解释了算法的重要性及其在计算机科学中的核心地位。视频详细讲解了几种经典排序算法,如选择排序和归并排序,并介绍了图搜索算法中的 Dijkstra 算法。通过示例和伪代码,深入浅出地讲解了这些算法的实现和复杂度。

2. 排序算法

2.1 选择排序

选择排序(Selection Sort)是一种基础的排序算法,其核心思想是每次找到数组中的最小元素,并将其与数组的当前元素交换位置。具体步骤如下:

  1. 从数组的第一个元素开始,找到最小的元素。
  2. 将最小元素与第一个元素交换位置。
  3. 从第二个元素开始重复这个过程,直到数组完全有序。

伪代码:

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. 检查数组大小是否大于 1,如果是,则将数组分成两部分。
  2. 递归地对两部分分别进行归并排序。
  3. 将这两部分合并成一个有序数组。

伪代码:

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 算法是一种用于寻找加权图中最短路径的经典算法。其步骤如下:

  1. 从起始节点开始,初始化所有节点的距离为无穷大,起始节点的距离为 0。
  2. 每次选择当前最小距离的未访问节点,更新其相邻节点的距离。
  3. 一旦所有节点都被访问过,算法结束,最短路径即为已确定的最小距离。

伪代码:

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 算法用于加权图的最短路径搜索,复杂度较低,适合大规模图搜索。