1 个不稳定版本

0.1.0 2023年9月29日

#2471数据结构

Unlicense

45KB
1K SLoC

Crates.io License Test Status Documentation

rankmap

排名哈希表。

一个结合了以下操作功能的哈希表/二叉堆数据结构

时间复杂度

[描述] [操作] [复杂度]
通过键获取值 获取 O(1)~
检查键是否存在 contains_key O(1)~
弹出排名最低的元素 弹出 O(log(N))
获取排名最低的元素 top O(1)
插入带排名的元素 插入 O(log(N))
删除元素 删除 O(log(N))
use std::thread;
use std::time::{Duration, Instant};

use rankmap::RankMap;

fn task1() {
    println!("task1 finished")
}

fn task2() {
    println!("task2 finished")
}

fn task3() {
    println!("task3 finished")
}

fn main() {
    let mut scheduler: RankMap<&str, Box<dyn Fn()>, Instant> = RankMap::new();

    let tank_id = "task1";
    let task = Box::new(task1);
    let run_at = Instant::now() + Duration::from_secs(1);
    scheduler.insert(tank_id, task, run_at);

    let tank_id = "task2";
    let task = Box::new(task2);
    let run_at = Instant::now() + Duration::from_secs(2);
    scheduler.insert(tank_id, task, run_at);

    while let Some((task_name, task, run_at)) = scheduler.pop() {
        let backoff = run_at - Instant::now();
        thread::sleep(backoff);
        println!("executing {}", task_name);
        task();
    }

    let tank_id = "task3";
    let task = Box::new(task3);
    let run_at = Instant::now() + Duration::from_secs(1);
    scheduler.insert(tank_id, task, run_at);

    if let Some((task, run_at)) = scheduler.remove(&"task3") {
        println!("task3 cancelled");
    }

    assert!(scheduler.top().is_none());
}

更多详细信息请参阅 文档

依赖项

~1MB
~14K SLoC