C nth element介面使用

2021-10-24 12:35:45 字數 3272 閱讀 9619

有這麼一類問題,是尋找區間內的第k大或者說第k小(實際上這兩個是乙個問題),解決演算法有排序,權值線段樹、主席樹、樹套樹等,但是要麼就是複雜度不滿意或者不好寫。根據快速排序的分治思路,我們還可以在o(n

)o(n)

o(n)

的時間內找到答案,但並不能保證有序,並且stl十分貼心地把這個演算法封裝到 nth_element 中,本文就是介紹這個介面地使用。

前言中提到,這個介面的期望複雜度是 o(n

)o(n)

o(n)

,我們可以假設每次選取的分段標誌為最優大致證明一下:

t (n

)=t(

n/2)

+n=t

(n/4

)+n+

n/2=

t(n/

(2i)

)+n+

n/

2...+n

/(2(

i−1)

)=n+

n/2+

...+

1=2∗

n−1=

o(n)

,其中(

i=lo

g(n)

+1).

t(n) = t(n/2) + n \\ = t(n/4) + n + n/2 \\ = t(n/(2^i)) + n + n/2 ... + n/(2^(i-1)) \\ = n + n/2 + ... + 1 \\ = 2*n - 1 = o(n),其中 (i = log(n) + 1) .

t(n)=t

(n/2

)+n=

t(n/

4)+n

+n/2

=t(n

/(2i

))+n

+n/2

...+

n/(2

(i−1

))=n

+n/2

+...

+1=2

∗n−1

=o(n

),其中

(i=l

og(n

)+1)

.至於劃分部分和快排一致,區別在於分治部分,具體實現略。

nth_element預設的比較子和一般的容器都是 less ,這在堆結構中會形成大根堆;在排序介面會形成從小到大排序;在這裡則會形成第k小的功能,如果把這個比較子換成greater或者自定義的乙個比較子介面則會形成乙個第k大。

對於每個引數的含義:

#include

using

namespace std;

intmain()

;nth_element

(arr, arr+

2, arr+10)

;//注意第1小對於下標0,以此類推

cout <<

"nth_element(arr, arr+3, arr+10) : "

;for

(int i =

0; i <

10; i++

) cout << arr[i]

<<

' ';

cout <<

"\n第3小的數是 : "

<< arr[2]

<< endl;

/** * 輸出:

* nth_element(arr, arr+3, arr+10) : 1 2 2 3 4 5 9 6 11 12

* 第3小的數是 : 2

*/int arr2[10]

=;nth_element

(arr2, arr2+

7, arr2+10)

;//求第3大轉化成求第10-3+1小問題

cout <<

"nth_element(arr2, arr2+7, arr2+10) : "

;for

(int i =

0; i <

10; i++

) cout << arr2[i]

<<

' ';

cout <<

"\n第3大的數是 : "

<< arr2[7]

<< endl;

/** * 輸出:

* nth_element(arr2, arr2+7, arr2+10) : 5 2 4 3 2 1 6 9 11 12

* 第3大的數是 : 9

*/int arr3[10]

=;nth_element

(arr3, arr3+

2, arr3+

10, greater<

int>()

);//求第3大轉化成求第10-3+1小問題

cout <<

"nth_element(arr3, arr3+3, arr3+10, greater()) : "

;for

(int i =

0; i <

10; i++

) cout << arr3[i]

<<

' ';

cout <<

"\n第3大的數是 : "

<< arr3[2]

<< endl;

/** * 輸出:

* nth_element(arr3, arr3+3, arr3+10, greater()) : 11 12 9 6 5 1 3 4 2 2

* 第3大的數是 : 9

*/int arr4[10]

=;nth_element

(arr4, arr4+

2, arr4+10,

(int a,

int b));

//求第3大轉化成求第10-3+1小問題

cout <<

"nth_element(arr4, arr4+2, arr4+10, (int a, int b)) : "

;for

(int i =

0; i <

10; i++

) cout << arr4[i]

<<

' ';

cout <<

"\n第3大的數是 : "

<< arr4[2]

<< endl;

/** * 輸出:

* nth_element(arr4, arr4+2, arr4+10, (int a, int b)) : 11 12 9 6 5 1 3 4 2 2

* 第3大的數是 : 9

*/return0;

}

C nth element排序演算法

函式標頭檔案 default 1 template void nth element randomaccessiterator first,randomaccessiterator nth,randomaccessiterator last custom 2 template void nth el...

C nth element函式用法學習

nth element 需要標頭檔案。典型參數列為 nth element randomit first,randomit nth,randomit last,compare comp less nth element的作用就是根據nth這個引數,把容器內的元素分為2組,nth之前的都比它小,nth...

介面使用 (JAVA

介面使用 題目描述 建立乙個名稱為vehicle的介面。在介面中新增兩個方法start 和stop 在兩個名稱分別為bike和bus的類中實現vehicle介面。建立乙個名稱為main的類,在main的main 方法中建立bike和bus物件,並訪問start 和stop 方法。如下 你的 將被嵌入...