C 随机边图的生成
我正在尝试编写一个c/c++程序,使用基于秩和路径的并集压缩图算法使用不相交集,然后在该图上应用Kruskal算法。我已经生成了若干个顶点对(0,1),(1,2)…(n-2,n-1)作为图中的边,以便使图连接起来。我需要生成剩余的3*个\u个\u顶点+1条随机边,作为成对(顶点1,顶点2)而不发生碰撞(同一条边不应生成两次)。我必须在不使用额外内存的情况下执行此操作。我所说的额外记忆是指一个额外的列表,vector…你们知道怎么做吗 这就是我到目前为止所做的,但它肯定有冲突:C 随机边图的生成,c,algorithm,math,random,C,Algorithm,Math,Random,我正在尝试编写一个c/c++程序,使用基于秩和路径的并集压缩图算法使用不相交集,然后在该图上应用Kruskal算法。我已经生成了若干个顶点对(0,1),(1,2)…(n-2,n-1)作为图中的边,以便使图连接起来。我需要生成剩余的3*个\u个\u顶点+1条随机边,作为成对(顶点1,顶点2)而不发生碰撞(同一条边不应生成两次)。我必须在不使用额外内存的情况下执行此操作。我所说的额外记忆是指一个额外的列表,vector…你们知道怎么做吗 这就是我到目前为止所做的,但它肯定有冲突: edge** cr
edge** createRandomEdges(nodeG **nodeArray, int n) {
edge **edgeArray = (edge**)malloc(sizeof(edge*)*n * 4);
for (int i = 0; i < n; i++)
edgeArray[i] = createEdge(nodeArray[0], nodeArray[i + 1], rand() % 100+1);
for (int i = n; i < 4 * n; i++) {
int nodeAindex = rand() % n;
int nodeBindex = rand() % n;
while (nodeAindex == nodeBindex) {
nodeAindex = rand() % n;
nodeBindex = rand() % n;
}
int weight = rand() % 100 + 1;
edgeArray[i] = createEdge(nodeArray[nodeAindex], nodeArray[nodeBindex], weight);
}
return edgeArray;
}
edge**createRandomEdges(nodeG**noderray,int n){
边缘**边缘阵列=(边缘**)malloc(边缘大小*)*n*4;
对于(int i=0;i
因此您有N条边,并希望标记其中的K条边以优化内存消耗。在这种情况下,您可以使用O(K)内存复杂性
制作一个大小为K的整数数组,用0..K-1数字填充,然后遍历一个循环,使用提供一致性的规则随机替换一些数字
ReservoirSample(S[1..n], R[1..k])
// fill the reservoir array
for i = 1 to k
R[i] := S[i]
// replace elements with gradually decreasing probability
for i = k+1 to n
j := random(1, i) // important: inclusive range
if j <= k
R[j] := S[i]
ReservoirSample(S[1..n],R[1..k])
//填充储液罐阵列
对于i=1到k
R[i]:=S[i]
//以逐渐降低的概率替换元素
对于i=k+1到n
j:=随机(1,i)//重要:包含范围
如果J你在寻找C或C++解决方案?两种语言都提供不同的解决方案。你的例子看起来像c,而且两种语言都有标记。我擅长任何语言解决方案,我只想要算法。是的,我的代码是用CIf编写的。如果您想讨论算法,您可能需要在一个更合适的堆栈交换站点中提问。也许?@FrançoisAndrieux算法在SO上并没有偏离主题,而编程问题在cs.stackexchange上也明确偏离主题。