一、概述
資料離散化是乙個非常重要的思想。
為什麼要離散化?當以權值為下標的時候,有時候值太大,存不下。 所以把要離散化的每乙個陣列裡面的數對映到另乙個值小一點的陣列裡面去。
打個比方,某個題目告訴你有10^4個數,每個數大小不超過10^10,要你對這些數進行操作,那麼肯定不能直接開10^10大小的陣列,但是10^4的範圍就完全沒問題。
通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如:
原資料:1,999,100000,15;處理後:1,3,4,2;
原資料:,,;
處理後:,,;
但是離散化僅適用於只關注元素之間的大小關係而不關注元素本身的值!
二、原理與操作
假如你只想簡單操作一下,如求個逆序對什麼的,那直接排序後將它的順序覆蓋回去就可以啦。(它不能去重)
假如你想寫的更加專業就要採用以下步驟:
1、排序
2、去重
3、索引
首先我們要對所要進行離散化的資料進行排序:一般使用sort對陣列或結構體排序。
然後是去重操作,為了寫出高效的**,我們需要複習兩個stl函式:unique()和lower_bound(),他們同時隸屬於#include。
unique的作用是「去掉」容器中相鄰元素的重複元素(不一定要求陣列有序),它會把重複的元素新增到容器末尾(所以陣列大小並沒有改變),而返回值是去重之後的尾位址;
函式lower_bound()在first和last中的前閉後開區間進行二分查詢,返回大於或等於val的第乙個元素位置。如果所有元素都小於val,則返回last的位置。【ps.upper_bound是返回第乙個大於b[x]的指標,upper_bound()=lower_bound()+1】
關鍵**如下:
int lsh[1000], lshcopy[1000], sy[1000];
int size=unique(sy,sy+n)-sy;
lsh[i]=lower_bound(sy,sy+size,lshcopy[i])-sy;
測試**如下:
#include#include#includeusing namespace std;
int lsh[1000], lshcopy[1000], sy[1000]; //lsh[n]是即將被離散化的陣列,lshcopy[n]是a[n]的副本,sy[n]用於排序去重後提供離散化後的值
int main()
node[maxn];
for(int i=1; i<=n; i++)
}
r陣列負責收集離散後的結果。 資料離散化
離散化有兩種方法 第一種,先看一段 const int n 1e5 7 int t n a n int main 在這段 中,a經過離散,範圍就變成了m。解釋一下,unique是c 自帶的乙個函式,表示對乙個數列去重,然後返回不重複的元素個數,當然在後面要減去首位址。那麼這種離散化對於有重複元素的數...
資料離散化
今天執行 資料離散化 部分 時出錯,環境python3.6 pycharm,網上各種查詢資料後發現原 主要是三個地方需要修改 下面紅色部分,原有問題 被注釋掉了 修改並新增了部分注釋。coding utf 8 資料規範化 import pandas as pd datafile data discr...
資料離散化
struct data d n 按x排序 sort d,d n for int i 0 i時間複雜度o nlogn 空間複雜度o n 用於無重複資料 lower bound a,a n,x a 1 返回a中第乙個大於等於x的位置 unique a,a 1 n a 1 a,減首位址返回將aa陣列去重後...