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