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比较小时的数据,需要的同学可以找我要。