记忆保守的最大独立顶点集
Memory conservative maximal independent set of vertices
我想为无向图中设置的最大独立顶点找到一种内存保守但有效的算法。
传统算法使用辅助数据结构(原始图形的副本)来实现它。我想避免这种并行结构,因为内存分配对于实时实现来说很慢,而且我有一些内存边界。我只想用布尔标签标记 MIS 中的节点。可能吗?
请注意,我不想要最大独立集,而是最大独立集。
附言我知道这个问题与语言无关,但我正在用C++和STL编码。
如果你每个节点只有布尔标签(i),这是一个解决方案。需要时间 O(|V|+|E|),其中 |V|是节点数和 |E|是输入图形中的边数。
For all nodes v
set label(v)=false;
For all nodes v
if (all neighbors w of v have label(w)=false)
set label(v)=true
标签(v)=true 的节点 v 是一个最大独立集合。它们是独立的,因为根据构造,任何标记的节点 v 都不能有标记的邻居。而且它们是最大集合,因为您只激活标签,并且只有在另一个已标记的邻居 w 阻止它时才保留节点 v 未标记。
优化说明:如果节点编号为 1...n,则只需检查邻居 w=1..v-1,因为任何其他 w 都不能有 label(w)=true。
如果不确切知道您的数据结构是什么,就很难回答此类问题。近地图操作的常用技巧是从指针中窃取两个本来为零的位,并对图结构进行可逆更改,但我不确定它们在这里如何应用。
通过阅读您编写的内容,似乎没有遍历就无法遍历图形中的节点。您如何表示DFS的堆栈?
我使用划痕vector
或deque<bool>
来指示元素、边或小平面使用的顶点......
std::deque<bool> used(vertex.size(), false);
for (size_t e = 0; e < edge.size(); ++e)
{
used[edge[e].v1] = true;
used[edge[e].v2] = true;
}
现在使用 == true 表示所有使用的顶点。 如果需要,可以将其他的折叠起来。
相关文章:
- 如何循环打印顶点结构
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 独立读取-修改-写入顺序
- D3D11-将混合权重和索引传递到顶点着色器
- 带有多个独立参数的C++For循环
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 如何将一半传递给顶点着色器?
- 在 DirectX 11 中从 GPU 读回顶点缓冲区(并获取顶点)
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- 使用 OpenGL 4.5 更改所选顶点的颜色
- 通过命令行在Visual Studio中编译单个独立文件
- Direct3D 11 - HLSL - 获取顶点索引 ID
- 如何将独立的 c 应用程序组合到 c++ 应用程序中?
- 创建异构顶点数据数组的可移植方法
- 使用 glvertex4i 传递网格面索引时的顶点着色器错误
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- antlr 规则上下文是否可以独立于目标
- 记忆保守的最大独立顶点集