概念
一、如果有乙個序列,5 14 200000000000 6 100 100, 他們的值本身不重要,重要的是他們之間的大小關係,比如14 大於5 ,而小於200000000000。
二、如果空間有限,又需要這些值當陣列下標時,就很麻煩了,
三、此時就可以利用資料的離散化
這個序列有6個元素,就用1-6來表示他們之間的相對大小關係
四、如上圖所示:
1、輸入6個數,用arr[ ] 分別記錄這6個數及其輸入的次序。然後根據值排序,值相等則按輸入次序排序。
此時的arr[ ]是乙個有序的陣列,看上圖中s1 綠色的框(只看綠色框不看其他的)這是原陣列中各個元素的大小排序,接下來用1—6 這6 個數來表示元陣列的這幾個元素,即:
1——5
2——6
3——14
4——100
5——100
6——20000000
符合原陣列元素的相對大小,比如 6 < 14 < 100, 離散後 2 < 3 < 4。
2、此時再看s2 紅色的框,這裡記錄的是原陣列arr[ ]的輸入次序,我們再根據每個元素的輸入次序,把離散後的新元素1-6 存到乙個新陣列vec[ ]中,
3、 這時,原陣列arr[ ]就離散成新陣列vec[ ],節省了空間,且各個元素的相對大小不變,
4、然後綠色的框和紅色的框就沒用了,關注紫色的框,看看相對大小和位置是否正確
例項**:
#include
using
namespace std;
struct node
;vector arr;
bool
cmp(node &a, node &b)
intmain()
sort
(arr.
begin()
+1, arr.
end(
),cmp)
;
cout <<
"原值次序"
<<
" "<<
"值"<< endl ;
for(
int i =
1; i <= n; i++
) cout << arr[i]
.id <<
" "<< arr[i]
.k << endl;
for(
int i =
1; i <= n; i++
) vec[arr[i]
.id]
= i;
//按照原陣列輸入次序,把1-6存到新陣列中
cout<<
"離散化後的資料\n 5 14 20000000 6 100 100"
<
for(
int i =
1; i <= n; i++
) cout << vec[i]
<<
" ";
return0;
}
資料離散化
離散化有兩種方法 第一種,先看一段 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...