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