【发布时间】:2013-09-22 12:41:48
【问题描述】:
我想生成一个巨大的加权无向图,由一个巨大的邻接矩阵 AJM 表示。所以对于 i 和 j 的循环,
AJM[i][j] = AJM[j][i]
AJM[i][i] = 0
权重在区间内生成为随机双数,例如 [0.01, 10.00]。如果我有 10k 个顶点,那么矩阵将是 10k x 10k 的双类型条目,如果我存储它,这将是内存中的一大块。
现在我想为想要的边数设置一个阈值 E,并忽略所有权重大于某个阈值 T 的边(T 由 E 确定,E 是用户定义的),只存储最小的 E 边向量中的权重低于 T 以供以后使用。你能给我一些建议如何以有效的方式实现这一目标吗?最好避免对整个邻接矩阵进行任何形式的存储,只需使用流式结构即可。所以我想知道我应该如何生成矩阵并进行阈值处理?
我猜需要读写文件,对吧?
一种方法是,在对文件进行某种操作后,我设置阈值 E 并执行以下操作:
我从矩阵中一个一个地读取元素,所以我不会读取整个矩阵(你能展示几行 C++ 代码来实现这一点吗?),然后将它的权重插入到一个最小堆中,存储它的向量中对应的边缘索引。当堆的大小达到 E 时我停止,这样边缘索引的向量就是我想要的。
您认为这是正确的做法吗?还有其他建议吗?请指出我在这里可能遇到的任何错误。非常感谢!
【问题讨论】:
-
它听起来 像 sparse-matrix 会减轻您的内存问题,尽管最坏的情况仍然会消耗大量内存。如何实现稀疏性是一个单独的问题。
-
这里的随机性有多随机?您可以使用只需要存储种子值的 PRNG。可能有 N 个种子值。
-
这会产生断开的图是不是有问题?您需要保留原始图表,还是某种临时的?
-
@AdamBurry 是的,阈值化的结果是一个断开的森林。我不需要保留原始图表
标签: c++ memory matrix threshold