快速递归算法遍历生成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比较小时的数据,需要的同学可以找我要。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆嵩

有打赏才有动力,你懂的。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值