From 72d4c2f0ddd4662d31f47c21b4a93844c0c70e9c Mon Sep 17 00:00:00 2001 From: Xu Shaohua Date: Mon, 19 Aug 2024 12:56:18 +0800 Subject: [PATCH] matrix: Add btree sparse matrix chart --- src/SUMMARY.md | 2 +- .../assets/array-sparse-matrix.drawio | 6 +- .../assets/btree-sparse-matrix.drawio | 124 ++++++++++++++++++ .../assets/btree-sparse-matrix.svg | 3 + .../assets/btree_sparse_matrix.rs | 1 + src/matrix/sparse-matrix/btree.md | 33 +++++ src/matrix/sparse-matrix/dictionary.md | 1 - 7 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 src/matrix/sparse-matrix/assets/btree-sparse-matrix.drawio create mode 100644 src/matrix/sparse-matrix/assets/btree-sparse-matrix.svg create mode 120000 src/matrix/sparse-matrix/assets/btree_sparse_matrix.rs create mode 100644 src/matrix/sparse-matrix/btree.md delete mode 100644 src/matrix/sparse-matrix/dictionary.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index 4e2c9e04..43a3a331 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -16,7 +16,7 @@ - [数组](matrix/sparse-matrix/array.md) - [链表](matrix/sparse-matrix/linked-list.md) - [List of Lists](matrix/sparse-matrix/list-of-lists.md) - - [字典 Dictionary](matrix/sparse-matrix/dictionary.md) + - [BTree](matrix/sparse-matrix/btree.md) - [动态数组 Vector](vector/index.md) - [动态数组的常用操作](vector/adt.md) - [标准库中 Vec 的实现](vector/impl-of-vec.md) diff --git a/src/matrix/sparse-matrix/assets/array-sparse-matrix.drawio b/src/matrix/sparse-matrix/assets/array-sparse-matrix.drawio index 59f6770a..ce3a5a09 100644 --- a/src/matrix/sparse-matrix/assets/array-sparse-matrix.drawio +++ b/src/matrix/sparse-matrix/assets/array-sparse-matrix.drawio @@ -1,4 +1,4 @@ - + @@ -67,8 +67,8 @@ - - + + diff --git a/src/matrix/sparse-matrix/assets/btree-sparse-matrix.drawio b/src/matrix/sparse-matrix/assets/btree-sparse-matrix.drawio new file mode 100644 index 00000000..6a272b05 --- /dev/null +++ b/src/matrix/sparse-matrix/assets/btree-sparse-matrix.drawio @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/matrix/sparse-matrix/assets/btree-sparse-matrix.svg b/src/matrix/sparse-matrix/assets/btree-sparse-matrix.svg new file mode 100644 index 00000000..069220ff --- /dev/null +++ b/src/matrix/sparse-matrix/assets/btree-sparse-matrix.svg @@ -0,0 +1,3 @@ + + +
BTree Sparse Matrix
1
5
2
0
3
2
0
0
4
4
1
7
3
3
2
1
3
6
2
row
column
value
\ No newline at end of file diff --git a/src/matrix/sparse-matrix/assets/btree_sparse_matrix.rs b/src/matrix/sparse-matrix/assets/btree_sparse_matrix.rs new file mode 120000 index 00000000..1e50b281 --- /dev/null +++ b/src/matrix/sparse-matrix/assets/btree_sparse_matrix.rs @@ -0,0 +1 @@ +../../../../matrix/src/btree_sparse_matrix.rs \ No newline at end of file diff --git a/src/matrix/sparse-matrix/btree.md b/src/matrix/sparse-matrix/btree.md new file mode 100644 index 00000000..91d8ba4e --- /dev/null +++ b/src/matrix/sparse-matrix/btree.md @@ -0,0 +1,33 @@ +# BTree + +以下面的矩阵为例: + +\begin{bmatrix} \\ +0 & 0 & 3 & 0 & 4 \\\\ +0 & 0 & 5 & 7 & 0 \\\\ +0 & 0 & 0 & 0 & 0 \\\\ +0 & 2 & 6 & 0 & 0 \\ +\end{bmatrix} + +这个矩阵用数组存放, 效果如下图: + +![btree sparse matrix](assets/btree-sparse-matrix.svg) + +这种存储方式的特点是: + +- BTree 中节点是按照 key 的顺序进行存储的, 而我们选用 (row, column) 作为 key, 这样 + - 首先以行号递增排序 + - 如果行号相同, 以列号递增排序 +- 查找/插入/删除矩阵中某个节点的值时的性能是 `O(log(m * n))`, 其中 `m` 和 `n` 是矩阵中非 0 元素的最大行列数 +- 比较适合存放随时增减节点的矩阵, 插入或者删除元素的成本比较低, 很灵活 +- 支持范围查找, 比如查找某一行中所有的列 +- 实现简单 + +## 算法的实现 + +使用 BTree 进行存储, 实现起来最简单, 因为我们要求的接口与 BTreeMap 本身的接口非常匹配, 需要额外 +花费的精力很少. + +```rust +{{#include assets/btree_sparse_matrix.rs:5:73}} +``` \ No newline at end of file diff --git a/src/matrix/sparse-matrix/dictionary.md b/src/matrix/sparse-matrix/dictionary.md deleted file mode 100644 index 32e6582c..00000000 --- a/src/matrix/sparse-matrix/dictionary.md +++ /dev/null @@ -1 +0,0 @@ -# 字典 Dictionary \ No newline at end of file