[英]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.