3 个版本
0.0.4 | 2021 年 11 月 3 日 |
---|---|
0.0.3 | 2021 年 11 月 2 日 |
0.0.1 | 2021 年 10 月 22 日 |
#2110 in 算法
195KB
155 行
斯大林二分查找
基于斯大林排序的理念
类似于二分查找,但任何不是目标的检查元素都会被消除。
第一次运行时的复杂度约为~ O(log n),然而在~ n/2 次运行后,复杂度将保证为 O(1)。在未排序的情况下不会失败。
(这里的分析不是来自 Fingon,而是通过图片和花哨的文字来展示这种算法在未排序数组中的工作原理 底层分析.)
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn find_on_sorted() {
let mut sorted = vec![1, 2, 3, 4, 5, 6, 7, 8, 9];
let find = sorted.stalin_find(3);
assert!(find.is_some());
assert_eq!(
find,
Some(1),
);
assert_eq!(
sorted,
vec![1, 3, 4, 6, 7, 8, 9],
);
if let Some(find_3) = find {
assert_eq!(
3, sorted[find_3]
);
}
}
#[test]
fn find_on_unsorted() {
let mut unsorted = vec![33, 55, 3, 4, 7657, 6, 7, 8];
assert_eq!(
unsorted.stalin_find(3),
Some(2),
);
assert_eq!(
unsorted,
vec![33, 55, 3, 7657, 7, 8],
);
if let Some(find_7) = unsorted.stalin_find(7) {
assert_eq!(
7, unsorted[find_7]
);
}
}
#[test]
fn find_fail() {
let mut unsorted = vec![33, 55, 3, 4, 7657, 6, 7, 8];
assert_eq!(
unsorted.stalin_find(77),
None,
);
assert_eq!(
unsorted,
vec![],
);
}
#[test]
fn find_not_fail() {
let mut unsorted = vec![33, 55, 3, 4, 7657, 6, 7, 8, 2];
assert_eq!(
unsorted.stalin_find(2),
Some(0),
);
assert_eq!(
unsorted,
vec![2],
);
}
}