有時候,我們需要使用陣列下標來維護某些資料結構(例如並查集),但如果資料範圍太大我們開不了這麼大的陣列,這時候,我們就要將資料進行離散化。
例如資料我們可以根據相對大小關係67542347<75331434<87433476<99844531來開乙個新陣列編號,二分查詢在新陣列裡的編號。如b[1]=67542347,b[2]=75331434,b[3]=87433476,b[4]=99844531。當我們要查詢99844531這個資料的時候,就能在b中找到它的編號為4,就可以用4來代表這個資料啦。
根據這種查詢方法,我們要對元素進行去重,即去除重複元素。
其中我們需要用到兩種函式:
unique函式:不斷將不重複元素佔據前面重複元素的位置(相鄰的重複元素),返回的是不重複序列的最後乙個元素的下乙個元素的位址。
lower_bound:從陣列的起始位置到結束位置(左閉右開)二分查詢第乙個大於或等於傳入的引數的元素,返回的是該元素的位址,減去陣列起始位置就得到該元素的下標。
沒找到則返回end。
附上**:
1 #include2 #include3using
namespace
std;
4int
n; 5
int a;//
需離散化的資料
6int b;//
儲存離散化後的
7int
main()
11 sort(b+1,b+1+n);//
對資料排序,因為unique函式「除去」的是相鄰重複元素
12int m=unique(b+1,b+n+1)-b-1;//
去除相鄰重複元素,返回無重複元素的長度m
13int x=lower_bound(b+1,b+m+1,a[1])-b;//
假設要查詢的資料是a[1],x為a[1]在陣列b中的位置即下標
14return0;
15 }
資料離散化處理
離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 例如有時需要將資料直接作為陣列下標,但因為資料太大而無法開陣列時,...
資料離散化處理
離散化處理有幾個方法 方法一 適用於所有情況 sort unique lower bound 三段式 關於這幾個函式請見我的另一篇部落格 1 申請兩個陣列num和numcopy 這個陣列是num的副本 2 利用unique函式對num陣列進行去重 3 利用lower bound函式獲得numcopy...
資料離散化處理
離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 用法 很多演算法的複雜度與資料中的最大值有關,比如樹狀陣列和純用陣...