Tối đa subarray brute force Python

Trong bài viết này, chúng ta sẽ tìm hiểu thuật toán kadane là gì và tính chất giải bài toán của nó để giải bài toán “Tổng phân đoạn lớn nhất”. Chúng ta sẽ xem qua thuật toán và mã python cùng với ví dụ và đầu ra tương ứng của nó. Cuối cùng, chúng ta sẽ nghiên cứu độ phức tạp về thời gian của thuật toán và ứng dụng thực tế của thuật toán kadane. Vậy hãy bắt đầu

Thuật toán của Kadane là gì?

Thuật toán Kadane là một trong những cách tiếp cận nổi tiếng để giải bài toán bằng quy hoạch động. Như chúng ta đã biết, bài toán cực đại mảng con là một trong những bài toán nổi tiếng trong lĩnh vực quy hoạch động. Chắc hẳn bạn đang nghĩ bài toán có vẻ dễ và kết quả của bài toán sẽ là tổng của tất cả các phần tử trong một mảng. Nhưng điều này là không chính xác. Trong mảng sẽ có các phần tử nguyên âm có thể làm giảm tổng của cả mảng. Do đó, để giải quyết vấn đề này, chúng ta sẽ sử dụng thuật toán kadane

Ở đây thuật toán sẽ tìm mảng con liên tục trong mảng số nguyên 1D có tổng lớn nhất có thể. Cách tiếp cận đầu tiên cho mọi người sau khi hiểu được tuyên bố vấn đề sẽ là áp dụng cách tiếp cận vũ phu và giải quyết vấn đề. Nhưng làm như vậy, độ phức tạp thời gian của giải pháp sẽ là O(n2), điều này không tốt lắm. Do đó, chúng tôi sẽ áp dụng thuật toán của kadane để giải quyết vấn đề bằng cách duyệt qua toàn bộ mảng bằng hai biến để theo dõi tổng cho đến nay và tổng tối đa. Điều quan trọng nhất cần chú ý khi sử dụng thuật toán này là điều kiện sử dụng mà chúng tôi sẽ cập nhật cả hai biến

Thuật toán cho Tổng phân đoạn tối đa

  1. Đang khởi tạo max_till_now = 0
  2. Đang khởi tạo max_ending = 0
  3. Lặp lại các bước từ 4 đến 6 cho mọi phần tử trong mảng
  4. Đặt max_ending = max_ending + a[i]
  5. nếu (max_ending <0) thì đặt max_ending = 0
  6. nếu (max_till_now < max_ending) thì đặt max_till_now = max_ending
  7. trả về max_till_now

Trong thuật toán trên, max_ending được sử dụng để tìm tất cả các phần tử dương của mảng và max_till_now được sử dụng để tìm tổng các phần tử lớn nhất trong số tất cả các phân đoạn dương. Do đó, mỗi lần chúng tôi nhận được tổng dương trong khi so sánh với max_till_now, chúng tôi sẽ cập nhật nó với tổng lớn hơn

Do đó, khi max_ending trở thành âm, chúng tôi đặt nó thành 0 và ở mỗi lần lặp lại, chúng tôi kiểm tra max_till_now < max_ending để cập nhật max_till_now nếu điều kiện trả về đúng

Thí dụ

Xét mảng số nguyên sau

 

Tối đa subarray brute force Python

Đang khởi tạo max_till_now = 0 và max_ending = 0 (i = 0)

 

Tối đa subarray brute force Python

 

Bây giờ, với i = 1, chúng tôi nhận được max_till_now = 0 và max_ending = 0 nhưng với i = 2 max_till_now = 4 và max_ending = 4

Tối đa subarray brute force Python

 

Bây giờ i = 3, i = 4, chúng ta lần lượt có max_till_now = 4 và max_ending = 3, max_till_now = 4 và max_ending = 1

Tối đa subarray brute force Python

 

Bây giờ, khi i = 5, chúng tôi nhận được max_till_now = 6 (6>4) và max_ending = 6

Tối đa subarray brute force Python

 

Và khi i = 6, chúng ta nhận được max_till_now = 6 và max_ending = 3

Tối đa subarray brute force Python

Do đó, từ ví dụ trên, ta tìm được mảng con lớn nhất là từ i = 2 đến i = 5 và tổng lớn nhất là 6

Mã Python cho thuật toán của Kadane

Dưới đây là mã python cho thuật toán của kadane

def maxSubArraySum(arr,size):
    
    max_till_now = arr[0]
    max_ending = 0
    
    for i in range(0, size):
        max_ending = max_ending + arr[i]
        if max_ending < 0:
            max_ending = 0
        
        
        elif (max_till_now < max_ending):
            max_till_now = max_ending
            
    return max_till_now

arr = [-2, -3, 4, -1, -2, 5, -3]
print("Maximum Sub Array Sum Is" , maxSubArraySum(arr,len(arr)))

 

đầu ra

Đầu ra của đoạn mã trên sẽ như dưới đây

Tổng mảng phụ tối đa là 6

Thời gian phức tạp

Độ phức tạp về thời gian của thuật toán kadane cho một mảng chứa n phần tử nguyên là O(n) vì chỉ có một vòng lặp for được thực hiện trong suốt chương trình. Tương tự, độ phức tạp không gian phụ của thuật toán là O(1)

Các ứng dụng

Có rất nhiều ứng dụng của thuật toán kadane và một số trong số chúng được đề cập dưới đây

  • Tìm tổng mảng con tối đa cho một mảng số nguyên đã cho
  • Được sử dụng như một thuật toán xử lý hình ảnh
  • Nó có thể được sử dụng để giải quyết các vấn đề như “Trạm di chuyển theo thứ tự” và “Khách sạn dọc theo bờ biển”
  • Nó được sử dụng để phân tích kinh doanh

Phần kết luận

Do đó, từ phát biểu bài toán tìm tổng mảng con lớn nhất, giải pháp có vẻ không dễ dàng như vậy nhưng bằng cách sử dụng thuật toán của kadane, chúng tôi đã đơn giản hóa nó và đạt được giải pháp với độ phức tạp về thời gian ít nhất. Điều này có thể thực hiện được vì thuật toán của kadane sử dụng kỹ thuật thu thập thông tin cần thiết để đạt được giải pháp tránh lưu trữ dữ liệu không cần thiết và do đó, thuật toán này có thể được coi là một ví dụ đơn giản về phương pháp lập trình động với nhiều ứng dụng thực tế trong thực tế. .