zoukankan      html  css  js  c++  java
  • 优先队列 Rust实现

    优先队列

    优先队列是用来维护一组元素集合的数据结构

    一个最小优先队列支持下列操作:

    • heap_insert_key(i, key)把key插入键i的值
    • heap_extract_min()删除并返回堆的最小值

    可以用堆来实现优先队列
    关于建堆的操作,之前的文章已经介绍过了

    pub struct MinHeap {
        size: usize,
        array: Vec<i32>,
    }
    
    impl MinHeap {
        pub fn new(array: Vec<i32>) -> MinHeap {
            MinHeap {
                size: array.len(),
                array,
            }
        }
        fn parent(i: usize) -> usize {
            i / 2
        }
        fn left(i: usize) -> usize {
            2 * i
        }
        fn right(i: usize) -> usize {
            2 * i + 1
        }
        fn heap_size(&self) -> usize {
            self.size
        }
        fn swap(&mut self, a: usize, b: usize) {
            self.array.swap(a, b);
        }
        fn min_heapify(&mut self, mut i: usize) {
            loop {
                let l = MinHeap::left(i);
                let r = MinHeap::right(i);
                let mut min;
                if l <= self.size && self.array[i - 1] > self.array[l - 1] {
                    min = l;
                } else {
                    min = i;
                }
                if r <= self.size && self.array[min - 1] > self.array[r - 1] {
                    min = r;
                }
                if min == i {
                    break;
                } else {
                    self.swap(i - 1, min - 1);
                }
                i = min;
            }
        }
        pub fn build_min_heap(&mut self) {
            for i in (1..self.size + 1).rev() {
                self.min_heapify(i);
            }
        }
        fn heap_exterct_min(&mut self) -> i32 {
            let size = self.size;
            if size < 1 {
                panic!("heap underflow");
            }
            let max = self.array[0];
            self.swap(0, size - 1);
            self.size -= 1;
            self.min_heapify(1);
            max
        }
        pub fn heap_insert_key(&mut self, mut i: usize, key: i32) {
            if key > self.array[i - 1] {
                panic!("the new key is larger");
            }
            self.array[i - 1] = key;
            let mut parent = MinHeap::parent(i);
            while i > 1 && self.array[i - 1] < self.array[parent - 1] {
                self.swap(i - 1, parent - 1);
                i = parent;
                parent = MinHeap::parent(i);
            }
        }
        pub fn min_heap_insert(&mut self, key: i32) {
            self.size += 1;
            self.array.push(i32::max_value());
            let i = self.size;
            self.heap_insert_key(i, key);
        }
    }
    
  • 相关阅读:
    网页自动满屏
    页面字符编码不一致的处理
    数据库迁移:从SQL2005到SQL2008
    一条DELETE语句
    网站的最大并发连接数
    C#为网页生成缩略图
    在类中使用page对象用HttpContext.Current
    域名解析、子域名、cname别名指向、MX记录、泛域名与泛解析、域名绑定、域名转向
    C#数据库编程中SqlDataAdapter与DataSet的区别与联系
    gridview不能删除修改数据的问题
  • 原文地址:https://www.cnblogs.com/kwebi/p/9631773.html
Copyright © 2011-2022 走看看