簡體   English   中英

此插入方法的時間和空間復雜度

[英]time and space complexity of this insert method

假設我要將項目插入已排序的堆棧s中。 我創建一個臨時堆棧s2。 我一直將它們推入s2並從s1彈出,直到到達要插入的位置。 然后我把它推到s。 然后我將s2中的所有內容推回s中。 假設s的大小為n,此操作的時間復雜度是多少? 我很確定它是O(n)。 因為您最多彈出s中的n個元素,然后最多彈出s2中的n個項目。 這樣就得到了O(n)+ O(n),即O(n)。 那正確嗎?

#include <iostream>
#include <stack>
using namespace std;

void insert(int item, stack<int> &s){
    stack<int> temp;

    while(s.top() > item){
        int curr = s.top();
        s.pop();
        temp.push(curr);
    }

    s.push(item);

    while(!temp.empty()){
        int curr = temp.top();
        s.push(curr);
        temp.pop();
    }
}

int main(){
    int numbers[] = {1,2,4,5,6};
    stack<int> s;

    for (int i = 0; i < 5; i+=1){
        s.push(numbers[i]);
        std::cout << "original s: " << s.top() << std::endl;}

    insert(3, s);

    for (int i = 0; i < 6; i+=1){
        std::cout << "new s: " << s.top() << std:: endl;
        s.pop();}
}

如您所見,此代碼完全按照我的預期工作。 但是,我聽說此算法(使用臨時堆棧)與優先級隊列有關。 它的插入函數是O(logn)而不是O(n)。 誰能為我澄清一下此處顯示的insert方法的正確時間復雜度?

我也想知道insert方法的空間復雜度:

我的分析:您聲明了一個臨時堆棧,最大大小為n。 同樣在while循環中,每次循環運行時,您都聲明一個新的臨時文件。 因此,空間復雜度也是O(n)。 這是正確的嗎?

PS我知道我不應該使用名稱空間。 這只是為了方便起見。

您的算法適用於O(n)並且無法在具有O(logN)復雜度的數組或堆棧上實現插入,最壞的情況始終是O(N) 而且,排序數組的插入要比未排序數組的插入慢。 原因是元素的順序在插入時會發生變化,因此需要更正。 堆棧也是如此,除非您不想在插入后保留順序。

好吧,我不知道您在說什么插入算法。 但是, 元素插入優先級隊列的復雜度為O(Log N) 當然,在這種情況下,您的元素將按照降序排序(這是默認行為),或者使用您自己提供的比較函數進行排序。 最終結果將與您的代碼足夠接近。 因為您也可以對元素進行排序。

要回答您的問題,是的,當然,代碼的復雜度是O(N)

暫無
暫無

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

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