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

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
% end



end
  • 编写主函数
clc
clear
global 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(); end fclose(data);

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

    原文作者:递归算法
    原文地址: https://blog.csdn.net/lusongno1/article/details/51104737
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞