離散化就是把無限空間(或非常大的空間)中有限的個體對映到有限的空間(較小空間)中去,以此提高演算法的時空效率。
通俗的說,離散化就是在不改變資料相對大小的條件下,對資料進行相應的縮小。
原始資料:
8 999 91 100000 0000 15 999 91 。
離散化後:
1 3 4 2 3 。
離散化有什麼用處呢?
有時候我們需要根據數值的大小開乙個陣列,由於數值很多,沒辦法開那麼大的陣列(大了會超記憶體限制的),但是資料的個數有限。
如:有500000個數字,他們的範圍是0-2000000000,這樣就滿足離散化的條件。我們可以把這些數離散化,最小的縮小為1,大小相鄰的依次增加1,這樣所有的數的範圍一定能縮小到1到500000之間,同時不改變相對大小關係。
給你n個整數序列a[1],a[2],..,a[n]。請你在不改變相對大小關係的前提下進行離散化。
1.離散化後,最小的數值為1。
2.原序列中相同的數,離散後還應相同。
3.大小相鄰的兩個數離散後相差為1。
4.離散後序列相對位置不變。
第一行n 原始資料的個數 。
第二行n 個用乙個空格隔開的整數 。
一行原序列離散後相應的序列 ,相鄰兩個數之間乙個空格隔開。
discretize.in
discretize.out
8 99991 1000000000 15 99991
1 3 4 2 3
30%的資料: n<100, 0< a[i]<1000;
100% 的資料: n<500000 0< a[i]<2000000000
其實就是用乙個輔助的陣列把你要離散的所有資料存下來。
然後排序,排序是為了後面的二分。
去重,因為我們要保證相同的元素離散化後數字相同。
再用二分把離散化後的數字放回原陣列。
1.去重並不是把陣列中的元素刪去,而是重複的部分元素在陣列末尾,去重之後陣列的大小要減一
2.二分的時候,注意二分的區間範圍,一定是離散化後的區間
3.如果需要多個陣列同時離散化,那就把這些陣列中的數都用陣列存下來
//n:原陣列大小
//num:原陣列中的元素
//lsh:離散化的陣列
//cnt:離散化後的陣列大小
intlsh[maxn] , cnt , num[maxn] , n;
for(int i=1; i<=n; i++)
sort(lsh+1 , lsh+n+1
);cnt = unique(lsh+1 , lsh+n+1) - lsh - 1
;for(int i=1; i<=n; i++)
num[i] = lower_bound(lsh+1 , lsh+cnt+1 , num[i]) - lsh;
其實就是排序之後,列舉著放回原陣列
用乙個結構體存下原數和位置,按照原數排序
我結構體裡面寫了個過載,也可以寫乙個比較函式
最後離散化後數在ran
k[]'>rank
裡面
structnode
};node num[maxn];
intrank[maxn], n;
for (int i = 1; i <= n; i++)
sort(num + 1, num + n + 1
);for (int i = 1; i <= n; i++)
資料離散化
離散化有兩種方法 第一種,先看一段 const int n 1e5 7 int t n a n int main 在這段 中,a經過離散,範圍就變成了m。解釋一下,unique是c 自帶的乙個函式,表示對乙個數列去重,然後返回不重複的元素個數,當然在後面要減去首位址。那麼這種離散化對於有重複元素的數...
資料離散化
一 概述 資料離散化是乙個非常重要的思想。為什麼要離散化?當以權值為下標的時候,有時候值太大,存不下。所以把要離散化的每乙個陣列裡面的數對映到另乙個值小一點的陣列裡面去。打個比方,某個題目告訴你有10 4個數,每個數大小不超過10 10,要你對這些數進行操作,那麼肯定不能直接開10 10大小的陣列,...
資料離散化
今天執行 資料離散化 部分 時出錯,環境python3.6 pycharm,網上各種查詢資料後發現原 主要是三個地方需要修改 下面紅色部分,原有問題 被注釋掉了 修改並新增了部分注釋。coding utf 8 資料規範化 import pandas as pd datafile data discr...