日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nth_element

發布時間:2024/4/11 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_element(a+1,a+n,a+m+1,cmp);

要注意的是,使用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的功能

#include<cstdio> #include<algorithm> //using namespace std; int n,k,a[1000001]; int cmp(int a,int b){return a<b;} int main() {scanf("%d %d",&n,&k);for(int i=1;i<=n;i++)scanf("%d",&a[i]);std::nth_element(a+1,a+k,a+n+1,cmp);//開頭的注釋掉了,那么這個地方要用用了std::for(int i=1;i<=n;i++)printf("%d ",a[i]);return 0; }

(注意,代碼中的cmp其實可以刪去,如果不傳cmp函數,默認是“<”)
給出一組程序輸入輸出

你會發現,第3大的數3到了該去的位置,并且在3前面的數都比3小,在3后面的數都比3大

2.4 原理

眾所周知,sortsortsort主要的算法是快速排序
nth_elementnth\_elementnth_element的本質上就是快速排序的一部分
給出快排代碼

void sort(int*l,int*r) {if(l>=r)return;swap(*l,*(l+rand()%(r-l)));int *ll=l,*rr=r-1,v=*l;while(ll<rr){while(ll<rr&&(*rr)>=v)rr--;*ll=*rr;while(ll<rr&&(*ll)<=v)ll++;*rr=*ll;}*ll=v;sort(l,ll),sort(ll+1,r); }

nth_elementnth\_elementnth_element相當于是給定了上面代碼的rand的值,然后不遞歸sortsortsort
由于太過簡單,就不貼代碼了

3 總結

容易發現,其實nth_elementnth\_elementnth_element并不難實現
但是STL的nth_elementnth\_elementnth_element速度尚可、使用方便
既然已經封裝好了,不用白不用
學習一下使用方法能節省代碼量

總結

以上是生活随笔為你收集整理的nth_element的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。