Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรม Python หาผลรวมสูงสุดของ Subarray ด้วย Divide and Conquer

โจทย์ Maximum Subarray Problem: หา Subarray ต่อเนื่องที่มีผลรวมสูงสุด ใช้วิธี Divide and Conquer (แบ่งแยกและเอาชนะ)

ตัวอย่างโค้ด

def max_crossing_sum(my_array, low, mid, high):
    sum_elements = 0
    sum_left_elements = -10000
    for i in range(mid, low-1, -1):
        sum_elements = sum_elements + my_array[i]
        if (sum_elements > sum_left_elements):
            sum_left_elements = sum_elements
    sum_elements = 0
    sum_right_elements = -1000
    for i in range(mid + 1, high + 1):
        sum_elements = sum_elements + my_array[i]
        if (sum_elements > sum_right_elements):
            sum_right_elements = sum_elements
    return max(sum_left_elements + sum_right_elements, sum_left_elements, sum_right_elements)

def max_sub_array_sum(my_array, low, high):
    if (low == high):
        return my_array[low]
    mid = (low + high) // 2
    return max(max_sub_array_sum(my_array, low, mid),
               max_sub_array_sum(my_array, mid+1, high),
               max_crossing_sum(my_array, low, mid, high))

my_list = [23, 12, 45, 67, 89, 11]
list_length = len(my_list)
print("The list is :")
print(my_list)
max_sum = max_sub_array_sum(my_list, 0, list_length-1)
print("The maximum contiguous sum is ")
print(max_sum)

ผลลัพธ์

The list is : [23, 12, 45, 67, 89, 11]
The maximum contiguous sum is 247

คำอธิบาย

  • max_crossing_sum: หาผลรวมข้ามจุดกลาง (crossing midpoint)
  • max_sub_array_sum: ฟังก์ชันหลักแบ่งครึ่งอาร์เรย์เรียกซ้ำ (recursive)
  • รวมผลลัพธ์จากซ้าย, ขวา, และข้ามกลาง แล้วหาค่าสูงสุด