1. 程式人生 > >區間第k大(4種求法)

區間第k大(4種求法)

  線性區間求第k大是一個老生常談的問題,我們來總結下4種求解方法(當然遠不止這4種,老話說思想有多遠就能走多遠)。

這裡我們對每種方法的各種屬性進行一個簡單評級(1-5,沒有任何倍數關係)

1:主席樹 (實現難度:2    時間消耗:2    空間消耗:4 )

    主席樹能線上求靜態的,樹狀陣列套主席樹能離線求帶修改的。求靜態線上,帶修改離線,時間複雜度nlogn,空間複雜度nlogn,不會的:傳送門 

2:整體二分 (實現難度:4    時間消耗:1    空間消耗:2 )

    整體二分是將初始化,修改操作,查詢操作一起處理,二分答案,通過每次二分的答案來釋放一部分“修改操作對後面查詢操作的影響力”(不太好描述),這樣累積下去會使每個合法的查詢操作都滿足k,二分到一個確定的數,這個數就是一部分查詢操作的答案。離線,時間複雜度nlogn(大概好像),空間複雜度n+m(大概好像),不會的:自行百度

3:分塊 (實現難度:1    時間消耗:4    空間消耗:1 )

    分塊就是將序列分成sqrt(n)塊,每塊大小sqrt(n),對每塊分別排序,每次查詢二分答案,計算該區間小於等於該答案的有幾個數(注意可能有多個相等的數),二分到一個確定的數就是答案。線上,時間複雜度m sqrt(n* ((logn)^3) )(大概好像),空間複雜度n,不會的:自行百度

4:線段樹 (實現難度:3    時間消耗:4    空間消耗:4 )

    這裡的線段樹存的是該區間排好序的所有值,查詢和分塊的方法差不多,就是二分答案直到一個確定的值,與分塊不同的是處理的區間個數減少了一點。線上,時間複雜度m ((logn)^3) (大概好像),空間複雜度nlogn,不會的:自行百度

    總結:主席樹最實在價效比高;分塊也不錯畢竟思路簡單實現也不難;線段樹的話建議瞭解下不推薦使用;整體二分最難當然也“貨真價實”啦,時間空間都很給力,還可以處理帶修改的,好像連帶插入的也可以處理,缺點顯而易見:需要離線,且難寫難調!!

    大家可能注意到我說的按1~5分級而級別卻沒有5,我想表達的是:沒有最~,只有更~