实现一套覆盖数据结构
Implementing a set cover data structure
我想实现一个表示抽象数据类型"集合的覆盖"的数据结构。集合的元素由整数索引表示,子集也是如此。每个元素uint64_t e
至少分配给一个但可能有多个子集uint64_t s
。这可以通过将子集索引存储在std::vector
中来实现。任何元素将被分配到的子集数通常远小于元素总数。
性能(时间和内存(很重要,那么您会推荐哪种实现方式?
-
std::vector<std::vector<uint64_t>>
-
std::vector<std::unordered_set<uint64_t>>
-
std::vector<std::set<uint64_t>>
- 别的东西?
频繁的操作包括:
- 将元素分配给子集
- 从子集中删除元素(并可能将其移动到另一个子集(
- 检查元素是否为特定子集的成员
- 获取元素所属的所有子集
- 对特定子集的所有元素进行有效迭代会很好,但我相信这与其他目标相冲突
最快的(就实现时间而言(是一对数据结构:
std::vector< std::unordered_set<X> > set_to_elements;
std::unordered_map< X, std::unordered_set<std::size_t> > element_to_sets;
两人保持连贯。 boost
多索引容器可能能够更有效地完成这种双向工作。
将元素分配给子集
set_to_elements[subset].insert(element);
element_to_sets[element].insert( subset );
从子集中删除元素(并可能将其移动到另一个子集(
set_to_elements[subset].erase(element);
element_to_sets[element].erase( subset );
检查元素是否为特定子集的成员
return set_to_elements[subset].find(element) != set_to_elements[subset].end();
或返回 element_to_sets[element].find(subset( != element_to_sets[element].end((;获取元素所属的所有子集
return element_to_sets[element];
对特定子集的所有元素进行有效迭代会很好,但我相信这与其他目标相冲突
return set_to_elements[subset];
所有操作都是恒定时间和线性记忆。 内存和时间要求大约是只需要上述最后两个之一的紧凑要求的两倍。
缓存[]
操作结果的微优化应该在实际代码中完成,如果它实际上是性能敏感的。 将迭代器从一个容器存储到另一个容器,以使操作 #1 和 #2 更快,是可选的,可能会使它们更快,但我不会打扰。
你可以尝试阅读Matt Austern的论文Segmented Iterators and Hierarchial Algorithms。他讨论了如何有效地处理形式container<container<T>>
的分层数据结构。需要解决的一个问题是 迭代,就好像你有一个平坦的container<T>
.为此,标准库算法需要专门用于所谓的分段迭代器。
是一种两级数据结构,除了执行顶级迭代外,还包含一个本地迭代器以更深入地进行一级迭代。由于这些局部迭代器本身也可以是分段迭代器,因此这允许任意嵌套的数据结构(例如树和图(。
离散集的集合覆盖可以构造为 std::vector<std::set<T>>
。将 STL 算法应用于这样的容器要么很麻烦,要么需要分段迭代器和分层算法。不幸的是,标准库和 Boost 都没有真正实现这一点,所以你有一些工作要做。
- CreateProcess在退出后占用套接字端口(每个套接字地址只允许使用一次)
- 是否有一种有效的方法来搜索队列中的关键字并覆盖其值
- 如何快速创建一组覆盖两个图像的图像
- 仅通过建立一次TCP连接将Recv从客户端发送到服务器套接字
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 如何使用嵌套初始化构造函数中的一维向量初始化矩阵
- 如何在嵌套的 for 循环中使用“继续一段时间”循环
- 覆盖我正在扩展的嵌套类的方法
- 有没有一种方法可以防止以前运行的值存储在txt文件中(防止覆盖)
- 在嵌套循环/循环不变量中检查一次
- 如何检查套接字在一段时间内未收到
- 如何获得覆盖另一堆矩形的最小计数矩形
- 有没有一种方法可以将宏名称作为参数传递给嵌套宏,而在最外层宏展开时不展开它们
- Zmq 套接字在一段时间后不工作
- 在 C++ 中使用嵌套开关语句是一种不好的做法吗?
- 模板嵌套类的构造函数问题(复制 ctor 似乎覆盖了其他 ctor)
- 嵌套循环 - 一维索引
- 实现一套覆盖数据结构
- 打印从套接字收到的字符,一次一个
- 查找最窄区间的算法,其中 m 将覆盖一组数字