Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 随机边图的生成_C_Algorithm_Math_Random - Fatal编程技术网

C 随机边图的生成

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

我正在尝试编写一个c/c++程序,使用基于秩和路径的并集压缩图算法使用不相交集,然后在该图上应用Kruskal算法。我已经生成了若干个顶点对(0,1),(1,2)…(n-2,n-1)作为图中的边,以便使图连接起来。我需要生成剩余的3*个\u个\u顶点+1条随机边,作为成对(顶点1,顶点2)而不发生碰撞(同一条边不应生成两次)。我必须在不使用额外内存的情况下执行此操作。我所说的额外记忆是指一个额外的列表,vector…你们知道怎么做吗

这就是我到目前为止所做的,但它肯定有冲突:

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上也明确偏离主题。