資料結構 哨兵作用

2022-09-18 19:45:10 字數 1132 閱讀 9123

應用:假設乙個亂序陣列,需要查詢乙個元素是否在該陣列中,這時需要用到順序查詢,也就是遍歷陣列。

一般情況下我們會寫下如下**:

[cpp]view

plain

copy

print

?int

sequential_search(

int*a,

intn,

intkey)  

return

0;//查詢失敗

}  有的資料結構書上,會運用哨兵元素,改成這樣的**:

[cpp]view

plain

copy

print

?int

sequential_search2(

int*a 

intn,

intkey)  

return

i;//返回0就是查詢失敗

}  仔細看來沒有什麼差別,但是來看下我測試的執行時間,陣列有10億個元素。

方案1:3.494s   3.202s   3.216s   3.237s

方案2:2.332s   2.307s   2.24s   2.194s

為什麼基本一樣的**,方案2比方案1效能提公升了30%~40%左右???

迴圈中,方案1有3條指令而方案2有兩條指令,少了i以上思想和**來自於《大話資料結構》中的296頁,測試實驗是我做的。

大話資料結構的原文「這種查詢方法在查詢方向的盡頭設定哨兵元素,免去了查詢過程中每次比較後都要判斷查詢位置是否越界的小技巧,看似與原先差別不大,但是總資料較多時,效率提高很明顯,是非常好的程式設計技巧。當然,「哨兵」也不一定在陣列開始,也可以再末尾」

我的測試程式:

[cpp]view

plain

copy

print

?void

main()   

}  else

}  finish=clock();  

double

total_time = (

double

)(finish-start) / clocks_per_sec;   

cout<}  

資料結構與演算法 哨兵

這裡說的哨兵,是指對異常場景處理的一種優化。現對兩種陣列結構運用場景舉例 1.陣列 對乙個無重複資料的陣列中查詢已知值的位置。void findbykey char a,int n,int key int i 0 for a i key i if i n 1 return 1 return i 可改...

演算法 資料結構 鍊錶和哨兵節點

鍊錶是一種基礎的資料結構,但對於一些初學者來說,實現乙個鍊錶還是比較困難的,許多操作作用在頭部或尾部時需要特殊處理。比如下面這段 template typename t void linkedlist remove linkedlistnode node 上述 進行了兩次的空值判斷,有可能會更新煉表...

資料結構中頭結點的作用

資料結構中,在單鏈表的開始結點之前附設乙個型別相同的結點,稱之為頭結點。頭結點的資料域可以不儲存任何資訊,頭結點的指標域儲存指向開始結點的指標 即第乙個元素結點的儲存位置 作用1 防止單鏈表是空的而設的,當鍊表為空的時候,帶頭結點的頭指標就指向頭結點,如果當鍊表為空的時候,單鏈表沒有帶頭結點,那麼它...