C STL nth element原理與應用

2021-08-03 14:05:51 字數 607 閱讀 8735

lz最近的考試中,某題可以通過呼叫nth_element()來水過70%的資料

但是lz並不會啊(歷史總是驚人的相似)

於是就有了這篇blog

在編寫**時,有時會有「在乙個無序表中快速得到第k小的元素」的需求

而直接排序 不能水過一些測試點 時間不能承受

於是stl的algorithm標頭檔案就給我們提供了nth_element()這樣的部分排序函式

呼叫的正確姿勢是這樣的:nth_element(first,kth,last)

first和last表示部分排序的區間為[first,last)

指標kth表示完成後,這個位置的元素是第(kth-first+1)小的

(注意first是第1小的)

這個函式的期望複雜度是o(n)的

原理如下:

在當前區間[l,r]上,找乙個基準位置mid

通過線性的掃瞄交換,

使得[l,mid)的元素都比mid小,(mid,r]的元素都比mid大

此時mid上的元素就是第mid小的

然後判斷k在哪半邊,繼續遞迴處理

所以這樣就達到了期望的o(

n)複雜度

歡迎補充~~

原環套原環

今天在除錯兄弟的程式的時候發現了乙個問題,就是在組合資料的時候,有些時候可以成功,有些時候失敗,感覺十分奇怪。功能大概是這樣的,就是在一棵樹上掛資料,所有的節點都可以有資料,不只是葉子的,在組合資料的時候,可以從任意節點取資料,但是不能是重複的資料。資料可能出現的情況如圖a b c所示,圖a是沒有干...

MongoDB writeConcern原理解析

mongodb支援客戶端靈活配置寫入策略 writeconcern 以滿足不同場景的需求。db.collection.insert mongodb支援的writeconncern選項如下 w 資料寫入到number個節點才向用客戶端確認 j 寫入操作的journal持久化後才向客戶端確認 wtime...

LinkedBlockingQueue原理分析

linkedblockingqueue也是乙個阻塞佇列,相比於arrayblockingqueue,他的底層是使用鍊錶實現的,而且是乙個可有界可無界的佇列,在生產和消費的時候使用了兩把鎖,提高併發,是乙個高效的阻塞佇列,下面就分析一下這個佇列的原始碼。鍊錶節點定義 static class node...