分塊思想與計數排序

2021-10-04 20:21:17 字數 1050 閱讀 7013

所謂分塊思想,就是把原本非常大的區間劃分為數個小區間,然後在小區間裡遍歷查詢。這樣比在整個大區間裡查詢要高效許多。以乙個動態求解序列中第k大的數為例子。

將10^5分割為 sqrt(10^5 + 1) 個塊,,形成乙個陣列 : block[i] , 表示這個塊所表示的區間中的元素個數。同時再設定乙個hash陣列 hashtable[100001],用於表示每個元素在序列中的個數。

這樣新增和刪除元素時只需要改變hash陣列和對應的block[x]的元素增減1即可。求解序列第k大的元素即可先不斷累和block[x] :只要加上該元素值後,當前累和不超過k,當前和 += block[x]。否則就從當前塊對應的起始元素開始遍歷hashtable。知道當前和等於k,所對應的元素即是當前序列第k大。

示例程式:

#include

#include

#include

using

namespace std;

const

int maxn =

100000

;vector<

int>

hashtable

(maxn +1,

0);int block_length =

sqrt

(maxn +1)

;vector<

int>

block

(block_length,0)

;int k;

//需要查詢序列第k大;

bool

add(

int element)

bool

remove

(int element)

else

}int

main()

else}if

( i == block_length)

for(

int j = i * block_length; j < maxn +

1; j++

)else}}

else

}return0;

}

整除分塊思想

對於求形如 sum lfloor frac rfloor 的值,就需要用到整除分塊,否則當n很大時就會超時。在普通的乙個乙個的計算時可以發現很多 lfloor frac rfloor 的值成塊狀分布,最終的到的規律是發現對於每乙個值相同的塊,它的最後乙個數就是n n i for int l 1,r ...

演算法 桶排序思想 計數排序 基數排序 桶排序

二.基數排序 三.桶排序 桶排序的思想 量大但範圍最小 既能用陣列下標表示 整數 且 有很多是並列的 其他情況不一定比快速排序快。總結 include using namespace std const int m 50 const int scope 60 void main delete arr...

計數排序與穩定排序

我們常用的排序演算法,有冒泡演算法 快速演算法等,它們都是基於元素之間的比較來進行排序,有一種特殊的演算法不是基於元素比較,而是利用陣列下標來確定元素在陣列的位置,這種演算法就是 計數排序 先來說一下實現的原理,假設有20個隨機整數的陣列array,他們值分別是 9,3,5,4,9,1,2,7,8,...