」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我們如何在 O(n) 時間和 O(1) 空間內找到從 0 到 n-1 的數字數組中的重複項?

我們如何在 O(n) 時間和 O(1) 空間內找到從 0 到 n-1 的數字數組中的重複項?

發佈於2024-11-08
瀏覽:828

How can we find duplicates in an array of numbers from 0 to n-1 in O(n) time and O(1) space?

在O(n) 時間和O(1) 空間中尋找重複項:深入解釋

提出的問題涉及識別重複項數組中包含0 到n-1 範圍內的數字的元素。挑戰在於如何在 O(n) 時間複雜度內並僅使用恆定 (O(1)) 記憶體空間有效地實現這一目標。

所提出的解決方案採用了一種巧妙的技術,不需要哈希表或其他附加資料結構。相反,它利用數組本身中的值來識別和標記重複元素。

  1. 排列數組:

    內部循環排列基於以下邏輯的數組:

    while A[A[i]] != A[i]
        swap(A[i], A[A[i]])
    end while

    此排列步驟可確保如果陣列中存在元素 x,則其至少一個實例將位於 A[x]。這對於後續步驟至關重要。

  2. 識別重複項:

    外循環檢查每個元素A[i]:

    for i := 0 to n - 1
        if A[i] != i then
            print A[i]
        end if
    end for

    如果 A[i] != i,則表示 i 沒有出現在陣列中正確的位置。因此,它是一個重複元素,並且被印製。

  3. 時間複雜度分析:

    此技術運行時間為 O(n) 時間。巢狀循環有一個迭代 n 次的外循環和一個最多執行 n - 1 次迭代的內循環(因為每次交換都會使一個元素更接近其正確位置)。因此,迭代總數以n*(n - 1) 為界,即O(n^2),但可以簡化為O(n),因為n*(n - 1) = n^2 - n = n(n - 1) = n*n - n

  4. 空間複雜度分析:

    此演算法僅使用恆定空間,與輸入的大小無關。關鍵的見解是用於排列的空間已經存在於輸入數組中。不需要額外的儲存結構。

  5. 附加說明:

    • 附加說明:
    [演算法假設陣列包含從0到n的整數- 1.
即使存在重複項,時間複雜度也保持不變。

How can we find duplicates in an array of numbers from 0 to n-1 in O(n) time and O(1) space? 
此演算法對於小數據是有效的到中等大小的陣列。對於大型數組,使用哈希表等資料結構的替代方法可能更合適。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3