离散化

Posted 邪童的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了离散化相关的知识,希望对你有一定的参考价值。

离散化通过把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率

特点: 值域大(0 ~ \\(10^9\\)) , 个数少(\\(10^5\\))

\\[\\beginCD a[\\quad] : \\underbrace1\\quad2\\quad5\\quad8\\quad10\\quad\\cdots\\quad10^9_10^5个 @>映射到从0开始的连续自然数>离散化> 0,\\quad1,\\quad2,\\quad\\cdots,\\quad n-1 \\endCD \\]

a[] 中可能有重复元素 \\(\\quad\\) \\(\\quad\\) 去重

② 如何算出 x 离散化后的值 (在 a[] 数组中的下标) \\(\\quad\\) \\(\\quad\\) 二分


//离散化模板

vector<int> alls;	//存储所有待离散化的值
sort(alls.begin(),alls.end());	//将所有值排序
alls.erase(unique(alls.begin(),alls.end()),alls.end());	//去重
//二分求出x对应的离散化的值

int find (int x)

    int l=0,r=alls.size()-1;
    while(l<r)
    
        int mid=(l+r)/2;
        if(alls[mid]>=x)r=mid;
        else l=mid+1;
    
    return r;



离散化的认识

离散化的认识

离散化,一种常见的数据处理技巧,可以有效的降低时间复杂度,可以做到将一些低效的算法进行改进,甚至拟造出一些不可能的算法,使其速度大为提高。
离散化的基本思想就是将一些巨大的范围内,挑选出要用的值,再进行处理。

离散化的处理

注:对数据进行离散化处理的前提是这些数据只于他们的相对大小有关,而不与其具体数值有关,例如排序等。
进行离散化的处理其实很简单:为所有巨大的数据从小到大进行编号。
例如有6个数:
66666 66 666 666666 6 6666
他们排序后得:6<66<666<6666<66666<666666
所以这六个数分别表示为:5 2 3 6 1 4(即这几个数在排序后所得结果得位置)

利用STL对数据进行离散化处理

思路:利用sort排序,后删除重复元素,引出其代表的值(即标序号)。
设序列a[n]为待进行处理的序列,b[n]为其副本。

sort(sub_a,sub_a+n);
int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数
for(i=0;i<n;i++)
a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k为b[i]经离散化后对应的值

对于第3步,若离散化后序列为0,1,2,...,size - 1则用lower_bound,从1,2,3,...,size则用upper_bound。其中lower_bound返回第1个不小于b[i]的值的指针,而upper_bound返回第1个大于b[i]的值的指针,当然在这个题中也可以用lower_bound然后再加1得到与upper_bound相同结果,两者都是针对以排好序列。使用STL离散化大大减少了代码量且结构相当清晰。

以上为“数据中的离散化”的内容,如有不足望大家指出,例题日后会专门一篇文章的!








以上是关于离散化的主要内容,如果未能解决你的问题,请参考以下文章

离散化的认识

离散化

离散化总结

离散化

离散化

机器学习处理数据为什么把连续性特征离散化,离散化有何好处?