Rust——并查集

Rust——并查集

实现

#![allow(unused)]
//! 并查集:解决节点连接/关联问题

/// 并查集 trait
trait UF {
    fn is_connected(&mut self, p: usize, q: usize) -> bool;
    fn union_elements(&mut self, p: usize, q: usize);
    fn get_size(&self) -> usize;
}

/// 并查集结构
pub struct UnionFind {
    // 存储父节点
    parent: Vec<usize>,
    // 高度
    rank: Vec<usize>,
}

impl UnionFind {
    /// 构造
    pub fn new_with_size(size: usize) -> Self {
        let mut res = Self {
            parent: vec![0_usize; size],
            rank: vec![1_usize; size],
        };
        // 为每个元素分组
        for i in 0..res.parent.len() {
            res.parent[i] = i;
        }
        return res;
    }

    /// 查询p的根
    fn find(&mut self, p: usize) -> Result<usize, &'static str> {
        if p >= self.parent.len() {
            return Err("参数错误");
        }
        let mut c = p;
        // 寻找根
        while c != self.parent[c] {
            // 压缩高度
            self.parent[c] = self.parent[self.parent[c]];
            c = self.parent[c];
        }
        return Ok(c);
    }
}

impl UF for UnionFind {
    /// 查看两元素是不是同一个根
    fn is_connected(&mut self, p: usize, q: usize) -> bool {
        let p_root = self.find(p).unwrap();
        let q_root = self.find(q).unwrap();
        return p_root == q_root;
    }

    /// 合并两个元素为一个根
    fn union_elements(&mut self, p: usize, q: usize) {
        let p_root = self.find(p).unwrap();
        let q_root = self.find(q).unwrap();
        if p_root != q_root {
            if self.rank[p_root] < self.rank[q_root] {
                self.parent[p_root] = self.parent[q_root];
            } else if self.rank[q_root] < self.rank[p_root] {
                self.parent[q_root] = self.parent[p_root];
            } else {
                self.parent[q_root] = self.parent[p_root];
                self.rank[p_root] += 1;
            }
        }
    }

    fn get_size(&self) -> usize {
        return self.parent.len();
    }
}


#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn it_works() {
        let mut union_find = UnionFind::new_with_size(10);
        union_find.union_elements(3, 5);
        union_find.union_elements(2, 1);
        union_find.union_elements(5, 1);
        union_find.union_elements(5, 4);
        assert_eq!(union_find.is_connected(4, 1), true);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的 Rust 项目中添加 sqlx 和 sqlx-core 依赖,可以在 Cargo.toml 文件中添加如下内容: ```toml [dependencies] sqlx = "0.5" sqlx-core = "0.5" ``` 接下来,你需要定义一个数据模型来表示数据库中的表。例如,考虑一个简单的用户表,包含 id、name 和 email 字段,你可以创建一个名为 User 的结构体来表示它: ```rust use sqlx::{FromRow, PgPool}; #[derive(Debug, FromRow)] struct User { id: i32, name: String, email: String, } ``` 接着,你需要创建一个 PostgreSQL 连接池,以便从数据库中查询数据。你可以使用 `PgPool::connect` 方法来创建连接池: ```rust #[tokio::main] async fn main() -> Result<(), sqlx::Error> { let pool = PgPool::connect("postgres://user:password@host/database").await?; // ... Ok(()) } ``` 现在,你可以使用 sqlx 的查询宏来查询用户表中的数据。例如,要查询所有用户的名称和电子邮件,可以使用如下代码: ```rust let users = sqlx::query_as::<_, User>("SELECT id, name, email FROM users") .fetch_all(&pool) .await?; ``` 这将返回一个包含所有用户的名称和电子邮件的 vector。如果你只想查询特定用户的数据,可以使用参数化查询: ```rust let user = sqlx::query_as::<_, User>("SELECT id, name, email FROM users WHERE id = $1") .bind(1) .fetch_one(&pool) .await?; ``` 这将返回 ID 为 1 的用户的名称和电子邮件。 当然,这只是一个简单的示例。使用 sqlx 还有很多更复杂的查询和操作,你可以参考 sqlx 的文档来学习更多内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值