狀態結點查重的問題

2021-09-24 09:54:08 字數 1034 閱讀 7834

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 表...