forked from krahets/hello-algo
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
refactor: extract Vertex and use Array<Vertex> (krahets#374)
* refactor: extract Vertex and use Array<Vertex> * docs: add chapter to Package.swift * Update graph_adjacency_list.swift --------- Co-authored-by: Yudong Jin <[email protected]>
- Loading branch information
Showing
3 changed files
with
74 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,28 +4,13 @@ | |
* Author: nuomi1 ([email protected]) | ||
*/ | ||
|
||
/* 顶点类 */ | ||
class Vertex: Hashable { | ||
var val: Int | ||
|
||
init(val: Int) { | ||
self.val = val | ||
} | ||
|
||
static func == (lhs: Vertex, rhs: Vertex) -> Bool { | ||
lhs.val == rhs.val | ||
} | ||
|
||
func hash(into hasher: inout Hasher) { | ||
hasher.combine(val) | ||
} | ||
} | ||
import utils | ||
|
||
/* 基于邻接表实现的无向图类 */ | ||
class GraphAdjList { | ||
// 邻接表,使用哈希表来代替链表,以提升删除边、删除顶点的效率 | ||
// 请注意,adjList 中的元素是 Vertex 对象 | ||
private var adjList: [Vertex: Set<Vertex>] | ||
private var adjList: [Vertex: [Vertex]] | ||
|
||
/* 构造方法 */ | ||
init(edges: [[Vertex]]) { | ||
|
@@ -49,8 +34,8 @@ class GraphAdjList { | |
fatalError("参数错误") | ||
} | ||
// 添加边 vet1 - vet2 | ||
adjList[vet1]?.insert(vet2) | ||
adjList[vet2]?.insert(vet1) | ||
adjList[vet1]?.append(vet2) | ||
adjList[vet2]?.append(vet1) | ||
} | ||
|
||
/* 删除边 */ | ||
|
@@ -59,8 +44,8 @@ class GraphAdjList { | |
fatalError("参数错误") | ||
} | ||
// 删除边 vet1 - vet2 | ||
adjList[vet1]?.remove(vet2) | ||
adjList[vet2]?.remove(vet1) | ||
adjList[vet1]?.removeAll(where: { $0 == vet2 }) | ||
adjList[vet2]?.removeAll(where: { $0 == vet1 }) | ||
} | ||
|
||
/* 添加顶点 */ | ||
|
@@ -81,7 +66,7 @@ class GraphAdjList { | |
adjList.removeValue(forKey: vet) | ||
// 遍历其它顶点的链表,删除所有包含 vet 的边 | ||
for key in adjList.keys { | ||
adjList[key]?.remove(vet) | ||
adjList[key]?.removeAll(where: { $0 == vet }) | ||
} | ||
} | ||
|
||
|
@@ -103,25 +88,21 @@ enum GraphAdjacencyList { | |
/* Driver Code */ | ||
static func main() { | ||
/* 初始化无向图 */ | ||
let v0 = Vertex(val: 1) | ||
let v1 = Vertex(val: 3) | ||
let v2 = Vertex(val: 2) | ||
let v3 = Vertex(val: 5) | ||
let v4 = Vertex(val: 4) | ||
let edges = [[v0, v1], [v1, v2], [v2, v3], [v0, v3], [v2, v4], [v3, v4]] | ||
let v = Vertex.valsToVets([1, 3, 2, 5, 4]) | ||
let edges = [[v[0], v[1]], [v[0], v[3]], [v[1], v[2]], [v[2], v[3]], [v[2], v[4]], [v[3], v[4]]] | ||
let graph = GraphAdjList(edges: edges) | ||
print("\n初始化后,图为") | ||
graph.print() | ||
|
||
/* 添加边 */ | ||
// 顶点 1, 2 即 v0, v2 | ||
graph.addEdge(vet1: v0, vet2: v2) | ||
// 顶点 1, 2 即 v[0], v[2] | ||
graph.addEdge(vet1: v[0], vet2: v[2]) | ||
print("\n添加边 1-2 后,图为") | ||
graph.print() | ||
|
||
/* 删除边 */ | ||
// 顶点 1, 3 即 v0, v1 | ||
graph.removeEdge(vet1: v0, vet2: v1) | ||
// 顶点 1, 3 即 v[0], v[1] | ||
graph.removeEdge(vet1: v[0], vet2: v[1]) | ||
print("\n删除边 1-3 后,图为") | ||
graph.print() | ||
|
||
|
@@ -132,8 +113,8 @@ enum GraphAdjacencyList { | |
graph.print() | ||
|
||
/* 删除顶点 */ | ||
// 顶点 3 即 v1 | ||
graph.removeVertex(vet: v1) | ||
// 顶点 3 即 v[1] | ||
graph.removeVertex(vet: v[1]) | ||
print("\n删除顶点 3 后,图为") | ||
graph.print() | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/** | ||
* File: Vertex.swift | ||
* Created Time: 2023-02-19 | ||
* Author: nuomi1 ([email protected]) | ||
*/ | ||
|
||
/* 顶点类 */ | ||
public class Vertex: Hashable { | ||
public var val: Int | ||
|
||
public init(val: Int) { | ||
self.val = val | ||
} | ||
|
||
public static func == (lhs: Vertex, rhs: Vertex) -> Bool { | ||
lhs.val == rhs.val | ||
} | ||
|
||
public func hash(into hasher: inout Hasher) { | ||
hasher.combine(val) | ||
} | ||
|
||
/* 输入值列表 vals ,返回顶点列表 vets */ | ||
public static func valsToVets(_ vals: [Int]) -> [Vertex] { | ||
var vets: [Vertex] = [] | ||
for val in vals { | ||
vets.append(Vertex(val: val)) | ||
} | ||
return vets | ||
} | ||
|
||
/* 输入顶点列表 vets ,返回值列表 vals */ | ||
public static func vetsToVals(_ vets: [Vertex]) -> [Int] { | ||
var vals: [Int] = [] | ||
for vet in vets { | ||
vals.append(vet.val) | ||
} | ||
return vals | ||
} | ||
} |