码迷,mamicode.com
首页 > 其他好文 > 详细

离散化

时间:2018-02-12 18:39:08      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:log   改变   方法   scan   没有   功能   排序   等于   算法   

什么是离散化?

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。例如:
原数据:1,999,100000,15;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};
处理后:{3,4},{2,6},{1,5};
以上来自百度百科

为什么要用离散化?

有些数据本身很大, 自身无法作为数组的下标保存对应的属性。

如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。

当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。

以上还是来自百度百科

STL实现简介

sort():排序。。。没啥好说的。。。

unique():unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序

上面的一个使用中已经给出该函数的一个使用方法,对于长度为n数组a,unique(a,a+n) - a返回的是去重后的数组长度

那它是怎么实现去重的呢?删除?

不是,它并没有将重复的元素删除,而是把重复的元素放到了数组的最后面

比如:1 4 2 6 5 7 2 4 7 1

sort后:1 1 2 2 4 4 5 6 7 7

unique后:1 2 4 5 6 7 1 2 4 7

lower_bound():很实用的函数。在一个左闭右开有序区间里进行二分查找,需要查找的值由第三个参数给出。

lower_bound返回的是被查序列中第一个大于等于查找值的指针,也就是返回指向被查值>=查找值的最小指针。

 code:

//先%一波ruotian大佬 

#include<cstdio>
#include<algorithm>

using namespace std;

int a[1005],n; //需要离散化的数组
int c[1005],tot; //c[i]是a[i]的副本 

int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i++) c[i] = a[i];
    sort(c + 1, c + n + 1);
    tot = unique(c + 1, c + n + 1) - (c + 1); //unique去重 
    for (int i = 1; i <= n; i++) a[i] = lower_bound(c + 1, c + tot + 1, a[i]) - c; //lower_bound二分找位置 
    for (int i = 1; i <= n; i++) printf("%d\n", a[i]);
    return 0;
}

 

离散化

标签:log   改变   方法   scan   没有   功能   排序   等于   算法   

原文地址:https://www.cnblogs.com/hkttg/p/8445019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!