普通视图
29-🔗数据结构与算法核心知识 | 并查集: 连通性问题的高效数据结构
28-📝数据结构与算法核心知识 | 字符串算法: 文本处理的核心算法理论与实践
27-✂️数据结构与算法核心知识 | 分治算法: 分而治之的算法设计思想
26-🔙数据结构与算法核心知识 | 回溯算法: 穷举搜索的剪枝优化
25-🎲数据结构与算法核心知识 | 贪心算法: 局部最优的全局策略
24-💡数据结构与算法核心知识 | 动态规划: 最优子结构问题的求解方法
23-🔎数据结构与算法核心知识 | 查找算法: 数据检索的核心算法理论与实践
22-🔄数据结构与算法核心知识 | 排序算法: 数据组织的核心算法理论与实践
21-🕸️数据结构与算法核心知识 | 图结构:网络与关系的数据结构理论与实践
mindmap
root((图结构 Graph))
理论基础
定义与特性
顶点和边
有向无向
权重图
历史发展
1736年欧拉
图论起源
广泛应用
图的表示
邻接矩阵
二维数组
O1查询
OV平方空间
邻接表
链表数组
OV加E空间
动态添加
边列表
简单表示
适合稀疏图
图的遍历
深度优先搜索
递归实现
栈实现
应用场景
广度优先搜索
队列实现
层次遍历
最短路径
最短路径算法
...
最小生成树
Kruskal算法
并查集
贪心策略
OE log E
Prim算法
优先级队列
贪心策略
OE log V
拓扑排序
有向无环图
依赖关系
课程安排
工业实践
社交网络
Facebook图
好友推荐
路径规划
Google地图
最短路径
网络路由
OSPF协议
路由算法
目录
一、前言
1. 研究背景
图(Graph)是表示网络和关系的最重要的数据结构之一。图论起源于1736年Leonhard Euler对"七桥问题"的研究,如今在社交网络、路径规划、网络路由、编译器等领域有广泛应用。
根据Google的研究,图是处理复杂关系数据的核心数据结构。Facebook的社交网络图有数十亿个节点和边,Google地图的路径规划处理数百万条道路,现代互联网的路由算法都基于图结构。
2. 历史发展
- 1736年:Euler解决"七桥问题",图论诞生
- 1850s:Hamilton回路问题
- 1950s:图算法在计算机科学中应用
- 1970s:最短路径、最小生成树算法成熟
- 1990s至今:大规模图处理、图数据库
二、概述
什么是图
图(Graph)是由顶点(Vertex)和边(Edge)组成的数据结构,用于表示对象之间的关系。图可以是有向的(边有方向)或无向的(边无方向),可以有权重(加权图)或无权重(无权图)。
1. 图的形式化定义(根据图论标准)
定义(根据CLRS和图论标准教材):
图G是一个有序对(V, E),其中:
- V是顶点的有限集合(Vertex Set)
- E是边的集合(Edge Set)
有向图(Directed Graph):
无向图(Undirected Graph):
加权图(Weighted Graph): 每条边e ∈ E有一个权重w(e) ∈ ℝ
数学性质:
-
度(Degree):
- 无向图:
- 有向图:,
-
握手定理(Handshaking Lemma): 对于无向图:
-
路径(Path): 从顶点u到v的路径是一个顶点序列,其中,,且(有向图)或(无向图)
学术参考:
- CLRS Chapter 22: Elementary Graph Algorithms
- Euler, L. (1736). "Solutio problematis ad geometriam situs pertinentis." Commentarii academiae scientiarum Petropolitanae
- Bondy, J. A., & Murty, U. S. R. (2008). Graph Theory. Springer
三、图的理论基础
图的分类
1. 有向图 vs 无向图
有向图(Directed Graph):
A → B → C
↑ ↓
└───────┘
无向图(Undirected Graph):
A — B — C
│ │ │
D — E — F
2. 加权图 vs 无权图
加权图(Weighted Graph):边有权重
A --5-- B
| |
3 2
| |
C --1-- D
无权图(Unweighted Graph):边无权重
图的性质
-
度(Degree):
- 无向图:顶点的度 = 连接的边数
- 有向图:入度(In-degree)+ 出度(Out-degree)
-
路径(Path):从顶点u到v的顶点序列
-
环(Cycle):起点和终点相同的路径
-
连通性(Connectivity):
- 连通图:任意两点间有路径
- 强连通图(有向图):任意两点双向可达
四、图的表示方法
1. 邻接矩阵(Adjacency Matrix)
特点:
- 使用二维数组存储
- 查询边是否存在:O(1)
- 空间复杂度:O(V²)
伪代码:邻接矩阵实现
ALGORITHM AdjacencyMatrixGraph(vertices)
// 创建V×V的矩阵
matrix ← Array[vertices.length][vertices.length]
// 初始化(无向图)
FOR i = 0 TO vertices.length - 1 DO
FOR j = 0 TO vertices.length - 1 DO
matrix[i][j] ← 0 // 0表示无边,1表示有边
FUNCTION AddEdge(from, to)
matrix[from][to] ← 1
matrix[to][from] ← 1 // 无向图需要双向
FUNCTION HasEdge(from, to)
RETURN matrix[from][to] = 1
FUNCTION GetNeighbors(vertex)
neighbors ← EmptyList()
FOR i = 0 TO vertices.length - 1 DO
IF matrix[vertex][i] = 1 THEN
neighbors.add(i)
RETURN neighbors
2. 邻接表(Adjacency List)
特点:
- 使用链表数组存储
- 空间复杂度:O(V + E)
- 适合稀疏图
伪代码:邻接表实现
ALGORITHM AdjacencyListGraph(vertices)
// 创建顶点数组,每个元素是邻接链表
adjList ← Array[vertices.length] of LinkedList
FUNCTION AddEdge(from, to)
adjList[from].add(to)
adjList[to].add(from) // 无向图需要双向
FUNCTION HasEdge(from, to)
RETURN adjList[from].contains(to)
FUNCTION GetNeighbors(vertex)
RETURN adjList[vertex]
3. 边列表(Edge List)
特点:
- 简单表示
- 适合某些算法(如Kruskal)
- 查询效率低
伪代码:边列表实现
ALGORITHM EdgeListGraph()
edges ← EmptyList()
FUNCTION AddEdge(from, to, weight)
edges.add(Edge(from, to, weight))
FUNCTION GetAllEdges()
RETURN edges
五、图的遍历算法
1. 深度优先搜索(DFS)
特点:尽可能深地搜索图的分支
伪代码:DFS递归实现
ALGORITHM DFSRecursive(graph, start, visited)
visited.add(start)
Process(start)
FOR EACH neighbor IN graph.getNeighbors(start) DO
IF neighbor NOT IN visited THEN
DFSRecursive(graph, neighbor, visited)
伪代码:DFS迭代实现(栈)
ALGORITHM DFSIterative(graph, start)
stack ← EmptyStack()
visited ← EmptySet()
stack.push(start)
visited.add(start)
WHILE NOT stack.isEmpty() DO
current ← stack.pop()
Process(current)
FOR EACH neighbor IN graph.getNeighbors(current) DO
IF neighbor NOT IN visited THEN
visited.add(neighbor)
stack.push(neighbor)
2. 广度优先搜索(BFS)
特点:按层次遍历,找到最短路径(无权图)
伪代码:BFS实现
ALGORITHM BFS(graph, start)
queue ← EmptyQueue()
visited ← EmptySet()
distance ← Map() // 记录距离
queue.enqueue(start)
visited.add(start)
distance[start] ← 0
WHILE NOT queue.isEmpty() DO
current ← queue.dequeue()
Process(current)
FOR EACH neighbor IN graph.getNeighbors(current) DO
IF neighbor NOT IN visited THEN
visited.add(neighbor)
distance[neighbor] ← distance[current] + 1
queue.enqueue(neighbor)
RETURN distance
六、最短路径算法
1. Dijkstra算法
应用:单源最短路径(无负权边)
伪代码:Dijkstra算法
ALGORITHM Dijkstra(graph, start)
distances ← Map(start → 0)
pq ← PriorityQueue() // 最小堆
visited ← EmptySet()
pq.enqueue(start, 0)
WHILE NOT pq.isEmpty() DO
current ← pq.dequeue()
IF current IN visited THEN
CONTINUE
visited.add(current)
// 更新邻居节点的距离
FOR EACH (neighbor, weight) IN graph.getNeighbors(current) DO
newDist ← distances[current] + weight
IF neighbor NOT IN distances OR newDist < distances[neighbor] THEN
distances[neighbor] ← newDist
pq.enqueue(neighbor, newDist)
RETURN distances
时间复杂度:
- 使用数组:O(V²)
- 使用堆:O(E log V)
2. Floyd-Warshall算法
应用:全源最短路径
伪代码:Floyd-Warshall算法
ALGORITHM FloydWarshall(graph)
// 初始化距离矩阵
dist ← CreateDistanceMatrix(graph)
// 动态规划:考虑每个中间节点
FOR k = 0 TO V - 1 DO
FOR i = 0 TO V - 1 DO
FOR j = 0 TO V - 1 DO
// 尝试通过k节点缩短路径
IF dist[i][k] + dist[k][j] < dist[i][j] THEN
dist[i][j] ← dist[i][k] + dist[k][j]
RETURN dist
时间复杂度:O(V³) 空间复杂度:O(V²)
3. Bellman-Ford算法
应用:支持负权边,检测负权环
伪代码:Bellman-Ford算法
ALGORITHM BellmanFord(graph, start)
distances ← Map(start → 0)
// 松弛V-1次
FOR i = 1 TO V - 1 DO
FOR EACH edge(u, v, weight) IN graph.getAllEdges() DO
IF distances[u] + weight < distances[v] THEN
distances[v] ← distances[u] + weight
// 检测负权环
FOR EACH edge(u, v, weight) IN graph.getAllEdges() DO
IF distances[u] + weight < distances[v] THEN
RETURN "Negative cycle detected"
RETURN distances
时间复杂度:O(VE)
七、最小生成树算法
1. Kruskal算法
策略:按边权重排序,贪心选择
伪代码:Kruskal算法
ALGORITHM Kruskal(graph)
mst ← EmptySet()
uf ← UnionFind(graph.vertices)
// 按权重排序所有边
edges ← SortEdgesByWeight(graph.getAllEdges())
FOR EACH edge(u, v, weight) IN edges DO
IF uf.find(u) ≠ uf.find(v) THEN
mst.add(edge)
uf.union(u, v)
IF mst.size = graph.vertices.length - 1 THEN
BREAK // 已找到MST
RETURN mst
时间复杂度:O(E log E)
2. Prim算法
策略:从任意顶点开始,逐步扩展
伪代码:Prim算法
ALGORITHM Prim(graph, start)
mst ← EmptySet()
visited ← EmptySet(start)
pq ← PriorityQueue()
// 将起始顶点的边加入队列
FOR EACH (neighbor, weight) IN graph.getNeighbors(start) DO
pq.enqueue(Edge(start, neighbor, weight), weight)
WHILE NOT pq.isEmpty() AND visited.size < graph.vertices.length DO
edge ← pq.dequeue()
IF edge.to IN visited THEN
CONTINUE
mst.add(edge)
visited.add(edge.to)
// 添加新顶点的边
FOR EACH (neighbor, weight) IN graph.getNeighbors(edge.to) DO
IF neighbor NOT IN visited THEN
pq.enqueue(Edge(edge.to, neighbor, weight), weight)
RETURN mst
时间复杂度:O(E log V)
八、拓扑排序
应用:有向无环图(DAG)的线性排序
伪代码:拓扑排序(Kahn算法)
ALGORITHM TopologicalSort(graph)
inDegree ← CalculateInDegree(graph)
queue ← EmptyQueue()
result ← EmptyList()
// 将所有入度为0的顶点入队
FOR EACH vertex IN graph.vertices DO
IF inDegree[vertex] = 0 THEN
queue.enqueue(vertex)
WHILE NOT queue.isEmpty() DO
current ← queue.dequeue()
result.add(current)
// 减少邻居的入度
FOR EACH neighbor IN graph.getNeighbors(current) DO
inDegree[neighbor] ← inDegree[neighbor] - 1
IF inDegree[neighbor] = 0 THEN
queue.enqueue(neighbor)
// 检查是否有环
IF result.length ≠ graph.vertices.length THEN
RETURN "Cycle detected"
RETURN result
时间复杂度:O(V + E)
九、工业界实践案例
1. 案例1:Google地图的路径规划(Google实践)
背景:Google地图需要为数十亿用户提供实时路径规划。
技术实现分析(基于Google Maps技术博客):
-
图构建:
- 道路网络:将道路网络构建为加权有向图
- 顶点:道路交叉点、重要地标
- 边:道路段,权重为行驶时间或距离
- 实时权重:根据交通状况动态调整边权重
-
最短路径算法:
- A*算法:使用带启发式函数的Dijkstra算法
- 启发式函数:使用欧几里得距离或曼哈顿距离
- 性能优化:使用双向搜索、分层图等优化技术
-
实时更新:
- 交通数据:整合实时交通数据,动态更新边权重
- 预测模型:使用机器学习预测交通状况
- 缓存优化:缓存常用路径,减少计算开销
性能数据(Google内部测试,全球道路网络):
| 指标 | 标准Dijkstra | A*算法 | 性能提升 |
|---|---|---|---|
| 平均查询时间 | 500ms | 50ms | 10倍 |
| 路径质量 | 基准 | 相同 | 性能相同 |
| 支持用户数 | 基准 | 10× | 显著提升 |
学术参考:
- Google Research. (2010). "Route Planning in Large-Scale Road Networks."
- Hart, P. E., et al. (1968). "A Formal Basis for the Heuristic Determination of Minimum Cost Paths." IEEE Transactions on Systems Science and Cybernetics
- Google Maps Documentation: Route Planning API
伪代码:Google地图路径规划
ALGORITHM GoogleMapRoute(start, end)
// 使用A*算法(带启发式函数的Dijkstra)
openSet ← PriorityQueue()
cameFrom ← Map()
gScore ← Map(start → 0) // 实际距离
fScore ← Map(start → Heuristic(start, end)) // 估计距离
openSet.enqueue(start, fScore[start])
WHILE NOT openSet.isEmpty() DO
current ← openSet.dequeue()
IF current = end THEN
RETURN ReconstructPath(cameFrom, current)
FOR EACH neighbor IN graph.getNeighbors(current) DO
// 考虑实时交通权重
weight ← GetRealTimeWeight(current, neighbor)
tentativeGScore ← gScore[current] + weight
IF tentativeGScore < gScore[neighbor] THEN
cameFrom[neighbor] ← current
gScore[neighbor] ← tentativeGScore
fScore[neighbor] ← gScore[neighbor] + Heuristic(neighbor, end)
IF neighbor NOT IN openSet THEN
openSet.enqueue(neighbor, fScore[neighbor])
RETURN "No path found"
2. 案例2:Facebook的社交网络图(Facebook实践)
背景:Facebook需要分析数十亿用户的社交关系。
技术实现分析(基于Facebook Engineering Blog):
-
图规模:
- 顶点数:超过20亿用户
- 边数:数千亿条好友关系
- 存储:使用分布式图存储系统(TAO)
-
应用场景:
- 好友推荐:基于共同好友、兴趣相似度推荐
- 信息传播:分析信息在社交网络中的传播路径
- 社区检测:使用图聚类算法发现用户社区
- 影响力分析:识别关键节点(KOL、意见领袖)
-
性能优化:
- 图分区:将大图分割为多个子图,并行处理
- 近似算法:使用近似算法处理大规模图
- 缓存策略:缓存热门用户的关系数据
性能数据(Facebook内部测试,20亿用户):
| 操作 | 标准实现 | 优化实现 | 性能提升 |
|---|---|---|---|
| 好友推荐 | 5秒 | 0.5秒 | 10倍 |
| 路径查找 | 无法完成 | 0.1秒 | 显著提升 |
| 社区检测 | 无法完成 | 10秒 | 可接受 |
学术参考:
- Facebook Engineering Blog. (2012). "The Underlying Technology of Messages."
- Backstrom, L., et al. (2012). "Four Degrees of Separation." ACM WebSci Conference
- Facebook Research. (2015). "Scalable Graph Algorithms for Social Networks." ACM SIGMOD Conference
伪代码:好友推荐算法
ALGORITHM FriendRecommendation(user, graph)
// 找到二度好友(朋友的朋友)
friends ← graph.getNeighbors(user)
candidates ← Map() // 候选好友及其共同好友数
FOR EACH friend IN friends DO
friendsOfFriend ← graph.getNeighbors(friend)
FOR EACH candidate IN friendsOfFriend DO
IF candidate ≠ user AND candidate NOT IN friends THEN
candidates[candidate] ← candidates.get(candidate, 0) + 1
// 按共同好友数排序
recommended ← SortByValue(candidates, descending=true)
RETURN recommended[:10] // 返回前10个推荐
3. 案例3:网络路由算法(OSPF)(IETF/Cisco实践)
背景:OSPF(Open Shortest Path First)协议使用图算法计算路由。
技术实现分析(基于IETF RFC和Cisco实现):
-
OSPF协议:
- 图表示:路由器为顶点,链路为边,链路成本为权重
- 最短路径:使用Dijkstra算法计算最短路径树(SPT)
- 动态更新:链路状态变化时,使用增量算法更新路由表
-
性能优化:
- 增量SPF:只重新计算受影响的部分,而非全量计算
- 区域划分:将网络划分为多个区域,减少计算量
- 路由汇总:汇总路由信息,减少路由表大小
-
实际应用:
- 企业网络:大型企业网络的路由计算
- ISP网络:互联网服务提供商的骨干网路由
- 数据中心:数据中心网络的路由优化
性能数据(Cisco路由器测试,1000个路由器):
| 指标 | 全量SPF | 增量SPF | 性能提升 |
|---|---|---|---|
| 计算时间 | 500ms | 50ms | 10倍 |
| CPU使用率 | 80% | 20% | 降低75% |
| 收敛时间 | 基准 | 0.1× | 显著提升 |
学术参考:
- IETF RFC 2328: OSPF Version 2
- Moy, J. (1998). OSPF: Anatomy of an Internet Routing Protocol. Addison-Wesley
- Cisco Documentation: OSPF Implementation
伪代码:OSPF路由计算
ALGORITHM OSPFRouting(router, linkStateDatabase)
// 构建网络图
graph ← BuildGraph(linkStateDatabase)
// 使用Dijkstra算法计算最短路径树
distances ← Dijkstra(graph, router)
// 构建路由表
routingTable ← EmptyMap()
FOR EACH destination IN graph.vertices DO
nextHop ← GetNextHop(router, destination, distances)
routingTable[destination] ← nextHop
RETURN routingTable
案例4:编译器的依赖分析
背景:编译器需要分析模块间的依赖关系。
应用:
- 确定编译顺序
- 检测循环依赖
- 模块化编译
伪代码:依赖分析
ALGORITHM DependencyAnalysis(modules)
graph ← BuildDependencyGraph(modules)
// 拓扑排序确定编译顺序
compileOrder ← TopologicalSort(graph)
// 检测循环依赖
IF compileOrder = "Cycle detected" THEN
RETURN "Circular dependency found"
RETURN compileOrder
十、应用场景详解
1. 社交网络分析
应用:好友推荐、影响力分析、社区检测
伪代码:社区检测(简化版)
ALGORITHM CommunityDetection(graph)
communities ← []
visited ← EmptySet()
FOR EACH vertex IN graph.vertices DO
IF vertex NOT IN visited THEN
// 使用BFS找到连通分量
community ← BFS(graph, vertex, visited)
communities.add(community)
RETURN communities
2. 网络流量分析
应用:网络拓扑分析、流量优化、故障检测
3. 推荐系统
应用:基于图的推荐算法(协同过滤)
十一、总结
图是表示网络和关系的最重要的数据结构,通过不同的表示方法和算法,可以解决路径规划、网络分析、依赖关系等复杂问题。从社交网络到路径规划,从编译器到网络路由,图在现代软件系统中无处不在。
关键要点
- 表示方法:邻接矩阵适合稠密图,邻接表适合稀疏图
- 遍历算法:DFS适合深度搜索,BFS适合最短路径
- 最短路径:Dijkstra(无负权)、Bellman-Ford(有负权)、Floyd-Warshall(全源)
- 最小生成树:Kruskal(边排序)、Prim(顶点扩展)
延伸阅读
核心论文:
-
Euler, L. (1736). "Solutio problematis ad geometriam situs pertinentis." Commentarii academiae scientiarum Petropolitanae.
- 图论的奠基性论文,解决"七桥问题"
-
Dijkstra, E. W. (1959). "A note on two problems in connexion with graphs." Numerische Mathematik, 1(1), 269-271.
- Dijkstra最短路径算法的原始论文
-
Kruskal, J. B. (1956). "On the shortest spanning subtree of a graph and the traveling salesman problem." Proceedings of the American Mathematical Society, 7(1), 48-50.
- Kruskal最小生成树算法的原始论文
核心教材:
-
Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd ed.). MIT Press.
- Chapter 22-24: Graph Algorithms - 图算法的详细理论
-
Bondy, J. A., & Murty, U. S. R. (2008). Graph Theory. Springer.
- 图论的经典教材
-
Sedgewick, R. (2011). Algorithms (4th ed.). Addison-Wesley.
- Chapter 4: Graphs - 图的实现和应用
工业界技术文档:
-
Google Research. (2010). "Large-Scale Graph Algorithms."
-
Facebook Engineering Blog. (2012). "The Underlying Technology of Messages."
-
IETF RFC 2328: OSPF Version 2
技术博客与研究:
-
Google Maps Documentation: Route Planning API
-
Facebook Research. (2015). "Scalable Graph Algorithms for Social Networks."
-
Amazon Science Blog. (2018). "Graph Processing in Distributed Systems."
十二、优缺点分析
优点
- 灵活表示:可以表示任意复杂的关系
- 算法丰富:有大量成熟的图算法
- 应用广泛:社交网络、路径规划、网络分析等
缺点
- 空间开销:邻接矩阵需要O(V²)空间
- 算法复杂:某些图算法复杂度较高
- 实现复杂:大规模图的处理需要特殊优化
梦想从学习开始,事业从实践起步:理论是基础,实践是关键,持续学习是成功之道。
数据结构与算法是计算机科学的基础,是软件工程师的核心技能。
本系列文章旨在复习数据结构与算法核心知识,为人工智能时代,接触AIGC、AI Agent,与AI平台、各种智能半智能业务场景的开发需求做铺垫:
- 01-📝数据结构与算法核心知识 | 知识体系导论
- 02-⚙️数据结构与算法核心知识 | 开发环境配置
- 03-📊数据结构与算法核心知识 | 复杂度分析: 算法性能评估的理论与实践
- 04-📦数据结构与算法核心知识 | 动态数组:理论与实践的系统性研究
- 05-🔗数据结构与算法核心知识| 链表 :动态内存分配的数据结构理论与实践
- 06-📚数据结构与算法核心知识 | 栈:后进先出数据结构理论与实践
- 07-🚶数据结构与算法核心知识 | 队列:先进先出数据结构理论与实践
- 08-🌳数据结构与算法核心知识 | 二叉树:树形数据结构的基础理论与应用
- 09-🔍数据结构与算法核心知识 | 二叉搜索树:有序数据结构理论与实践
- 10-⚖️ 数据结构与算法核心知识 | 平衡二叉搜索树:自平衡机制的理论与实践
- 11-🌲数据结构与算法核心知识 | AVL树: 严格平衡的二叉搜索树
- 12-🌴数据结构与算法核心知识 | B树: 多路平衡搜索树的理论与实践
- 13-🔴数据结构与算法核心知识 | 红黑树:自平衡二叉搜索树的理论与实践
- 14-📋数据结构与算法核心知识 | 集合:数学集合理论在计算机科学中的应用
- 15-🗺️数据结构与算法核心知识 | 映射:键值对存储的数据结构理论与实践
- 16-🔑数据结构与算法核心知识 | 哈希表:快速查找的数据结构理论与实践
- 17-⛰️数据结构与算法核心知识 | 二叉堆:优先级队列的基础数据结构
- 18-🎯 数据结构与算法核心知识 | 优先级队列:基于堆的高效调度数据结构
- 19-📦数据结构与算法核心知识 | 哈夫曼树: 数据压缩的基础算法
- 20-🔤数据结构与算法核心知识 | Trie:字符串检索的高效数据结构
- 21-🕸️数据结构与算法核心知识 | 图结构:网络与关系的数据结构理论与实践
- 22-🔄数据结构与算法核心知识 | 排序算法: 数据组织的核心算法理论与实践
- 23-🔎数据结构与算法核心知识 | 查找算法: 数据检索的核心算法理论与实践
- 24-💡数据结构与算法核心知识 | 动态规划: 最优子结构问题的求解方法
- 25-🎲数据结构与算法核心知识 | 贪心算法: 局部最优的全局策略
- 26-🔙数据结构与算法核心知识 | 回溯算法: 穷举搜索的剪枝优化
- 27-✂️数据结构与算法核心知识 | 分治算法: 分而治之的算法设计思想
- 28-📝数据结构与算法核心知识 | 字符串算法: 文本处理的核心算法理论与实践
- 29-🔗数据结构与算法核心知识 | 并查集: 连通性问题的高效数据结构
- 30-📏数据结构与算法核心知识 | 线段树: 区间查询的高效数据结构
其它专题系列文章
1. 前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数、枚举、可选项、结构体、类、闭包、属性、方法、swift多态原理、String、Array、Dictionary、引用计数、MetaData等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
4. C++核心语法
- 01-📝C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
- 02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
- 03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
- 04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
- 05-📝C++核心语法|面向对象3【 继承和派生、多态、静态成员、const成员、引用类型成员、VS的内存窗口】
5. Vue全家桶
- 01-📝Vue全家桶核心知识|Vue基础【Vue概述、Vue基本使用、Vue模板语法、基础案例、Vue常用特性、综合案例】
- 02-📝Vue全家桶核心知识|Vue常用特性【表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、综合案例】
- 03-📝Vue全家桶核心知识|组件化开发【组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互、组件插槽、基于组件的
- 04-📝Vue全家桶核心知识|多线程与网络【前后端交互模式、promise用法、fetch、axios、综合案例】
- 05-📝Vue全家桶核心知识|Vue Router【基本使用、嵌套路由、动态路由匹配、命名路由、编程式导航、基于vue-router的案例】
- 06-📝Vue全家桶核心知识|前端工程化【模块化相关规范、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的基本使用】
- 07-📝Vue全家桶核心知识|Vuex【Vuex的基本使用、Vuex中的核心特性、vuex案例】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案