簡體   English   中英

在排序數組中插入的攤銷時間為O(n),刪除時間為O(1)?

[英]Amortized time of insertion in sorted array is O(n) and deletion is O(1)?

我正在學習如何分析算法,並且發現了“攤銷時間”的表示法。 我發現了一些預定義的估算值,例如:

-在排序數組中插入的攤銷時間為:O(n)

從排序數組中刪除的攤銷時間為:O(1)

任何人都可以向我詳細解釋!

這個想法是要與數組中的每個條目關聯一個稱為deleted的布爾值。 刪除項目包括將deleted設置為true。 當刪除的項目太多時,將其壓縮。 如果將壓縮閾值設置為總大小的一小部分,則可以從達到壓縮點所需的所有刪除中為壓縮支付費用。

這是草圖。 它不完整,但演示了插入和刪除算法。

class sorted_array
{
public:
    typedef std::vector<std::pair<int, bool>>::iterator iterator;

    iterator insert(int value)
    {
        auto item = std::make_pair(value, false);
        return vec.insert(std::lower_bound(vec.begin(), vec.end(), item), item);
    }

    void erase(iterator pos)
    {
        pos->second = true; // deleted = true
        deleted_count++;
        if (deleted_count * 2 > vec.size())
        {
           vec.erase(std::remove_if(vec.begin(), vec.end(),
                                    std::get<1, int, bool>), vec.end());
           deleted_count = 0;
        }
    }

private:
    size_t deleted_count = 0;
    std::vector<std::pair<int, bool>> vec;
}

插入通常是O(n)。 插入元素時,我們還將其標記為未刪除。

要刪除一個元素,我們只需將其標記為已刪除並存入兩個信用即可。

當向量中超過一半的元素被刪除時,這意味着我們至少擁有與向量中的元素一樣多的信用。 這意味着我們可以負擔得起O(n)壓縮。

要查找元素,請運行傳統的二進制搜索,然后跳過已刪除的元素。 由於最多刪除了一半的元素,因此二進制搜索最多可對2n個元素進行操作,這意味着它以O(log 2n)= O(log n)個步驟運行。 二進制搜索完成后,跳過過去的刪除項會有一些額外的開銷,但是數據結構中的一些更聰明的操作可以將其減少為一個常數。 (左為練習。)

同樣,對集合進行迭代最多需要2n步(因為最多刪除了一半的元素),仍然是O(n)。

暫無
暫無

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

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