簡體   English   中英

使用分而治之范式提高算法效率

[英]Increasing algorithm efficiency using divide and conquer paradigm

我想在數組中找到最小和最大整數。 我相對無效的方法是將第一個整數考慮為max \\ min。 然后,我將其與其他整數進行比較,如果將較大/較小的整數與當前的最小或最大整數進行比較,則將其替換。 這一直進行到數組末尾。 根據我的計算,復雜度(基於最壞的情況)為n -1(n是數組的大小)。 我的問題是我如何使用分而治之的范式來提高效率? 我已經嘗試過將數組分為兩個部分,然后對兩個部分執行與上述相同的算法,盡管這只會使所有效率降低? 根據我的計算,復雜度變為n + 1。

我會認為您正在使用一個線程

如果數組未排序,則復雜度將始終為O(n) 但是,我認為您應該檢查是否只需要最大數量? 或第二個最大值,以及第三個最大值..

如果是這樣,您最好構建一個最大堆(對應情況下的最小堆),這需要O(nlogn)時間,然后只需檢查一下堆的窺視即可。

為了識別n元素的最大值,算法必須從比較中獲得足夠的信息。 假設最大值為array[i] ,則必須將array[i]array[0], ... array[i-1], array[i+1], ... array[n-1]進行比較為了證明array[i]是最大的。 因此,為了找到最大值,所需的最小比較數為n - 1比較。 為什么? 因為數組中有n元素,所以算法必須從比較中獲取足夠的信息才能找到最大值。


Python中的示例代碼

# Divide-and-Conquer find max of alist
def dc_max(alist, start, end): # first call with start=0, end=len(alist)
    if end - start == 1: # base case: list of 1 element
        return alist[start]
    mid = (start + end) // 2
    x = dc_max(alist, start, mid)
    y = dc_max(alist, mid, end)
    if x > y:
        return x
    return y

# Iterative find max of alist
def it_max(alist):
    current = alist[0]
    for i in range(1, len(alist)):
        if i > current:
            current = i
    return current

兩種算法都精確地進行n - 1比較,並且都在原位,因此它們都具有Θ(n)時間復雜度和O(1)空間復雜度。


現在,性能取決於您的系統。 請參閱遞歸比循環快嗎?

在我的情況下,使用遞歸方法查找2**20數字的最大值需要657毫秒 ,而使用迭代方法則需要111毫秒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM