- 算法訓練營:海量圖解+競賽刷題(進階篇)
- 陳小玉
- 440字
- 2024-01-22 18:54:29
第2章 區(qū)間信息維護與查詢
2.1 倍增、ST、RMQ
原理1 倍增
任意整數(shù)均可被表示成若干個2的次冪項之和。例如整數(shù)5,其二進制表示為101,該二進制數(shù)從右向左第0、2位均為1,則5=22+20;整數(shù)26,其二進制表示為11010,該二進制數(shù)從右向左第1、3、4位均為1,則26=24+23+21。也就是說,2的次冪項可被拼成任一需要的值。
倍增,顧名思義就是成倍增加。若問題的狀態(tài)空間特別大,則一步步遞推的算法復雜度太高,可以通過倍增思想,只考察2的整數(shù)次冪位置,快速縮小求解范圍,直到找到解。
例如在一棵樹中,每一個節(jié)點的祖先都比該節(jié)點大,要查找4的祖先中等于x的祖先節(jié)點。最笨的辦法就是一個一個地向上比較祖先節(jié)點,判斷哪一個等于x。若樹特別大,則搜索效率很低。雖然祖先是有序的,但不是按順序存儲的,無法得到中間節(jié)點的下標,因此不可以采用普通的二分搜索,這時怎么辦呢?答案是采用倍增思想:將x和當前節(jié)點向上2i個節(jié)點進行比較,若x大于該節(jié)點,則向上跳2i個節(jié)點,加大增量2i+1,繼續(xù)比較;若x小于該節(jié)點,則減少增量2i-1,繼續(xù)比較,直到相等,返回查找成功;或者增量減為20仍不相等,返回查找失敗。

推薦閱讀
- 數(shù)據(jù)庫基礎教程(SQL Server平臺)
- 大規(guī)模數(shù)據(jù)分析和建模:基于Spark與R
- Python絕技:運用Python成為頂級數(shù)據(jù)工程師
- 大數(shù)據(jù)可視化
- 文本挖掘:基于R語言的整潔工具
- 數(shù)據(jù)結構與算法(C語言版)
- 3D計算機視覺:原理、算法及應用
- 數(shù)據(jù)革命:大數(shù)據(jù)價值實現(xiàn)方法、技術與案例
- 軟件成本度量國家標準實施指南:理論、方法與實踐
- 區(qū)塊鏈技術應用與實踐案例
- MySQL技術內幕:SQL編程
- SAS金融數(shù)據(jù)挖掘與建模:系統(tǒng)方法與案例解析
- Web Services Testing with soapUI
- 云計算寶典:技術與實踐
- 數(shù)據(jù)分析思維:產(chǎn)品經(jīng)理的成長筆記