#二分查找 #检查 #元素 #目标 #搜索算法 #排序 #斯大林

stalin-binary-search

类似于二分查找,但任何不是目标的检查元素都会被消除

3 个版本

0.0.4 2021 年 11 月 3 日
0.0.3 2021 年 11 月 2 日
0.0.1 2021 年 10 月 22 日

#2110 in 算法

AGPL-3.0-only

195KB
155

Rust crates.io version

斯大林二分查找

基于斯大林排序的理念 ss

类似于二分查找,但任何不是目标的检查元素都会被消除。

第一次运行时的复杂度约为~ 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],
    );
  }
}

无运行时依赖