使用mathematica实现prufer编码

在这里插入图片描述

If[Length[Names["`*"]] > 0, Remove["`*"]];
(*邻接矩阵*)
A = {{0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 0, 1, 0, 0, 0}, {0, 0, 0, 1, 
    0, 0, 0, 0}, {0, 0, 1, 0, 1, 1, 1, 0}, {1, 1, 0, 1, 0, 0, 0, 
    0}, {0, 0, 0, 1, 0, 0, 0, 1}, {0, 0, 0, 1, 0, 0, 0, 0}, {0, 0, 0, 
    0, 0, 1, 0, 0}};
g = AdjacencyGraph[A, PlotTheme -> "Detailed"]
adjtab = Association@
   Table[i -> (Position[A[[i]], 1] // Flatten), {i, Length[A]}];*自定义函数*)
prufer[adjlist_] := Module[
  {
   (*Subscript[存储b, i]数据*)
   blist = {},
   (*Subscript[存储a, i]数据*)
   alist = {},
   adjtab = adjlist,
   i, a, b
   },
  i = 1;
  While[Plus @@ Length /@ Values@adjtab > 2 && i < 9,
   (*Print[Plus@@Length/@Values@adjtab];*)
   leafNode = Position[Length /@ Values[adjtab], 1] // Flatten;
   (*Print[adjtab];
   Print[leafNode];*)
   b = leafNode[[1]];
   a = First[adjtab[b]];
   (*将b码存入blist*)
   AppendTo[blist, b];
   (*将a码存入alist*)
   AppendTo[alist, a];
   (*删除关联表中value=b *)
   adjtab = Delete[adjtab, Position[adjtab, b]];
   (*将关联表中key=a置成空表*)
   adjtab[b] = {};
   i++;
   ];
  Return[alist];
  ]
(*prufer编码*)
prufer[adjtab]

运行结果:
在这里插入图片描述

解码

这里是引用

decode[anode_] := Module[
  {alist = anode,
   edge = {},
   blist = {}, a, b, comlist, i, maxNodenum, size
   },
  size = Length@alist;
  maxNodenum = Length@alist + 2;
  (*追加n+2到(a1,a2,..an-1)末尾*)
  AppendTo[alist, maxNodenum];
  i = 1;
  While[Length[alist] != 0 && i < 2*maxNodenum,
   (*求alist补码*)
   comlist = 
    Complement[Complement[Table[i, {i, maxNodenum}], alist], blist];
   (*Print[comlist];
   Print[alist];*)
   b = Min[comlist];
   a = alist[[1]];
   AppendTo[blist, b];
   If[Length@edge < size,
    AppendTo[edge, a <-> b]];
   comlist = Delete[comlist, Position[comlist, b]];
   alist = Delete[alist, 1];
   i++;
   (*Print["b","->",b," ","a","->",a];
   Print[edge];*)
   ];
  Return[{blist, edge}];
  ]
alist = {7, 4, 9, 9, 2, 9, 1, 7};
{blist, edge} = decode[alist]
Graph[edge, PlotTheme -> "Detailed"]

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值