快速递归算法遍历生成De Bruijn序列

来源:互联网 发布:互联网架构软件架构 编辑:程序博客网 时间:2024/06/06 01:19

matlab生成De Bruijn序列

如前文所诉,若要使用傻瓜式生成De Bruijn序列,即把每一种情况都考虑一遍,那么当n=5时,恐怕你的机器都要跑将近一周。考虑到当序列前已重复时,后面变动的情况就不需要判断,可以将生成时间大大缩短。
当然,还有一些其他的想法也可以缩短时间,就不一一实现了。
直接上代码吧。

  • 编写递归函数func.m
function func()global s l n k data;if(size(s,2)<l)%&&bin2dec(num2str(s(:)))<=(2^l-1)    for p=0:1        s(k)=p;        s=s(1:k);        for j=1:k-n+1            ss{j}=num2str(s(j:j+n-1));        end        if(length(unique(ss))==k-n+1)             if(k+1>l)                s_span=[s s(1:n-1)];                  for m=1:l                    ss_span{m}=num2str(s_span(m:m+n-1));                  end                  if(length(unique(ss_span))==l)                    fprintf(data,'%s\n',num2str(s));                  end                  continue;             end             k=k+1;             func();             k=k-1;        end    end%      if(p==1)%        k=k-1;%      end%     if(k>l)%         s_span=[s s(1:n-1)];%         for m=1:l%             ss_span{m}=num2str(s_span(m:m+n-1));%         end%         if(length(unique(ss_span))==l)%             fprintf(data,'%s\n',num2str(s));%              disp(['打印成功']);%         end%     endend
  • 编写主函数
clcclearglobal s l  n k data;n=5;k=n+1;data=fopen(['D:\test_n=' num2str(n) '.txt'],'wt');l=2^n;%;%head=1 s=[0 1]head=0:2^n-1;head_binc=dec2bin(head,n);for i=1:length(head_binc)    disp(['已完成' num2str(i) '/' num2str(l) ]);    head_bin=head_binc(i,:)    %s=head_bin;    s=str2num(head_bin(:))';    func();endfclose(data);

大概估计了一下时间,计算n=5的时候大概运行3、4个小时就差不多了。
做了几组n比较小时的数据,需要的同学可以找我要。

0 0
原创粉丝点击