離散化處理介紹

2021-09-10 22:40:42 字數 2015 閱讀 2127

對於一串數字序列(或者乙個平面),我們要得到其中每個位置得相對位置,但這段數字可能存在間隔十分大,從而產生類似於稀疏矩陣這樣浪費空間的問題(這個形容可能不恰當),比如我們要對這段序列進行桶排序類似物的處理。這是我們可以對其進行求出相對位置(也可以理解為這個數字在這段序列中的排名),而不是原本的絕對位置,利用離散化可以解決這樣的問題。

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。

通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如:

原資料:1,999,100000,15;處理後:1,3,4,2;

原資料:,,;

處理後:,,;

離散化

方法一,

適用於所有情況(sort + unique + lower_bound)三段式:

1,將資料集arr1的內容複製到arr2中,並排序

2,利用unique將arr2中去重(前提有序,已做)

3,利用lower_bound函式查詢arr1每個數字的排名

方法二,

只適用於無重複的情況:

1,定義乙個類中排序前的位置以及值得兩個成員變數

2,根據值排序

3,根據排序前得位置(成員變數idx)賦值當前排序後得排名

測試**

#include

#include

using

namespace std;

const

int maxn =

(int

)1e4+5

;//方法1

int arr1[maxn]

,arr2[maxn]

,rank1[maxn]

;void solve_1 (

int n)

sort

(arr2 +

1, arr2 +

1+ n)

;// 有序

int len =

unique

(arr2 +

1, arr2 +

1+ n)

- arr2 -1;

// 去重

cout <<

"len = "

<< len <<

'\n'

;for

(int i =

1; i <= n; i++

) cout <<

"rank:"

<<

'\n'

;for

(int i =

1; i <= n; i++

) cout <<

"***********************************==\n"

<<

'\n';}

//方法2

struct node

return

false;}

};int rank2[maxn]

,tmp[maxn]

; node arr3[maxn]

;void solve_2 (

int n)

sort

(arr3 +

1, arr3 +

1+ n)

;// 有序

for(

int i =

1; i <= n; i++

) cout <<

"rank:"

<<

'\n'

;for

(int i =

1; i <= n; i++

) cout <<

"***********************************==\n"

<<

'\n';}

intmain()

離散化處理

作用 使資料的值域變小,便於根據值域構造樹狀陣列 線段樹等結構。步驟 輸入,排序,去重,索引。注意 離散化僅適用於只關注元素之間的大小關係而不關注元素本身的值。離散化處理 功能 將a陣列中的數離散化到x陣列,使值域變小 include include include using namespace ...

離散化處理

題目描述 小魚有 n 名優秀的粉絲。粉絲們得知小魚將會在一條直線上出現,打算去膜他。為了方便,粉絲們在這條直線上建立數軸。第 i 名粉絲有乙個偵查區間 li,ri 如果小魚在 j li j ri 處出現,這名粉絲將立刻發現並膜他。小魚希望膜他的人越多越好,但是他不能分身,因此只能選擇乙個位置出現。小...

資料離散化處理

離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如 原資料 1,999,100000,15 處理後 1,3,4,2 原資料 處理後 例如有時需要將資料直接作為陣列下標,但因為資料太大而無法開陣列時,...