對於一串數字序列(或者乙個平面),我們要得到其中每個位置得相對位置,但這段數字可能存在間隔十分大,從而產生類似於稀疏矩陣這樣浪費空間的問題(這個形容可能不恰當),比如我們要對這段序列進行桶排序類似物的處理。這是我們可以對其進行求出相對位置(也可以理解為這個數字在這段序列中的排名),而不是原本的絕對位置,利用離散化可以解決這樣的問題。
離散化,把無限空間中有限的個體對映到有限的空間中去,以此提高演算法的時空效率。離散化通俗的說,離散化是在不改變資料相對大小的條件下,對資料進行相應的縮小。例如:
原資料: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 原資料 處理後 例如有時需要將資料直接作為陣列下標,但因為資料太大而無法開陣列時,...