Maximum Subarray Sum with Kadane's Algorithm in Python
Find the run of numbers with the largest sum in one pass, even when the list has negative values.
- The best sum ending at each position
- Starting fresh when the running sum hurts
- O(n) time and O(1) memory
Extend the run or start again
โจทย์ช่วงย่อยที่ผลรวมมากที่สุด (maximum subarray) คือการหาช่วงสมาชิกที่ติดกันซึ่งมีผลรวมมากที่สุดในลิสต์ที่มีทั้งเลขบวกและเลขลบ อัลกอริทึมของ Kadane แก้โจทย์นี้ได้อย่างมีประสิทธิภาพ โดยจำผลรวมที่ดีที่สุดของช่วงที่จบที่ตำแหน่งปัจจุบัน
ประเด็นสำคัญ
- current =
max(value, current + value): keep the run only if it helps. - best =
max(best, current)remembers the best run so far. - Start both from the first value so all-negative lists work.
ใช้เมื่อไร?
- ฝึกคิดอย่างเป็นระบบและเข้าใจการทำงานของอัลกอริทึมทีละขั้น
- เลือกวิธีที่เหมาะสมเมื่อต้องจัดการข้อมูลจำนวนมากหรือทำให้โปรแกรมเร็วขึ้น
- เตรียมตัวสำหรับการสอบ แบบฝึกหัด และการสัมภาษณ์งานเขียนโปรแกรม
โค้ดตัวอย่าง
def maximum_subarray_sum(values):
current = best = values[0]
for value in values[1:]:
current = max(value, current + value)
best = max(best, current)
return best
print(maximum_subarray_sum([-2, 1, -3, 4, -1, 2, 1, -5, 4]))
ผลลัพธ์จากการรัน
6
อธิบายโค้ด
สำหรับแต่ละสมาชิก ตัวแปร current เลือกระหว่างสองทาง คือเริ่มช่วงใหม่ที่สมาชิกนี้ หรือต่อช่วงเดิมด้วย current + value ตัวแปร best เก็บผลรวมที่มากที่สุดที่เคยเจอ จากข้อมูลตัวอย่าง ช่วง [4, -1, 2, 1] ให้ผลรวมมากที่สุดคือ 6 อัลกอริทึมทำงานใน O(n) และใช้หน่วยความจำเพียง O(1)
เปลี่ยนค่าและรันโปรแกรมด้วย คอมไพเลอร์ Python ออนไลน์ของ CodeUtility โดยไม่ต้องติดตั้ง Python
แบบฝึกหัดเพิ่มเติม
ลองแก้โค้ดตามคำแนะนำด้านล่าง การเปลี่ยนโค้ดแล้วดูผลลัพธ์จะช่วยให้เข้าใจบทเรียนได้ดีกว่าการอ่านอย่างเดียวมาก
- ทดสอบกับลิสต์ว่าง ลิสต์ที่มีสมาชิกตัวเดียว และลิสต์ที่มีค่าซ้ำ
- แสดงสถานะหลังแต่ละขั้นเพื่อดูการทำงานของอัลกอริทึม
- จับเวลาการทำงานกับข้อมูล 100, 1,000 และ 10,000 ตัว แล้วเทียบกับวิธีอื่น
ฝึกด้วยโจทย์
ใช้สิ่งที่เรียนในบทนี้แก้ปัญหาจริง ทุกโจทย์รันในเบราว์เซอร์ พร้อมการทดสอบทันทีและรีวิวจาก AI
- Sliding Window Maximum Report the maximum of every window of k numbers. ยาก
- Largest Adjacent-Digit Product Take every contiguous window of span digits and multiply its digits. ปานกลาง