9 个版本
0.3.1 | 2024 年 6 月 13 日 |
---|---|
0.3.0 | 2024 年 3 月 19 日 |
0.2.4 | 2024 年 1 月 23 日 |
0.2.3 | 2023 年 5 月 28 日 |
0.1.1 | 2023 年 4 月 7 日 |
#86 在 算法 中
每月 696 次下载
用于 2 crates
240KB
3.5K SLoC
ndarray-slice
针对非连续(子)视图的 n 维数组的高效且健壮的基于切片的算法(例如,排序,选择,搜索)。在 slice
和 rayon::slice
中重新实现算法,用于 ndarray
,具有任意内存布局(例如,非连续)。
示例
use ndarray_slice::{ndarray::arr2, Slice1Ext};
// 2-dimensional array of 4 rows and 5 columns.
let mut v = arr2(&[[-5, 4, 1, -3, 2], // row 0, axis 0
[ 8, 3, 2, 4, 8], // row 1, axis 0
[38, 9, 3, 0, 3], // row 2, axis 0
[ 4, 9, 0, 8, -1]]); // row 3, axis 0
// \ \ \
// column 0 \ column 4 axis 1
// column 2 axis 1
// Mutable subview into the last column.
let mut column = v.column_mut(4);
// Due to row-major memory layout, columns are non-contiguous
// and hence cannot be sorted by viewing them as mutable slices.
assert_eq!(column.as_slice_mut(), None);
// Instead, sorting is specifically implemented for non-contiguous
// mutable (sub)views.
column.sort_unstable();
assert!(v == arr2(&[[-5, 4, 1, -3, -1],
[ 8, 3, 2, 4, 2],
[38, 9, 3, 0, 3],
[ 4, 9, 0, 8, 8]]));
// \
// column 4 sorted, others untouched
当前实现
当 n 是(子)视图的长度,m 是要选择索引的数量时,复杂度。
资源 | 复杂度 | 排序(稳定) | 排序(不稳定) | 选择(不稳定) | 批量选择(不稳定) |
---|---|---|---|---|---|
时间 | 最好 | O(n) | O(n) | O(n) | O(n log m) |
时间 | 平均 | O(n log n) | O(n log n) | O(n) | O(n log m) |
时间 | 最坏 | O(n log n) | O(n log n) | O(n) | O(n log m) |
空间 | 最好 | O(1) | O(1) | O(1) | O(m) |
空间 | 平均 | O(n/2) | O(log n) | O(1) | O(m+log m) |
空间 | 最坏 | O(n/2) | O(log n) | O(1) | O(m+log m) |
路线图
- 添加
SliceExt
trait 以用于 n 维数组或(子)视图,其中方法期望Axis
作为其第一个参数。比较方法将以_by
或_by_key
后缀始终附加,定义如何比较沿提供的关注轴(例如,列)的多维元素(例如,行)。
查看 发布历史 以跟踪开发情况。
特性
alloc
用于稳定的sort/
sort_by
/sort_by_key
。通过std
启用。std
用于稳定的sort_by_cached_key
。通过default
或rayon
启用。stacker
在需要时将递归栈溢出到堆。由default
启用。rayon
用于并行par_sort*
/par_select_many_nth_unstable*
。
许可证
版权所有 © 2023 Rouven Spreckels [email protected]
本项目包含 rust
和 rayon
的派生作品。有关完整的作者信息,请参阅它们的版本控制历史。相应的版权归其贡献者所有。
与原始作品一样,本项目受以下任一许可证的许可
- Apache License,版本 2.0,(LICENSES/Apache-2.0 或 https://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSES/MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非你明确表示,否则任何由你故意提交以包含在本项目中的贡献(根据 Apache-2.0 许可证定义),都应按上述方式双重许可,不附加任何额外条款或条件。
依赖项
~1.4–2.1MB
~39K SLoC