数据结构速成

1.图

1.1 拓扑排序

拓扑排序是一种对有向无环图(DAG)进行排序的算法,它会生成一个线性序列,在这个序列中,对于图中的每条边 (u, v),顶点 u 在序列中都排在顶点 v 之前。

2.最小生成树

2.1 Kruskal

Kruskal算法是一种用于求解无向图最小生成树的贪心算法,它可以找到连接图中所有顶点的边集,使得边的总权重最小。

算法步骤:

  1. 初始化:

    • 将所有边按照权重从小到大排序。
    • 创建一个集合 U,初始为空,用于存储最小生成树中的边。
    • 创建一个集合 V,用于存储图中的所有顶点。
  2. 循环执行以下步骤,直到 U 中的边数等于 V 中的顶点数减 1:

    • 从排序后的边集中选择权重最小的边 e
    • 如果 e 的两个端点不在同一个连通分量中,则将 e 加入到 U 中,并将 e 的两个端点所在的连通分量合并。
  3. 输出: 最小生成树中的边集 U

2.2 Prim

Prim 算法是一种用于求解无向图最小生成树的贪心算法,它可以找到连接图中所有顶点的边集,使得边的总权重最小。

算法步骤:

  1. 初始化:

    • 选择图中任意一个顶点作为起始顶点,将其加入到最小生成树中。
    • 创建一个集合 U,用于存储已经加入最小生成树的顶点。
    • 创建一个集合 V,用于存储未加入最小生成树的顶点。
  2. 循环执行以下步骤,直到 V 为空:

    • 从 V 中选择与 U 中的顶点距离最近的顶点 v
    • 将 v 加入到 U 中。
    • 更新 V 中所有顶点到 U 的距离。
  3. 输出: 最小生成树中的边集。

3.最短路径

3.1 Dijkstra

Dijkstra 算法是一种用于求解单源最短路径问题的贪心算法,它可以找到从图中一个指定的源顶点到所有其他顶点的最短路径。

算法步骤:

  1. 初始化:

    • 将所有顶点的距离初始化为无穷大,并将源顶点的距离初始化为 0。
    • 创建一个集合 S,用于存储已经确定最短路径的顶点,初始为空。
    • 创建一个集合 Q,用于存储尚未确定最短路径的顶点,初始包含所有顶点。
  2. 循环执行以下步骤,直到 Q 为空:

    • 从 Q 中选择距离源顶点最近的顶点 u
    • 将 u 加入到 S 中。
    • 更新 Q 中所有与 u 相邻的顶点 v 的距离,如果通过 u 到 v 的距离更短,则更新 v 的距离。
  3. 输出: 从源顶点到所有其他顶点的最短路径长度。

3.2 Floyd

  1. 邻接矩阵(graph): 用于存储图的边权重,graph[i][j] 表示从节点 i 到节点 j 的边的权重。如果不存在边,则权重为无穷大(表示不可达)。

  2. 距离矩阵(dist): 用于存储当前已知的任意两点之间的最短路径长度,dist[i][j] 表示从节点 i 到节点 j 的最短路径长度。初始时,dist[i][j] 等于 graph[i][j],且 dist[i][i] = 0(节点到自身的距离为0)。

算法步骤

  1. 初始化:

    • 将距离矩阵 dist 初始化为邻接矩阵 graph 的值。
    • 对于所有节点 i,设置 dist[i][i] = 0
  2. 动态规划更新最短路径:

    • 逐一考虑每个节点 k 作为中间节点,对所有的节点对 (i, j),更新 dist[i][j]
    • 更新公式为:dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]),即通过节点 k 经过的路径是否比当前已知的 ij 的路径更短。

2.算法

2.1 时间复杂度

(1)对于存取操作

线性表的顺序存储结构,对于存取操作,其时间复杂度为 

因为元素位置可以直接计算得到

 (2)对于插入和删除操作

对于插入和删除操作,其时间复杂度

因为插入或删除后,需要移动其余元素

2.2 空间复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值