知識點 2 6 倍增思想

2022-04-30 19:30:10 字數 1583 閱讀 7142

總目錄 > 2 演算法基礎 > 2.6 倍增思想

前言

倍增通常和二分一起介紹,共同點在於——它們都能神奇地將原本複雜度為 n 的過程下降到 log n,對於大型資料而言,這種效率的提高是顯而易見的。

子目錄列表

1、二進位制與倍增

2、例題

3、應用

2.6 倍增思想

1、二進位制與倍增

眾所周知,二進位制與十進位制轉換關係:o = 2 ^ a * + 2 ^ b + ... + 2 ^ i,比如 77 = 2 ^ 6 + 2 ^ 3 + 2 ^ 2 + 2 ^ 0,則其二進位制表示為 1001101。換言之,任何乙個整數都可以由若干個係數為 1,x 為 2 的 2 次方冪的和組成。

所以尤記得小學時有個比較經典的問題:

如何用盡可能少的砝碼稱量出 [1, 30] 之間的所有重量?(天平左側放物品右側放砝碼)

根據上述原理,則只需要 1, 2, 4, 8, 16 五個重量級的砝碼即可,能夠組成 [1, 30] 之間的任意數。

如果修改成 [1, 60] 呢?多乙個 32 即可;

如果修改成 [1, 21647483647] 呢?則再加上 2 ^ 6, 2 ^ 7, ..., 2 ^ 30,總共也只需要 31 個砝碼。

注意到,我們將這個看似巨大的數字,通過這個思路,很輕鬆地就得到了log n級別的乙個結果。而倍增思想,字面意思就是翻倍,其實就是建立在二進位制和十進位制這個關係上的。

2、例題

給出乙個長度為 n 的環和乙個常數 k,每次可以從第 i 個點跳到第 (i + k) mod (n + 1) 個點,總共跳 m 次。第 i 個點的權值為 a[i],求 m 次跳躍的起點的權值之和 mod 1e9 + 7。

(原題面沒有給出初始位置?)

強調一下資料範圍:m <= 1e18,也就是說我們不可能對於每一次跳躍都記錄位置。由於只需要知道 m 次跳躍的權值和,過程其實並不重要,那麼就可以採用倍增的方式。

假設 n = 5, m = 29,將環拆成線性的。下圖為跳躍**:

選擇在終點之前最遠的跳躍方式:從第 1 個位置跳到第 9 個位置。

從第 9 個位置跳到第 13 個位置。

最後從第 13 個位置跳到第 14 個位置,圖略。

**略。

3、應用

倍增思想最常見的應用:快速冪,lca 和 rmq 問題等等。

快速冪請參見:6.2 快速冪

倍增 lca請參見:《施工中》

rmq 問題請參見:《施工中》

2022 2 25 倍增思想和ST表

倍增 將線性級轉換成對數級,降低時間複雜度 只考慮二的整數冪次,縮小查詢範圍。運用 1.快速冪 算n的m次方,log n 遞推法 int ans 1 while n 2.rmq問題 n個數字m次詢問,每次 l,r 中最大值 運用st表,預處理 o nlogn 查詢o 1 想法是將每次要查詢的區間的最...

3月26日知識點梳理

1 元素型別分類 塊狀元素 內聯元素 可變元素 內聯塊元素放在內聯這一類裡面 2 每類元素各自的特點 3 每個標籤屬於哪一類!4 元素型別的轉換 display屬性 block inline none css的顯示對標籤分類 塊狀元素 內聯元素 行內元素 爭議點 第三類 a 可變元素 b 行內塊元素...

程式設計思想 設計模式 設計模式知識點彙總

這裡彙總了設計模式的全部知識點,大家可以對照此圖乙個個去學習 關於設計模式總共有多少種,這個是沒有具體標準的,因為有些模式應用情景比較少,有些模式之間原理相似,有些模式又可以有多種實現方式,可能會演變成其它名稱的設計模式 設計模式之間是沒有明顯界限的,重點在於理解每個設計模式的核心思想,然後自己靈活...