c++對大範圍的數據進行數據離散化(含重複數據)

在我們只需要利用數值之間的大小關係,而不需要其具體值來進行運算的時候。對數據進行離散化操作,可以解決因爲數據範圍太大而造成的一些尷尬(比如數組,線段樹,樹狀數組因爲數據範圍太大,可能會難以操作或者超時),或者節約程序運行的時間。

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

int const N=1e5+5;
int a[N],b[N];

int main(){
    int i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        scanf("%d",&a[i]);
        b[i]=a[i];
    } 
    sort(a,a+n);
    int len=unique(a,a+n)-a;//unique去重使大小與下標對應,並得到去重後的長度 
    for(i=1;i<=n;i++)
        b[i]=lower_bound(a,a+len,b[i])-a;//用lower_bound O(log n)查找比for O(n)更快 
        //b【】就是離散化後的數組了 
    for(i=1;i<=n;i++)printf("%d ",b[i]);    
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章