簡體   English   中英

該算法在 Big(O) 中的時間復雜度

[英]Time complexity of this algorithm in Big(O)

我想出了以下算法來計算時間復雜度,以找到字符串中出現次數第二多的字符。 該算法分為兩部分。 在 O(n) 中將字符插入 map 的第一部分。 我對第二部分有困難。 遍歷 map 是 O(n) 推入和彈出是 O(log(n))。 第二部分的 BigO 復雜性是多少? 最后,整體復雜性是多少? 任何幫助理解這一點會很棒嗎?

void findKthHighestChar(int k,std::string str)
{
    std::unordered_map<char, int> map;
    
    //Step 1: O(n)
    for (int i = 0; i < str.size(); i++)
    {
        map[str[i]] = map[str[i]] + 1;
    }

    //Step2: O(n*log())
    //Iterate through the map
    using mypair = std::pair<int, char>;
    std::priority_queue<mypair, std::vector<mypair>, std::greater<mypair>> pq;
    for (auto it = map.begin(); it != map.end(); it++) //This is O(n) .
    {
        pq.push(mypair(it->second, it->first)); //push is O(log(n))

        if (pq.size() > k) {
            pq.pop();                           //pop() is O(log(n))
        }
    }
    std::cout << k << " highest is " << pq.top().second;
}

您有 2 個輸入變量, kn (與k < n )。
還有一個隱藏:字母大小A

  • Step1 的平均情況復雜度為O(n)

  • 第2步: O(std::min(A, n)*log(k))

    迭代 map 為O(std::min(A, n))

    隊列大小綁定到k ,所以它的操作在 O(log(k))

整個算法是如此O(n) + O(std::min(A, n)*log(k))如果我們簡化並去掉一些變量以僅保留n

  • ( k -> n , A -> n ): O(n) + O(n*log(n))所以O(n*log(n))
  • ( k -> n , std::min(A, n) -> A ) : O(n) + O(log(n))所以O(n)

一定是這個算法嗎?

您可以使用一個數組(字母大小)來保存頻率。

您可以在 O(n) 中填充它,(通過您的字符串)。 然后,您可以一次找到最大或第二大頻率。 仍然是 O(n)。

暫無
暫無

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

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