離散化是程式設計中乙個常用的技巧,它可以有效的降低時間複雜度。其基本思想就是在眾多可能的情況中,只考慮需要用的值。離散化可以改進乙個低效的演算法,甚至實現根本不可能實現的演算法。要掌握這個思想,必須從大量的題目中理解此方法的特點。例如,在建造線段樹空間不夠的情況下,可以考慮離散化。
1、排序
2、去重
3、索引
為了簡化**,我們採用stl離散化:
1/*2標頭檔案用離散化之前先用 sort()排序,再用 unique() 進行去重
3用 lower_bound() 或者 upper_bound() 進行二分查詢位置4*/
5int a[n], b[n], sub[n];///
a[n]是即將被離散化的陣列,b[n]是a[n]的副本,sub用於排序去重後提供離散化後的值
6 sort(sub, sub +n);
7int size = unique(sub, sub + n) -sub;
8for(int i = 0; i < n; i++)
9 a[i] = lower_bound(sub, sub + size, a[i]) - sub;///
即a[i]為b[i]離散化後對應的值
#includeunique 的作用是「去掉」容器中相鄰元素的重複元素,這裡所說的「去掉」並不是真正把重複元素刪除,它實質上是乙個偽去除,是把重複的元素移到後面去了,然後依然儲存到了原陣列中,然後返回去重後最後乙個元素的位址。
因為unique去除的是相鄰元素的重複元素,所以使用之前需要排序。
sz=unique(b+1,b+n+1)-(b+1);//unique(a,a+n) - a返回的是去重後的陣列長度1、lower_bound函式減去的(b+1) 起始位址
sz=unique(a,a+n)-a;
在乙個非遞減序列的前閉後開區間[first,last)中,進行二分查詢查詢某一元素val,函式lower_bound()返回大於或等於val的第乙個元素位置(即滿足條件a[i]>=val(first<=i注意:此時i的值是越界的!!!!!)。
stl中函式lower_bound()的**實現(first是最終要返回的位置)
12、upper_bound函式int lower_bound(int *array, int size, int
key)214
else
15 len = half;//
在左邊子串行(包含middle)中查詢16}
17 }
在乙個有序序列(公升序或者降序)的區間中,進行二分查詢某一元素val,函式upper_bound返回乙個迭代器指向該區間中最後乙個這個元素的下乙個位置(簡單的說就是返回能夠將元素val插入區間的最後乙個位置)。
stl中函式upper_bound()的**實現(first是最終要返回的位置)
離散化 unique() 二分查詢
離散化 離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 離散化是程式設計中乙個常用的技巧,它可以有效的降低時間複雜...
STL 二分查詢 去重 全排列
二分查詢適用於有序序列。lower bound 函式 返回第一次出現大於等於那個要查詢的數的位址 upper bound 函式 返回的是第乙個比要查詢的數大的數的位址 注意 這裡是大於 不包括等於 返回乙個迭代器,表示第乙個大於等於val的元素,如果不存在這樣的元素,則返回end。lower bou...
B Uniqueness(二分 離散化)
題意 問去掉最小多少的一段能使所有不同數字的個數為1。題解 以去掉的長度為基準進行二分,因為ai能到達1e9,所以還要離散化,然後直接暴力查詢即可。include include include include include include include include include incl...