➕用Python來實現 Prefix sum 前綴和

閱讀時間約 1 分鐘

定義

Prefix Sum(前綴和)是一種用於計算陣列中任意區間和的高效方法

前綴和算是一種犧牲空間換取時間效能提升的策略。
這在需要頻繁查詢區間和的情況下特別有用。


一開始,初始化時花費O(n)時間,掃描每個元素累加,建立一個prefix sum table
接著,提供query介面,提供使用者查詢任意的區間和,並且能夠在O(1)得到答案


示意圖

raw-image

優點

1.提升區間和查詢效能,可以在O(1)時間內計算並且得到任意區間和。


缺點

1.需要額外花費O(n)空間來建立prefix sum table。

2.事前需要花費O(n)時間掃描每個陣列元素累加,建立prefix sum table。


Prefix Sum的class定義 與 初始化

class PrefixSum:
def __init__(self, arr):

# 建構子
self.prefix_sums = self._compute_prefix_sums(arr)

def _compute_prefix_sums(self, arr):

# 事先花費O(n)時間計算前綴和
prefix_sums = [0 for _ in range(len(arr)) ]

prefix_sums[0] = arr[0]

for i in range(1, len(arr)):
prefix_sums[i] = prefix_sums[i - 1] + arr[i]

return prefix_sums

Prefix Sum常見的操作


1.查詢區間和 range_sum(left, right)


如果left 是零,代表左邊端點是起點,直接返回self.prefix_sums[right]即可。

如果left非零,利用區間和抵銷的觀念,計算

self.prefix_sums[right] - self.prefix_sums[left-1] 得到區間和。


時間複雜度: O(1)

    def range_sum(self, left, right):

if left == 0:
return self.prefix_sums[right]

else:
return self.prefix_sums[right] - self.prefix_sums[left-1]

測試範例

raw-image

完整的Prefix sum實作和程式碼

class PrefixSum:
def __init__(self, arr):
self.prefix_sums = self._compute_prefix_sums(arr)

def _compute_prefix_sums(self, arr):
prefix_sums = [0 for _ in range(len(arr)) ]

prefix_sums[0] = arr[0]

for i in range(1, len(arr)):
prefix_sums[i] = prefix_sums[i - 1] + arr[i]

return prefix_sums

def range_sum(self, left, right):

if left == 0:
return self.prefix_sums[right]

else:
return self.prefix_sums[right] - self.prefix_sums[left-1]

def test():
# Demo
arr = [3, 4, 1, 7, 9, 1]
prefix_sum = PrefixSum(arr)
print("Input array :", arr)
print("Prefix sum :", prefix_sum.prefix_sums)
print("\nSum of range (1, 3):", prefix_sum.range_sum(1, 3))
print("Sum of range (0, 5):", prefix_sum.range_sum(0, 5))


if __name__ == '__main__':
test()

測試輸出

Input array : [3, 4, 1, 7, 9, 1]
Prefix sum : [3, 7, 8, 15, 24, 25]

Sum of range (1, 3): 12
Sum of range (0, 5): 25

結語


其實前綴和就是陣列元素的累加,而區間和就是區間元素的累加
透過事前額外的計算建表,提升run-time 區間和的查詢與計算效能


讀者可以透過紙筆追蹤演算法和程式執行邏輯,測試幾個簡單的小範例,

會有更深刻的了解和體會!


Prefix sum相關的演算法練習題與詳解


前綴和應用: 指定目標值的子陣列數目 Binary Subarrays With Sum_Leetcode #930


前綴和應用: 總和=k的子陣列有幾個 Subarray Sum Equals K_Leetcode #560


合縱連橫: 從區間和應用理解 前綴和 的本質


前綴和應用: 尋找旅途中的海拔最高點_Leetcode #1732 精選75題解析

86會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
二元搜尋樹(Binary Search Tree,簡稱 BST)是一種特殊的二元樹結構, 具有以下特性: 左子樹:左子樹上所有節點的值均小於該節點的值。 右子樹:右子樹上所有節點的值均大於該節點的值。 無重複值:每個節點的值都是唯一的。 這些特性使得二元搜尋樹在搜尋、插入和刪除操作具有較佳的效能。
接著來進入圖論的重點之一,Tree與Binary Tree。 二元樹(Binary Tree)是一種樹狀數據結構,其中每個節點最多有兩個子節點,通常稱為左子節點和右子節點。這些子節點可以是其他節點或空節點(即無子節點)。 二元樹是其他進階樹的基礎,可延伸推廣到Binary Search Tree
今天,我們將用Python list來實現Disjoint Set (併查集,另外也有人稱之為Union-Find)。 Disjoint Set適合用於處理一些子集合的合併和根節點的查找操作。 這種資料結構在圖論中非常有用,特別是在解決連通性相關問題的應用。
在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊。 今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。 讀者可以從中發現,因為python list的功能和function實作已經很豐富, 所以使用起來,相當直覺,也簡單許多。
在這次的BMI(身體質量指標)計算的續集裡,將學會funciton的基本觀念與實作, 把常用的功能包裝成可重複利用的元件: function。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
二元搜尋樹(Binary Search Tree,簡稱 BST)是一種特殊的二元樹結構, 具有以下特性: 左子樹:左子樹上所有節點的值均小於該節點的值。 右子樹:右子樹上所有節點的值均大於該節點的值。 無重複值:每個節點的值都是唯一的。 這些特性使得二元搜尋樹在搜尋、插入和刪除操作具有較佳的效能。
接著來進入圖論的重點之一,Tree與Binary Tree。 二元樹(Binary Tree)是一種樹狀數據結構,其中每個節點最多有兩個子節點,通常稱為左子節點和右子節點。這些子節點可以是其他節點或空節點(即無子節點)。 二元樹是其他進階樹的基礎,可延伸推廣到Binary Search Tree
今天,我們將用Python list來實現Disjoint Set (併查集,另外也有人稱之為Union-Find)。 Disjoint Set適合用於處理一些子集合的合併和根節點的查找操作。 這種資料結構在圖論中非常有用,特別是在解決連通性相關問題的應用。
在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊。 今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。 讀者可以從中發現,因為python list的功能和function實作已經很豐富, 所以使用起來,相當直覺,也簡單許多。
在這次的BMI(身體質量指標)計算的續集裡,將學會funciton的基本觀念與實作, 把常用的功能包裝成可重複利用的元件: function。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
近期幣圈大盤表現不好,BTC 於8/18凌晨直接下殺跌破28,000 的支撐,山寨幣也普遍走弱,在盤勢尚位穩定之前,除了做套利交易,本篇文章也會介紹一個方式,能透過 Bybit 交易所的 0 成本借貸功能,在建立底倉的同時,透過挖礦增加收益。(若還沒有Bybit帳戶的讀者,可以考慮用呢喃
Thumbnail
🌿「他身後不是傳統的北管、南管樂隊,是熱血沸騰的搖滾樂團。」 來賓介紹👏👏👏 -- 劇團主演兼音樂設計 + 劇團第四代接班人:王凱生
Thumbnail
生成以下主题的PPT内容框架,需要包括以下内容:1、每一页的标题2、关键要点3、与本页内容匹配的圈片,需要用Markdown语言生成,不要用反引号,不要用代码框,你需要用Unsplash AP!,遵循以下的格式: https://source.unsplash.com/1600×900/?< PUT
Thumbnail
2022卡達世足賽 即將於年底舉行,已經有不少的 運彩 公司公開 奪冠熱門隊伍 賠率,而這些不同的 世足運彩賠率 也能作為各運彩公司對國家隊分析的依據,無論是否喜歡 運彩投注 ,都可以透過這些數據,解析國外看好的奪冠 世足 球隊是誰,若是感興趣的球迷,千萬不可錯過本屆 世足賽 奪冠賠率哦!
【凱咪最愛】2019眼霜推薦➕分享‼️ MEN'S EYE KIRARA型男眼下專用眼霜 MEN'S EYE KIRARA型男眼下專用眼霜 MEN'S EYE KIRARA型男眼下專用眼霜 進階閱讀
Thumbnail
網路謠言滿天飛,用更客觀的科學知識強身健體吧! 方格子健康月,匯集各大領域的健康保健專題,日常防護、皮膚保養、身體排毒、心理療癒——即刻啟動閱讀,讓你從裡到外補充滿滿能量,照顧好自己的身心靈!4/30前訂閱或購買健康月精選專題,輸入折扣碼health2020,精選專題全面8折起。
Thumbnail
方格子無廣告簡潔的介面非常適合用關燈模式進行閱讀或創作 身為一個宅宅工程師,螢幕打開應該就是要黑黑 der 才算是稱職(?) 方格子的介面因為沒有廣告也夠簡單,因此特別適合用關燈模式進行創作或是閱讀,在 Chrome 上面有許多外掛可以使用,新版的 Chrome 也可以選擇黑暗模式
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
近期幣圈大盤表現不好,BTC 於8/18凌晨直接下殺跌破28,000 的支撐,山寨幣也普遍走弱,在盤勢尚位穩定之前,除了做套利交易,本篇文章也會介紹一個方式,能透過 Bybit 交易所的 0 成本借貸功能,在建立底倉的同時,透過挖礦增加收益。(若還沒有Bybit帳戶的讀者,可以考慮用呢喃
Thumbnail
🌿「他身後不是傳統的北管、南管樂隊,是熱血沸騰的搖滾樂團。」 來賓介紹👏👏👏 -- 劇團主演兼音樂設計 + 劇團第四代接班人:王凱生
Thumbnail
生成以下主题的PPT内容框架,需要包括以下内容:1、每一页的标题2、关键要点3、与本页内容匹配的圈片,需要用Markdown语言生成,不要用反引号,不要用代码框,你需要用Unsplash AP!,遵循以下的格式: https://source.unsplash.com/1600×900/?< PUT
Thumbnail
2022卡達世足賽 即將於年底舉行,已經有不少的 運彩 公司公開 奪冠熱門隊伍 賠率,而這些不同的 世足運彩賠率 也能作為各運彩公司對國家隊分析的依據,無論是否喜歡 運彩投注 ,都可以透過這些數據,解析國外看好的奪冠 世足 球隊是誰,若是感興趣的球迷,千萬不可錯過本屆 世足賽 奪冠賠率哦!
【凱咪最愛】2019眼霜推薦➕分享‼️ MEN'S EYE KIRARA型男眼下專用眼霜 MEN'S EYE KIRARA型男眼下專用眼霜 MEN'S EYE KIRARA型男眼下專用眼霜 進階閱讀
Thumbnail
網路謠言滿天飛,用更客觀的科學知識強身健體吧! 方格子健康月,匯集各大領域的健康保健專題,日常防護、皮膚保養、身體排毒、心理療癒——即刻啟動閱讀,讓你從裡到外補充滿滿能量,照顧好自己的身心靈!4/30前訂閱或購買健康月精選專題,輸入折扣碼health2020,精選專題全面8折起。
Thumbnail
方格子無廣告簡潔的介面非常適合用關燈模式進行閱讀或創作 身為一個宅宅工程師,螢幕打開應該就是要黑黑 der 才算是稱職(?) 方格子的介面因為沒有廣告也夠簡單,因此特別適合用關燈模式進行創作或是閱讀,在 Chrome 上面有許多外掛可以使用,新版的 Chrome 也可以選擇黑暗模式