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.
Add C# code for the chapter Heap and Graph (krahets#324)
* add : C# heap ,graph, fix type "sift"=>"shift" * chore: rename "shift" to "sift" * add: heap,graph C# sample code ,fix format * fix md format * fix md intend foramt * fix basic_operation_of_graph.md format * fix md format * fix md format * fix indentation format * chore: fix my_heap.cs test * fix: test and doc typo * fix bug for commit 5eae708 (krahets#317) * Add Zig code blocks. * fix: resolve build error for commit 5eae708 (krahets#318) * Unify the function naming of queue from `offer()` to `push()` * Update TypeScript codes. * Update binary_search_tree * Update graph operations. * Fix code indentation. * Update worst_best_time_complexity, leetcode_two_sum * Update avl_tree * copy zig codes of chapter_array_and_linkedlist and chapter_computatio… (krahets#319) * copy zig codes of chapter_array_and_linkedlist and chapter_computational_complexity to markdown files * Update time_complexity.md --------- Co-authored-by: Yudong Jin <[email protected]> * Fix Python code styles. Update hash_map. * chore: fix heap logic * Update graph_adjacency_matrix.cs * Update graph_adjacency_matrix.cs * Update my_heap.cs * fix: heap test * fix naming format * merge markdown * fix markdown format * Update graph_adjacency_list.cs * Update graph_adjacency_matrix.cs * Update PrintUtil.cs * Create Vertex.cs * Update heap.cs --------- Co-authored-by: zjkung1123 <[email protected]> Co-authored-by: sjinzh <[email protected]> Co-authored-by: Yudong Jin <[email protected]> Co-authored-by: nuomi1 <[email protected]>
- Loading branch information
1 parent
a383cb7
commit f0b092f
Showing
7 changed files
with
652 additions
and
5 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,132 @@ | ||
/** | ||
* File: graph_adjacency_list.cs | ||
* Created Time: 2023-02-06 | ||
* Author: zjkung1123 ([email protected]) | ||
*/ | ||
|
||
using hello_algo.include; | ||
using NUnit.Framework; | ||
|
||
namespace hello_algo.chapter_graph; | ||
|
||
/* 基于邻接表实现的无向图类 */ | ||
class GraphAdjList | ||
{ | ||
// 邻接表 adjList 中的元素是 Vertex 对象 | ||
Dictionary<Vertex, List<Vertex>> adjList; | ||
|
||
/* 构造函数 */ | ||
public GraphAdjList(Vertex[][] edges) | ||
{ | ||
this.adjList = new Dictionary<Vertex, List<Vertex>>(); | ||
// 添加所有顶点和边 | ||
foreach (Vertex[] edge in edges) | ||
{ | ||
addVertex(edge[0]); | ||
addVertex(edge[1]); | ||
addEdge(edge[0], edge[1]); | ||
} | ||
} | ||
|
||
/* 获取顶点数量 */ | ||
public int size() | ||
{ | ||
return adjList.Count; | ||
} | ||
|
||
/* 添加边 */ | ||
public void addEdge(Vertex vet1, Vertex vet2) | ||
{ | ||
if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2) | ||
throw new InvalidOperationException(); | ||
// 添加边 vet1 - vet2 | ||
adjList[vet1].Add(vet2); | ||
adjList[vet2].Add(vet1); | ||
} | ||
|
||
/* 删除边 */ | ||
public void removeEdge(Vertex vet1, Vertex vet2) | ||
{ | ||
if (!adjList.ContainsKey(vet1) || !adjList.ContainsKey(vet2) || vet1 == vet2) | ||
throw new InvalidOperationException(); | ||
// 删除边 vet1 - vet2 | ||
adjList[vet1].Remove(vet2); | ||
adjList[vet2].Remove(vet1); | ||
} | ||
|
||
/* 添加顶点 */ | ||
public void addVertex(Vertex vet) | ||
{ | ||
if (adjList.ContainsKey(vet)) | ||
return; | ||
// 在邻接表中添加一个新链表 | ||
adjList.Add(vet, new List<Vertex>()); | ||
} | ||
|
||
/* 删除顶点 */ | ||
public void removeVertex(Vertex vet) | ||
{ | ||
if (!adjList.ContainsKey(vet)) | ||
throw new InvalidOperationException(); | ||
// 在邻接表中删除顶点 vet 对应的链表 | ||
adjList.Remove(vet); | ||
// 遍历其它顶点的链表,删除所有包含 vet 的边 | ||
foreach (List<Vertex> list in adjList.Values) | ||
{ | ||
list.Remove(vet); | ||
} | ||
} | ||
|
||
/* 打印邻接表 */ | ||
public void print() | ||
{ | ||
Console.WriteLine("邻接表 ="); | ||
foreach (KeyValuePair<Vertex, List<Vertex>> entry in adjList) | ||
{ | ||
List<int> tmp = new List<int>(); | ||
foreach (Vertex vertex in entry.Value) | ||
tmp.Add(vertex.Val); | ||
Console.WriteLine(entry.Key.Val + ": [" + string.Join(", ", tmp) + "],"); | ||
} | ||
} | ||
} | ||
|
||
public class graph_adjacency_list | ||
{ | ||
[Test] | ||
public void Test() | ||
{ | ||
/* 初始化无向图 */ | ||
Vertex[] v = Vertex.valsToVets(new int[] { 1, 3, 2, 5, 4 }); | ||
Vertex[][] edges = new Vertex[][] { new Vertex[] { v[0], v[1] }, new Vertex[] { v[0], v[3] }, | ||
new Vertex[] { v[1], v[2] }, new Vertex[] { v[2], v[3] }, | ||
new Vertex[] { v[2], v[4] }, new Vertex[] { v[3], v[4] } }; | ||
GraphAdjList graph = new GraphAdjList(edges); | ||
Console.WriteLine("\n初始化后,图为"); | ||
graph.print(); | ||
|
||
/* 添加边 */ | ||
// 顶点 1, 2 即 v[0], v[2] | ||
graph.addEdge(v[0], v[2]); | ||
Console.WriteLine("\n添加边 1-2 后,图为"); | ||
graph.print(); | ||
|
||
/* 删除边 */ | ||
// 顶点 1, 3 即 v[0], v[1] | ||
graph.removeEdge(v[0], v[1]); | ||
Console.WriteLine("\n删除边 1-3 后,图为"); | ||
graph.print(); | ||
|
||
/* 添加顶点 */ | ||
Vertex v5 = new Vertex(6); | ||
graph.addVertex(v5); | ||
Console.WriteLine("\n添加顶点 6 后,图为"); | ||
graph.print(); | ||
|
||
/* 删除顶点 */ | ||
// 顶点 3 即 v[1] | ||
graph.removeVertex(v[1]); | ||
Console.WriteLine("\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,149 @@ | ||
/** | ||
* File: graph_adjacency_list.cs | ||
* Created Time: 2023-02-06 | ||
* Author: zjkung1123 ([email protected]) | ||
*/ | ||
|
||
using hello_algo.include; | ||
using NUnit.Framework; | ||
|
||
namespace hello_algo.chapter_graph; | ||
|
||
/* 基于邻接矩阵实现的无向图类 */ | ||
class GraphAdjMat | ||
{ | ||
List<int> vertices; // 顶点列表,元素代表“顶点值”,索引代表“顶点索引” | ||
List<List<int>> adjMat; // 邻接矩阵,行列索引对应“顶点索引” | ||
|
||
/* 构造函数 */ | ||
public GraphAdjMat(int[] vertices, int[][] edges) | ||
{ | ||
this.vertices = new List<int>(); | ||
this.adjMat = new List<List<int>>(); | ||
// 添加顶点 | ||
foreach (int val in vertices) | ||
{ | ||
addVertex(val); | ||
} | ||
// 添加边 | ||
// 请注意,edges 元素代表顶点索引,即对应 vertices 元素索引 | ||
foreach (int[] e in edges) | ||
{ | ||
addEdge(e[0], e[1]); | ||
} | ||
} | ||
|
||
/* 获取顶点数量 */ | ||
public int size() | ||
{ | ||
return vertices.Count; | ||
} | ||
|
||
/* 添加顶点 */ | ||
public void addVertex(int val) | ||
{ | ||
int n = size(); | ||
// 向顶点列表中添加新顶点的值 | ||
vertices.Add(val); | ||
// 在邻接矩阵中添加一行 | ||
List<int> newRow = new List<int>(n); | ||
for (int j = 0; j < n; j++) | ||
{ | ||
newRow.Add(0); | ||
} | ||
adjMat.Add(newRow); | ||
// 在邻接矩阵中添加一列 | ||
foreach (List<int> row in adjMat) | ||
{ | ||
row.Add(0); | ||
} | ||
} | ||
|
||
/* 删除顶点 */ | ||
public void removeVertex(int index) | ||
{ | ||
if (index >= size()) | ||
throw new IndexOutOfRangeException(); | ||
// 在顶点列表中移除索引 index 的顶点 | ||
vertices.RemoveAt(index); | ||
// 在邻接矩阵中删除索引 index 的行 | ||
adjMat.RemoveAt(index); | ||
// 在邻接矩阵中删除索引 index 的列 | ||
foreach (List<int> row in adjMat) | ||
{ | ||
row.RemoveAt(index); | ||
} | ||
} | ||
|
||
/* 添加边 */ | ||
// 参数 i, j 对应 vertices 元素索引 | ||
public void addEdge(int i, int j) | ||
{ | ||
// 索引越界与相等处理 | ||
if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) | ||
throw new IndexOutOfRangeException(); | ||
// 在无向图中,邻接矩阵沿主对角线对称,即满足 (i, j) == (j, i) | ||
adjMat[i][j] = 1; | ||
adjMat[j][i] = 1; | ||
} | ||
|
||
/* 删除边 */ | ||
// 参数 i, j 对应 vertices 元素索引 | ||
public void removeEdge(int i, int j) | ||
{ | ||
// 索引越界与相等处理 | ||
if (i < 0 || j < 0 || i >= size() || j >= size() || i == j) | ||
throw new IndexOutOfRangeException(); | ||
adjMat[i][j] = 0; | ||
adjMat[j][i] = 0; | ||
} | ||
|
||
/* 打印邻接矩阵 */ | ||
public void print() | ||
{ | ||
Console.Write("顶点列表 = "); | ||
PrintUtil.PrintList(vertices); | ||
Console.WriteLine("邻接矩阵 ="); | ||
PrintUtil.printMatrix(adjMat); | ||
} | ||
} | ||
|
||
public class graph_adjacency_matrix | ||
{ | ||
[Test] | ||
public void Test() | ||
{ | ||
/* 初始化无向图 */ | ||
// 请注意,edges 元素代表顶点索引,即对应 vertices 元素索引 | ||
int[] vertices = { 1, 3, 2, 5, 4 }; | ||
int[][] edges = new int[][] { new int[] { 0, 1 }, new int[] { 0, 3 }, | ||
new int[] { 1, 2 }, new int[] { 2, 3 }, | ||
new int[] { 2, 4 }, new int[] { 3, 4 } }; | ||
GraphAdjMat graph = new GraphAdjMat(vertices, edges); | ||
Console.WriteLine("\n初始化后,图为"); | ||
graph.print(); | ||
|
||
/* 添加边 */ | ||
// 顶点 1, 2 的索引分别为 0, 2 | ||
graph.addEdge(0, 2); | ||
Console.WriteLine("\n添加边 1-2 后,图为"); | ||
graph.print(); | ||
|
||
/* 删除边 */ | ||
// 顶点 1, 3 的索引分别为 0, 1 | ||
graph.removeEdge(0, 1); | ||
Console.WriteLine("\n删除边 1-3 后,图为"); | ||
graph.print(); | ||
|
||
/* 添加顶点 */ | ||
graph.addVertex(6); | ||
Console.WriteLine("\n添加顶点 6 后,图为"); | ||
graph.print(); | ||
|
||
/* 删除顶点 */ | ||
// 顶点 3 的索引为 1 | ||
graph.removeVertex(1); | ||
Console.WriteLine("\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,70 @@ | ||
/** | ||
* File: heap.cs | ||
* Created Time: 2023-02-06 | ||
* Author: zjkung1123 ([email protected]) | ||
*/ | ||
|
||
using hello_algo.include; | ||
using NUnit.Framework; | ||
|
||
namespace hello_algo.chapter_heap; | ||
|
||
public class heap | ||
{ | ||
public void testPush(PriorityQueue<int, int> heap, int val) | ||
{ | ||
heap.Enqueue(val, val); // 元素入堆 | ||
Console.WriteLine($"\n元素 {val} 入堆后\n"); | ||
PrintUtil.printHeap(heap); | ||
} | ||
|
||
public void testPoll(PriorityQueue<int, int> heap) | ||
{ | ||
int val = heap.Dequeue(); // 堆顶元素出堆 | ||
Console.WriteLine($"\n堆顶元素 {val} 出堆后\n"); | ||
PrintUtil.printHeap(heap); | ||
} | ||
[Test] | ||
public void Test() | ||
{ | ||
/* 初始化堆 */ | ||
// 初始化小顶堆 | ||
PriorityQueue<int, int> minHeap = new PriorityQueue<int, int>(); | ||
// 初始化大顶堆(使用 lambda 表达式修改 Comparator 即可) | ||
PriorityQueue<int, int> maxHeap = new PriorityQueue<int, int>(Comparer<int>.Create((x, y) => y - x)); | ||
Console.WriteLine("以下测试样例为大顶堆"); | ||
|
||
/* 元素入堆 */ | ||
testPush(maxHeap, 1); | ||
testPush(maxHeap, 3); | ||
testPush(maxHeap, 2); | ||
testPush(maxHeap, 5); | ||
testPush(maxHeap, 4); | ||
|
||
/* 获取堆顶元素 */ | ||
int peek = maxHeap.Peek(); | ||
Console.WriteLine($"堆顶元素为 {peek}"); | ||
|
||
/* 堆顶元素出堆 */ | ||
// 出堆元素会形成一个从大到小的序列 | ||
testPoll(maxHeap); | ||
testPoll(maxHeap); | ||
testPoll(maxHeap); | ||
testPoll(maxHeap); | ||
testPoll(maxHeap); | ||
|
||
/* 获取堆大小 */ | ||
int size = maxHeap.Count; | ||
Console.WriteLine($"堆元素数量为 {size}"); | ||
|
||
/* 判断堆是否为空 */ | ||
bool isEmpty = maxHeap.Count == 0; | ||
Console.WriteLine($"堆是否为空 {isEmpty}"); | ||
|
||
/* 输入列表并建堆 */ | ||
var list = new int[] { 1, 3, 2, 5, 4 }; | ||
minHeap = new PriorityQueue<int, int>(list.Select(x => (x, x))); | ||
Console.WriteLine("输入列表并建立小顶堆后"); | ||
PrintUtil.printHeap(minHeap); | ||
} | ||
} |
Oops, something went wrong.