[英]Is below sorting algorithm O(n)?
算法:
復雜度:O(數組中的最大元素),它是線性的,所以,O(n)。
vector<int> sort(vector<int>& can) {
unordered_map<int,int> mp;
int first = INT_MAX;
int last = INT_MIN;
for(auto &n : can) {
first = min(first, n);
last = max(last, n);
mp[n]++;
}
vector<int> out;
while(first <= last) {
while(mp.find(first) == mp.end()) first ++;
int cnt = mp[first];
while(cnt--) out.push_back(first);
first++;
}
return out;
}
復雜度:O(數組中的最大元素),它是線性的,所以,O(n)。
不,這不是 O(n)。 while
循環迭代last - first + 1
次,這個數量取決於數組的內容,而不是數組的長度。
通常我們使用 n 來表示算法處理的數組的長度。 為了描述范圍(即數組中最大值和最小值之間的差異),我們可以引入一個不同的變量 r,然后時間復雜度為 O(n + r),因為填充映射的第一個循環迭代 O( n) 次,填充向量的第二個循環迭代 O(r) 次,其從cnt
倒計時的內部循環總共迭代 O(n) 次。
定義 n 的另一種更正式的方法是“輸入的大小”,通常以編碼算法輸入所需的位數來衡量。 假設輸入是一個長度為 2 的數組,其中只包含一些數字 M 的數字 0 和 M。在這種情況下,如果用於對輸入進行編碼的位數是 n,那么數字 M 可以是 O 的數量級(2 n ),第二個循環進行了多次迭代; 所以根據這個正式定義,時間復雜度是指數級的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.