廣搜的時候,儲存狀態和進行雜湊很重要,我們來回憶一下常見的狀態儲存和雜湊法
1.直接的陣列定位:
hash:array[0..20,0..20,0..20] of record end;
將組成狀態的各個元素直接作為數,或者編號,然後就可以利用陣列的下標直接定位,適用於各元素不是很大,而且維數不是太多
2.編號法,對狀態事先進行儲存,然後編號。或者是對於幾個有序的元素的全排列,可以利用康托展開對全排列進行編號和生成。
對十進位制數的全排列進行康托展開:
vark:array[0..10] of longint;//儲存階乘
s:string;
i:longint;
function kt(x:string):longint;
varhash:array[0..10] of boolean;//判斷數是否出現過
i,t,j,c:longint;
begin
fillchar(hash,sizeof(hash),false);//初始化
kt:=0;
for i:=1 to length(s)-1 do begin//從第一位到倒數第二位進行處理
val(s[i],t);//轉換為數字
hash[t]:=true;//將這一位數字設定為出現過
c:=0;//計數器置0
for j:=1 to t-1 do//對於比這一位小的的數字,如果沒有在之前出現過,則計數
if not hash[j] then
inc(c);
inc(kt,c*k[length(s)-i]);將符合要求的數量乘以從倒數第二位開始數的數的階乘
end;
inc(kt);
end;
begin
readln(s);
k[1]:=1;
for i:=2 to length(s) do
k[i]:=i*k[i-1];//計算階乘陣列
writeln(kt(s));
end.
3.進製數法,常用的就是狀態有多個0,1狀態,組成乙個二進位制串,然後轉變成乙個十進位制數。也可以是其他進製的狀態組成數,轉變成十進位制數儲存。見進製轉換(數學部分)
4.字串法,若狀態可以表示為乙個沒什麼規律的串,所以用字串雜湊,見以下,函式值是dword範圍內的。
program bkdrhash;
vars:string;
a:qword;
function bkdrhash(x:string):dword;
vari:longint;
t,seed:qword;
begin
t:=0;
seed:=131;//質數種子
for i:=1 to length(s) do
t:=(t*seed+ord(s[i])) and $ffffffff;//對於每一位,將當前函式值乘以種子,加上ascii碼,最後and最大的32位數
bkdrhash:=t and $7fffffff;//最後and這個數
end;
begin
readln(s);
a:=bkdrhash(s);
writeln(a);
end.
有關廣搜和深搜的區別
搜尋題目也是做了不少 對廣搜和深搜的分別用在哪些情況依舊很迷糊 找到大神的一些見解 有些恍然大悟的感覺 一般來說,廣搜常用於找單一的最短路線,或者是規模小的路徑搜尋,它的特點是 搜到就是最優解 而深搜用於找多個解或者是 步數已知 好比3步就必需達到前提 的標題,它的空間效率高,然則找到的不必定是最優...
爬蟲中的深搜和廣搜
的樹結構 顯示的url鏈結圖是有環路的,我們看到的url結構圖是設計圖,實際是有區別的 比如很多頁面實際上是可以直接跳到首頁的 def depth tree tree node if tree node is not none print tree node.data if tree node.le...
深搜和廣搜的原理及優缺點
深搜,顧名思義,是深入其中 直取結果的一種搜尋方法。如果深搜是乙個人,那麼他的性格一定倔得像頭牛!他從一點出發去旅遊,只朝著乙個方向走,除非路斷了,他絕不改變方向!除非四個方向全都不通或遇到終點,他絕不後退一步!因此,他的姐姐廣搜總是嘲笑他,說他是個一根筋 不撞南牆不回頭的傢伙。深搜很討厭他姐姐的嘲...