อาร์เรย์ ผลรวมคำนำหน้า จัดเก็บผลรวมสะสม เพื่อให้ ผลรวมช่วง ใดๆ ตอบได้ใน O(1) หลังจากการประมวลผลก่อนล่วง O(n) — แทนที่จะเป็น O(n) ต่อการค้นหา
แนวคิด
ให้ เป็นผลรวมของ องค์ประกอบแรก จากนั้นผลรวมของ คือ
อาร์เรย์ ผลรวมคำนำหน้า จัดเก็บผลรวมสะสม เพื่อให้ ผลรวมช่วง ใดๆ ตอบได้ใน O(1) หลังจากการประมวลผลก่อนล่วง O(n) — แทนที่จะเป็น O(n) ต่อการค้นหา
ให้ เป็นผลรวมของ องค์ประกอบแรก จากนั้นผลรวมของ คือ
prefix[i]iarr[l..r]prefix[r+1] - prefix[l]def build_prefix(arr):
prefix = [0] * (len(arr) + 1)
for i, x in enumerate(arr):
prefix[i + 1] = prefix[i] + x # running total
return prefix
def range_sum(prefix, l, r): # inclusive l..r
return prefix[r + 1] - prefix[l] # O(1)
p = build_prefix([2, 4, 1, 3, 5])
range_sum(p, 1, 3) # 4+1+3 -> 8
arr = [2, 4, 1, 3, 5]
prefix = [0, 2, 6, 7, 10, 15]
sum(1..3) = prefix[4] - prefix[1] = 10 - 2 = 8
เหมาะสำหรับ หลายการค้นหาผลรวมช่วง บนข้อมูลแบบสถิต รูปแบบต่างๆ: ผลรวมคำนำหน้า 2D สำหรับผลรวมเมทริกซ์ย่อย XOR คำนำหน้า และอาร์เรย์ความแตกต่างสำหรับการอัปเดตช่วง หากอาร์เรย์มีการเปลี่ยนแปลงบ่อย ให้ใช้ Fenwick/segment tree แทน ระวังค่า offset ของดัชนี (ขนาด n+1)
ผลรวมคำนำหน้าเปลี่ยนการค้นหาช่วง O(n) ที่ซ้ำๆ เป็นการค้นหา O(1) — ชัยชนะครั้งใหญ่เมื่อการค้นหามีความถี่สูง
รูปแบบการคำนวณล่วงหน้าครั้งเดียวและตอบรับอย่างรวดเร็ว ทั่วไปไปยังหลายงานการประมวลผลข้อมูล
เป็นเสาหลักของการเขียนโปรแกรมเชิงการแข่งขันและบล็อกการสร้างทั่วไปในการวิเคราะห์
คลังคำถามสัมภาษณ์งาน IT พร้อมคำตอบโดยละเอียด — ตั้งแต่ระดับ Junior ถึง Senior
บริจาค