#matrix #array #linear-time #algorithm #square-root

stacked-sandwich

在行/列排序矩阵中查找一个数字的所有出现;在线性时间的平方根内!

1 个稳定版本

1.4.0 2021年11月4日
1.3.0 2021年11月4日
1.1.0 2021年11月4日
1.0.0 2021年11月4日

#2539算法

MIT 许可证

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 列。现在,将您的原始矩阵与结果匹配!

无运行时依赖