#hash-set #operations #infinite #flags #process #origin #complementary

flag_set

FlagSet 可以处理无限补集和原集的操作

7 个版本

0.1.6 2021年3月21日
0.1.5 2021年3月21日

#1518数据结构

MIT/Apache

14KB
97

FlagSet

Crate doc.rs

HashSet 仅实现普通集合。当补集是无限集时,HashSet 无法表示其补集。

FlagSet 通过一个 HashSet 和一个 bool 值的元组来实现。当 bool 值为 true 时,FlagSet 表示 HashSet 。当 bool 值为 true 时,FlagSet 表示 HashSet 的补集。

HashSet 类型一样,FlagSet 需要元素实现 EqClone 特性。

FlagSet 还定义了基于 Binary Operations 的五种集合操作。

A ∪B -> A + B

A ∩ B -> A & B

A - B -> A - B

A Xor B -> A ^ B

CuA -> !A

示例

use std::collections::HashSet;
use flag_set::FlagSet;

let a: HashSet<_> = vec![1, 2, 3].into_iter().collect();
let b: HashSet<_> = vec![2, 3, 4].into_iter().collect();

let flag_ap = FlagSet(a.clone(), true);
let flag_an = FlagSet(a.clone(), false);
let flag_bp = FlagSet(b.clone(), true);
let flag_bn = FlagSet(b.clone(), false);

// 用new方法创建实例
// use new method create an instance
assert_eq!(flag_bn, FlagSet::new(vec![2, 3, 4], false));

// 测试并
// test union
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], true), flag_ap.clone() + flag_bp.clone());
assert_eq!(FlagSet::new(vec![4], false), flag_ap.clone() + flag_bn.clone());
assert_eq!(FlagSet::new(vec![1], false), flag_an.clone() + flag_bp.clone());
assert_eq!(FlagSet::new(vec![2, 3], false), flag_an.clone() + flag_bn.clone());

// 测试交
// test intersection
assert_eq!(FlagSet::new(vec![2, 3], true), flag_ap.clone() & flag_bp.clone());
assert_eq!(FlagSet::new(vec![1], true), flag_ap.clone() & flag_bn.clone());
assert_eq!(FlagSet::new(vec![4], true), flag_an.clone() & flag_bp.clone());
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], false), flag_an.clone() & flag_bn.clone());

// 测试减
// test substraction
assert_eq!(FlagSet::new(vec![1], true), flag_ap.clone() - flag_bp.clone());
assert_eq!(FlagSet::new(vec![2, 3], true), flag_ap.clone() - flag_bn.clone());
assert_eq!(FlagSet::new(vec![1, 2, 3, 4], false), flag_an.clone() - flag_bp.clone());
assert_eq!(FlagSet::new(vec![4], true), flag_an.clone() - flag_bn.clone());

// 测试否
// test not
assert_eq!(FlagSet(a.clone(), true), !flag_an.clone());

// 测试对称差
// test symmetric difference
assert_eq!(FlagSet::new(vec![1, 4], true), flag_ap.clone() ^ flag_bp.clone());

无运行时依赖