序列的 離散化

2021-07-15 08:50:11 字數 1145 閱讀 7225

【問題描述】

對於乙個資料元素很大的序列:a[1],a[2],…,a[n],我們在處理這個序列時,往往只會關心序列中元素的大小關係。這時候為了處理方便,可把序列對映為1..n範圍內的數,其中最小的元素對映為1,第2小的數對映為2,……。例如:

原 序 列:19827345 2000000053 73925 98203456 73925 19827345

對映序列:  2     4    1    3    1   2

由此可以看出,對映序列於原序列元素間的大小關係是等價的,在這裡我們把「對映序列」又稱為「名次序列」。

所以,離散序列實質就是原序列每個元素用它的名次代替(相同的元素名次相同),離散化就是要得到序列的名次陣列。

【輸入格式】

第1行,為整數n,表示序列有n個實數。第2行包含n個實數,表示序列a[1]..a[n]。

【輸出格式】

包含n個整數,與原序列等價的名次序列。

【輸入樣例】

6 10.5 8.1 9.22 3.33 6.23 8.1

【輸出樣例】

5 3 4 1 2 3

【資料範圍】

1<=n<=100000。a[i]在double範圍內。

【**】

mr_he原創

這個問題是c++程式編寫中的乙個經典問題,同時,也是一種對題目的技巧處理手段,對於大資料問題可以通過離散化來減少資料範圍。

**如下:

#include

#include

#include

#include

#define maxn 100005

using

namespace

std;

int n;

double a[maxn];

mapmp;

map::iterator it;

int main()

int id=1;

for(it=mp.begin();it!=mp.end();it++)

it->second=id++;

for(int i=1;i<=n;i++)

printf("%d ",mp[a[i]]);

return

0; }

(手寫)可去重離散化序列

所謂離散化,就是求乙個序列每個數是序列中的第幾大 小的,可以為主席樹等權值線段樹等節省空間 比如數的最大值為1e9,你就要存1e9那麼大,但離散化後只用存數的個數那麼多 真心看不懂哪些大佬們如何用stl寫離散化 我手寫了乙個,保證 如果同樣大的名次相同,從小到大 型別1 運動員是排序 自己口胡的名字...

資料的離散化

有些資料本身很大,自身無法作為陣列的下標儲存對應的屬性。如果這時只是需要這堆資料的相對屬性,那麼可以對其進行離散化處理!離散化 當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。例如 9 1 0 5 4 與 5 2 1 4 3 的逆序對個數相同。設有4個數 1234567 12...

資料的離散化

有些資料本身很大,自身無法作為陣列的下標儲存對應的屬性。如果這時只是需要這堆資料的相對屬性,那麼可以對其進行離散化處理!離散化 當資料只與它們之間的相對大小有關,而與具體是多少無關時,可以進行離散化。例如 9 1 0 5 4 與 5 2 1 4 3 的逆序對個數相同。設有4個數 1234567 12...