簡體   English   中英

下面是排序算法 O(n) 嗎?

[英]Is below sorting algorithm O(n)?

算法:

  1. 在地圖中插入元素計數
  2. 從第一個元素開始
  3. 如果地圖中存在第一個,則插入輸出數組(計數的總數),首先遞增
  4. 如果第一個不在地圖中,則查找地圖中存在的下一個數字

復雜度: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.

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