簡體   English   中英

算法反轉次數(Python)

[英]Algorithm Number of Inversions (Python)

我正在嘗試為Coursera上的加州大學聖地亞哥分校提供的算法工具箱完成代碼分配。 分配要求您使用合並排序算法的變體來計算數字序列中的求反數。 為了更好地描述問題:

https://i.stack.imgur.com/CCBU8.jpg

我使用了合並排序算法的一種變體,但得到的答案不正確,並且坦率地說被卡住了。

值得注意的是,在解釋我嘗試過的內容之前,這段代碼涉及到遞歸,我承認我很難理解。

在通常的調試之外,我試圖將我的代碼與已知的解決方案進行比較,以查看可能出問題的地方。 我可以提交這些作為我的解決方案,但是就我所擔心的那是個騙子,我想知道我的代碼出了什么問題(老實說,這讓我發瘋了)。

#Uses python3
import sys

def merge_sort(A):
    if len(A) <= 1:
        return A, 0    
    else:
        middle = (len(A)//2)
        left, count_left = merge_sort(A[:middle])
        right, count_right = merge_sort(A[middle:])
        result, count_result = merge(left,right)
        return result, (count_left + count_right + count_result)

def merge(a,b):
    result = []
    count = 0
    while len(a) > 0 and len(b) > 0:
        if a[0] < b[0]:
            result.append(a[0])
            a.remove(a[0])
        else:
            #count = count + (len(a) - 1)
            result.append(b[0])
            b.remove(b[0])
            count += (len(a) - 1) #this is the important line
    if len(a) == 0:
        result = result + b
    else:
        result = result + a
    return result, count 

if __name__ == '__main__':
    input = sys.stdin.read()
    n, *a = list(map(int, input.split()))
    c = n * [0]
    array, inversion = merge_sort(a)
    print(array)
    print(inversion)

下面列出了我在測試中一直使用的兩個示例輸入:

# ex 1:
3
3 1 2

請注意,第一個數字是序列中的值的數量(對於平地機是必需的)。 求反演的答案是2。我的代碼得到0。

# ex 2:
6
3 1 9 3 2 1

求反演的答案是9。我得到4。

兩項更正:

if a[0] <= b[0]:請注意,許多Internet示例和課程都忽略or equal情況,從而破壞了算法的內在穩定性,此情況對於正確的Inv。計數也很重要)

count += len(a) -我們需要考慮到當前ba形式反轉中的所有項

def merge(a,b):
    result = []
    count = 0
    while len(a) > 0 and len(b) > 0:
        if a[0] <= b[0]:   
            result.append(a[0])
            a.remove(a[0])
        else:
            result.append(b[0])
            b.remove(b[0])
            count += len(a)
    if len(a) == 0:
        result = result + b
    else:
        result = result + a
    return result, count

暫無
暫無

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

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