通过度序列生成一个随机图

这是我写的第一个matlab程序,在老师的逼迫下硬着头皮实现论文里的伪代码,这个程序我是参考Towards Identity Anonymization on Graphs这篇论文的第一个算法的伪代码完成的,写完之后终于理解了老师常说的用到什么学什么,而不是一味花大量时间去系统的学习某一种语言了。
主要思想是从度序列里随机选取一个度为d(v)的结点v,同时将d(v)置为0,然后在剩下的结点中选取d(v)个结点与之相连,相连过得结点的度要减1,一直迭代到所有的度都为0,边就连完了,随机图也就构成了(代码写的糙,多多包涵)。
代码如下,度序列是我自己随便写的一个(注意:不是任意一个序列都能生成图,要满足这里写图片描述)。

d = [13,13,13,13,11,12,12,5,7,12,7,11,7,12,12,5,3,5,7,5,3,5,3,3,7,11,11];
n = length(d);
V = [];
tab1 = [];
tab2 = [];
s=0;
count = 0;
alen = 1;
blen = 1;
vlen = 1;
for i = 1:n
    s = s + d(i);
end
if mod(s,2)~=0
    disp('No');
    return ;
end
while 1 
    for i = 1:n
        if(d(i)<0)
            disp('No');
            break;
        end
    end
    %如果所有的度都为0,则输出G
    for i = 1:n
        if(d(i) ==0)
            count = count+1;
        end
        if (count == n)           
           G = graph(tab1,tab2);
            plot(G);
            return;
        end
    end
    Arr = randperm(n);
    for i = 1:n
    v = Arr(i);
    if d(v)>0      %随机选取一个度大于0的顶点v
        a = d(v);         %a个与v相连的节点
        d(v) = 0;
        [B,I] = sort(d);      %并返回最大的a个数,将d从小到大排序,B是排序后的序列,I是排序后的索引
        for j = n-a+1:n           %将这a个结点存在V中       
            V(vlen) = I(j);
            vlen = vlen+1;           
        end
        for k = 1:a
            tab2(blen) = V(blen);
            w = tab2(blen);
            d(w) = d(w)-1;                     
            tab1(alen) = v;
            alen = alen+1;
             blen = blen+1;
        end      
    end
         i = i+1;
    end
end
        
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值