是否有人知道以下两种方法可以找到相同长度向量的最大值和最小值,其中一个在C ++中更快:
1
std::sort(vector.begin(),vector.end());
vector.erase(std::unique(vector.begin(),vector.end()),vector.end());
min=vector.front();
max=vector.back();
2
max=*max_element(vector.begin(),vector.end());
min=*min_element(vector.begin(),vector.end());
答案 0 :(得分:1)
此sort()
函数基本上是快速排序,堆排序和插入排序的混合实现。默认情况下,它使用快速排序,但是如果快速排序进行不公平的分区并且花费了超过(N*log(N))
的时间,它将切换到堆排序;当数组的大小变得很小时,它将切换为插入排序。
首先在第一个示例中,您使用时间复杂度为sort
的{{1}}函数对向量进行排序,然后擦除向量中的唯一元素,这将花费更多的时间,而后发现max和向量中的min个元素,这些元素最终将花费超过O(N*log(N))
个时间。
在第二个示例中,您仅使用* max_element和* min_element来查找max和min元素,它们的总时间复杂度为O(N),显然比O(N*log(N))
好。
或者您可以简单地运行for循环来查找时间复杂度为O(N*log N)
的max和min元素。
答案 1 :(得分:-2)
排序(quicksort)的复杂度平均为O(n*log2(n))
。
查找数组的最小值或最大值只有O(n)
复杂度。
因此第二个要快得多。