这是我写的第一个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