1 个稳定版本
1.4.0 | 2021年11月4日 |
---|---|
1.3.0 |
|
1.1.0 |
|
1.0.0 |
|
#2539 在 算法
7KB
62 行
查找行排序和列排序矩阵中元素的所有出现。
时间复杂度: O(m+n)
其中,m=列数,n=行数。
空间复杂度: O(m+n)
这个包有什么特别之处?
时间复杂度甚至不是线性的,几乎是线性时间的平方根。线性时间复杂度是 O(m x n)
。
如何使用它?
您不需要传递矩阵!相反,您传递一个数组(或一个 vec),它模拟一个二维矩阵。如何?将集合中的每个索引视为(X + nY)。
首先,这是一个简单的矩阵,两个方向都排序
let matrix =
| 1 2 4 5 |
| 3 4 4 5 |
| 5 5 8 9 |
这个矩阵有 3 行 4 列。现在,考虑位于第 3 行第 3 列的元素 8。
然后我们将这个二维矩阵转换为如下单数组
let matrix = [1, 2, 4, 5, 3, 4, 4, 5, 5, 5, 8, 9]
我们将如何转换 8 在这个数组中的位置?
很简单!columns x (8's row_position - 1) + 8's (column position - 1)
那是 10。
这个包有一个函数,equal_is_bigger
。名字很奇怪,但这正是它实际做的事情。那么你怎么使用它?让我们看一个例子。
我们称我们的矩阵为三明治(排序的矩阵让我想起堆叠的三明治)
您定义矩阵中有多少行和列。
您传递您要搜索的元素。
该函数返回一个模式。让我们看看它是什么。
use stacked_sandwich::interface::equal_is_bigger;
fn main() {
let sandwich = [1, 2, 4, 5, 3, 4, 4, 5, 5, 5, 8, 9]; // Your translated matrix
let rows = 3;
let cols = 4;
let search_element = 5;
let result = equal_is_bigger(&sandwich, cols, rows, search_element);
}
所以,结果看起来如何?有点像这样
[
OccurancePattern { row: 0, leftbound_col: 3, rightbound_col: 3 },
OccurancePattern { row: 1, leftbound_col: 3, rightbound_col: 3 },
OccurancePattern { row: 2, leftbound_col: 0, rightbound_col: 1 }
]
行和列的索引都是从 0 开始的。这意味着,第 1 行是第 0 行,第 1 列是第 0 列。现在,将您的原始矩阵与结果匹配!