如前文所訴,若要使用傻瓜式生成de bruijn序列,即把每一種情況都考慮一遍,那麼當n=5時,恐怕你的機器都要跑將近一周。考慮到當序列前已重複時,後面變動的情況就不需要判斷,可以將生成時間大大縮短。
當然,還有一些其他的想法也可以縮短時間,就不一一實現了。
直接上**吧。
function
func
()global s l n k data;
if(size(s,2)%&&bin2dec(num2str(s(:)))<=(2^l-1)
for p=0:1
s(k)=p;
s=s(1:k);
forj=1:k-n+1
ss=num2str(s(j:j+n-1));
endif(length(unique(ss))==k-n+1)
if(k+1>l)
s_span=[s s(1:n-1)];
for m=1:l
ss_span=num2str(s_span(m:m+n-1));
endif(length(unique(ss_span))==l)
fprintf(data,'%s\n',num2str(s));
endcontinue;
endk=k+1;
func();
k=k-1;
endend% if(p==1)
% k=k-1;
% end
% if(k>l)
% s_span=[s s(1:n-1)];
% for m=1:l
% ss_span=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);
fori=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比較小時的資料,需要的同學可以找我要。
遍歷演算法 遞迴思想
先遞推,再回歸 方法定義中呼叫方法本身的現象。數學歸納法的思想 注意事項 1.要有 出口,否則就是死遞迴 2.次數不能太多,否則就記憶體溢位 3.構造方法不能遞迴使用 案例一 兔子問題 斐波那契數列 前後兩數的商無限接近於 分割比例 0.618 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔...
快速排序 遞迴演算法
快速排序原理 從乙個陣列中任意挑選乙個元素 通常為最左邊的元素 作為基準數,將剩下的元素和基準數進行比較,將小於等於中軸元素的放到基準數的左邊,經大於 中軸元素的放到基準數的右邊,然後以當前基準數的位置為界,將左半部分陣列和右 半部分陣列堪稱兩個新的陣列,重複上述操作,直到子陣列的元素個數小於等於1...
快速冪(遞迴和非遞迴演算法)
快速冪 exponentiation by squaring,平方求冪 簡單而高效地計算方法,演算法的時間複雜度是o log n 例題 3的5次方如何計算呢?a的n次方 p 方法一 33333 243 進行四次連乘,複雜度為o n 1 適用於a,n都很小的情況。方法二 遞迴演算法 a的n 2次方a的...