nth_element
1 前言
近期學習K-D Tree,用到了nth_element,然而不是很確定具體的用法
然而,在網上搜索、點了幾篇博客要么寫的不是很清楚,要么干脆直接是錯的
于是這篇博客用來記錄我個人對nth_element的理解,希望能對你有所幫助,如果我自己忘了也能看這篇博客記起來
2 相關信息
2.1 所需頭文件
#include<algorithm>2.2 使用格式
有個一般式為:
nth_element(begin,nth,end,compare);假設數組a[]a[]a[]的第1~m個位置有數,現在要求第n大
代碼如下
要注意的是,使用nth_elementnth\_elementnth_element需要事先using namespace std或者加std::
即有兩種選擇(可以見后面的代碼)
2.3 功能
對于一般的sortsortsort我們是在Θ(nlogn)\Theta(nlogn)Θ(nlogn)的時間復雜度內使數組內的元素有序,定義一個位置應該有的值為排完序之后這個位置上的值
而nthelementnth_elementnthe?lement的作用就是在Θ(n)\Theta(n)Θ(n)的時間復雜度內使得給定位置上的值成為這個位置該有的值(特殊的,在比較符號為小于并且起始位置為1的時候,做的是將數組中第n大的數放在n號位置)。
另外,nth_elementnth\_elementnth_element滿足做完后,所有其他位置的值與給定位置的值的相對大小關系一定符合(當比較符號為小于的時候,相當于說比第n大的數小的數都放在第n大的數前面,比第n大的數大的數都放在第n大的數后面)(是不是說的很繞,可以看后面代碼輸出時候的解釋)
2.3 實現
題目:輸入n,k,以及n個數,求這n個數中第k大的值
我們可以用這個題來驗證nthelementnth_elementnthe?lement的功能
(注意,代碼中的cmp其實可以刪去,如果不傳cmp函數,默認是“<”)
給出一組程序輸入輸出
你會發現,第3大的數3到了該去的位置,并且在3前面的數都比3小,在3后面的數都比3大
2.4 原理
眾所周知,sortsortsort主要的算法是快速排序
而nth_elementnth\_elementnth_element的本質上就是快速排序的一部分
給出快排代碼
nth_elementnth\_elementnth_element相當于是給定了上面代碼的rand的值,然后不遞歸sortsortsort
由于太過簡單,就不貼代碼了
3 總結
容易發現,其實nth_elementnth\_elementnth_element并不難實現
但是STL的nth_elementnth\_elementnth_element速度尚可、使用方便
既然已經封裝好了,不用白不用
學習一下使用方法能節省代碼量
總結
以上是生活随笔為你收集整理的nth_element的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Min_25筛学习Tip+链接
- 下一篇: 朴素容斥原理[ZJOI2016][bzo