離散化

概念:
離散化,把無限空間中有限的個體映射到有限的空間中去,以此提升算法的時空效率。
通俗的說,離散化是在不改變數據相對大小的條件下,對數據進行相應的縮小。例如:
原數據:1,999,100000,15;處理後:1,3,4,2;
 
適用範圍:
有些數據自己很大, 自身沒法做爲數組的下標保存對應的屬性。若是這時只是須要這堆數據的相對屬性, 那麼能夠對其進行離散化處理。
當數據只與它們之間的相對大小有關,而與具體是多少無關時,能夠進行離散化。
例如:
91054與52143的 逆序對個數相同。
 
利用STL離散化
思路是:先排序,再刪除重複元素,最後就是索引元素離散化後對應的值。
假定待離散化的 序列爲a[n],b[n]是序列a[n]的一個副本,則對應以上三步爲:
int n, a[maxn], b[maxn];
//這裏如下標1爲序列的起點,通常狀況下從0開始也能夠
for(int i = 1;i <= n;i++)
{
    scanf("%d", &a[i]);
    b[i] = a[i];//b是一個臨時數組,用來獲得離散化的映射關係
}
//下面使用了STL中的sort(排序),unique(去重),lower_bound(查找)函數
sort(b + 1, b + n + 1);//排序
int size = unique(b + 1, b + 1 + n) - b - 1;//去重,並得到去重後的長度size
for(int i = 1;i <= n;i++)
{
    a[i] = lower_bound(b + 1, b + 1 + size, a[i]) - b;//經過二分查找,快速地把元素和映射對應起來
}

 

第二種方式其實就是排序以後,枚舉着放回原數組算法

用一個結構體存下原數和位置,按照原數排序數組

我結構體裏面寫了個重載,也能夠寫一個比較函數函數

最後離散化後數在rank【 】 裏面spa

#include<algorithm>
struct Node {
    int data , id;
    bool operator < (const Node &a) const {
        return data < a.data;
    }
};
Node num[MAXN];
int rank[MAXN] , n;
for(int i=1; i<=n; i++) {
    scanf("%d",&num[i].data);
    num[i].id = i;
}
sort(num+1 , num+n+1);
for(int i=1; i<=n; i++)
    rank[num[i].id] = i;
相關文章
相關標籤/搜索