[英]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 個輸入變量, k
和n
(與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.