前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust日报】2022-01-25 Slas v0.2.0 —— Rust静态线性代数系统

【Rust日报】2022-01-25 Slas v0.2.0 —— Rust静态线性代数系统

作者头像
MikeLoveRust
发布2022-03-24 13:02:29
2850
发布2022-03-24 13:02:29
举报
文章被收录于专栏:Rust语言学习交流

(基础)精美图表详解线段树!

(Basic) Segment Trees with beautiful diagrams!

给定一个长度为N的数组arr,如果有以下操作:

  1. 查询区间[l,r]之间的最大值/最小值;
  2. 更新给定下标i的对应的值arr[i]

则可以使用线段树来高效解决上述场景的查询和更新需求;

线段树的时空复杂度:

  1. 时间复杂度:O(logN)
  2. 空间复杂度:O(N)

Rust实现:

代码语言:javascript
复制
// SegTree segment tree
fn main() {
    let arr = [4i32, 3, 2, 8, 5, 1, 2, 1];
    let max = |i, j| <i32>::max(i, j);

    let mut seg_tree = SegTree::new(&arr, max);
    println!("max(arr): {}", seg_tree.query((0, 7)));

    seg_tree.update(2, 10);
    println!("max(arr): {}", seg_tree.query((0, 7)));
}

struct SegTree<T, F, const N: usize>
    where
        [T; N]: Sized,
        F: Fn(T, T) -> T,
{
    buf: Vec<T>,
    f: F,
}

impl<T, F, const N: usize> SegTree<T, F, N>
    where
        T: Ord + Default + Copy,
        [T; N]: Sized,
        F: Fn(T, T) -> T,
{
    pub fn new(arr: &[T; N], f: F) -> Self {
        let mut buf = vec![T::default(); 2 * N];
        buf[N..2 * N].copy_from_slice(arr);
        for i in (1..N).rev() {
            buf[i] = f(buf[2 * i], buf[(2 * i + 1)]);
        }
        SegTree { buf, f }
    }

    pub fn query(&self, (mut l, mut r): (usize, usize)) -> T {
        l += N - 1;
        r += N - 1;
        let mut ans = self.buf[l];
        while l <= r {
            if l % 2 == 1 {
                ans = (self.f)(ans, self.buf[l]);
                l += 1;
            }
            if r % 2 == 0 {
                ans = (self.f)(ans, self.buf[r]);
                r -= 1;
            }
            l /= 2;
            r /= 2;
        }
        ans
    }

    pub fn update(&mut self, mut idx: usize, val: T) {
        idx += N - 1;
        self.buf[idx] = val;
        idx /= 2;

        while idx != 1 {
            self.buf[idx] = (self.f)(self.buf[2 * idx], self.buf[2 * idx + 1]);
            idx /= 2;
        }
    }
}

参考链接:

  • (Basic) Segment Trees;
  • segment-tree;

Thalo.rs —— Rust中的事件溯源库

Thalo.rs - Event Sourcing in Rust

Thalo是一个基于以下模式构建大型系统的事件溯源框架:

  • 事件溯源
  • CQRS
  • 事件驱动
  • 事务发件箱
  • DDD

它的设计是模块化的,带有实现大多数功能的额外库。

官方提供的库:

  • 核心库
    • thalo: 核心框架
    • thalo-testing: thalo的测试组件;
    • thalo-macros: 实现trait的宏(可以通过macro特性开关在核心库中打开此功能);
  • 事件存储
    • thalo-postgres: 为Postgres实现EventStore trait;
    • thalo-inmemory: 内存实现EventStore
    • thalo-filestore: 为filestore实现EventStore
  • 事件流
    • thalo-kafka:为kafka实现EventStream

电子邮件解析和生成库

E-mail parsing and building in Rust

作者刚刚发布了一个名为mail-builder的新库,可以在Rust中轻松生成MIME电子邮件。这个库与作者在几周前发布的邮件解析器mail-parser相结合,为构建和解析Rust中任何复杂的RFC5322电子邮件提供了全面支持。

mail-builder: https://crates.io/crates/mail-builder

mail-parser: https://crates.io/crates/mail-parser

Slas v0.2.0 —— Rust静态线性代数系统

Slas v0.2.0 - Static Linear Algebra System

提供静态分配的向量、矩阵和张量类型,高效的实现了blas/blis接口,默认情况下使用写时复制行为(又名cow)。

与v0.1.1版本相比,新版本的Slas有很多突破性的变化和功能,包括:

  • 模块化后端;
  • 更好的性能;
  • 支持矩阵和张量(张量仍然做不了多少);
  • 向量支持可选的COW行为;
  • 更好的基准测试和文档;

项目地址:https://github.com/unic0rn9k/slas


From 日报小组 odd-cat

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • (基础)精美图表详解线段树!
  • Thalo.rs —— Rust中的事件溯源库
  • 电子邮件解析和生成库
  • Slas v0.2.0 —— Rust静态线性代数系统
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档