lrj
lrjlr
j老師給我們三種解決辦法,對於乙個節點的查重。
這裡拿八數碼問題中的狀態查重來介紹:
陣列表示了當前狀態。
將排列變成整數:設計一套排列的編碼和解碼,把0−8
0-80−
8的全排列和0
−362879
0-362879
0−3628
79的整數一一對應。
然而具體實現的對應並沒有看懂。
int vis[
362880
],fact[9]
;void
init_lookup_table()
inttry_to_insert
(int s)
if(vis[code]
)return0;
return vis[code]=1
;}
雜湊技術:將結點變成整數,並對映到乙個區間內,如果雜湊相同的就插入乙個鍊錶中。
查詢的時候在雜湊值對應的鍊錶中查詢。(這個方法最佳/不過鍊錶可能很長,要求雜湊函式足夠優秀,區間長度也最好是大素數)
const
int hashsize =
1000003
;int head[hashsize]
,next[maxstate]
;void
init_lookup_table()
inthash
(state& s)
inttry_to_insert
(int s)
next[s]
=head[h]
; head[h]
=s;return1;
}
可以使用map
,set
map,set
map,se
t直接記錄狀態,或者將狀態暴力轉換成數(可以存lon
glon
glong long
longlo
ng)最後查詢判斷即可。
關於Hash雜湊的集中查重方式
這裡總結一下hash雜湊當出現不能插入位置的幾種位移和計算方式,以免遺忘和出現不知道都在講些神馬 當我們key1和key2衝突的時候,主要有三種方式進行衝突解決 先來說兩種開放定址法,所謂開放定址法就是重新計算了hash值 1.線性探查法 當我們插入key的位置,產生衝突之後,加1,檢視該位置是否可...
關於Hash雜湊的集中查重方式
這裡總結一下hash雜湊當出現不能插入位置的幾種位移和計算方式,以免遺忘和出現不知道都在講些神馬 當我們key1和key2衝突的時候,主要有三種方式進行衝突解決 先來說兩種開放定址法,所謂開放定址法就是重新計算了hash值 1.線性探查法 當我們插入key的位置,產生衝突之後,加1,檢視該位置是否可...
鍊錶的中間結點問題
因為鍊錶的特殊性 鍊錶不能通過下標訪問對應的元素 所以要採用特殊的辦法進行處理 1 通過將鍊錶內容新增到陣列中,轉為處理陣列問題 class solution def middlenode self,head listnode listnode a head while a 1 next a 1 表...