應用:假設乙個亂序陣列,需要查詢乙個元素是否在該陣列中,這時需要用到順序查詢,也就是遍歷陣列。
一般情況下我們會寫下如下**:
[cpp]view
plain
copy
?int
sequential_search(
int*a,
intn,
intkey)
return
0;//查詢失敗
} 有的資料結構書上,會運用哨兵元素,改成這樣的**:
[cpp]view
plain
copy
?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
?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 防止單鏈表是空的而設的,當鍊表為空的時候,帶頭結點的頭指標就指向頭結點,如果當鍊表為空的時候,單鏈表沒有帶頭結點,那麼它...