离散化概念:
离散化:把无限空间中有限的个体映射到有限的空间中去,以此来提高算法的时空效率。
是不是看起来难以理解,没关系,我们通俗一点讲,就是在不改变一组数相对大小关系的情况下,对数据进行相应的缩小。大家可以看以下百科。https://baike.baidu.com/item/%E7%A6%BB%E6%95%A3%E5%8C%96/10501557
讲解:
例:
原数据:1 10000 999 15
处理后:1 4 3 2
还是有点蒙?
那就在细讲一下,为什么原数据处理后成了这个样子,从上表中,我们不难看出原数据在经过离散化的处理后,变小了(有点直白)。
那为什么会这样呢,其实,就是
先把原数组排序:将 1 10000 999 15 排成 1 15 999 10000 (注意!!一般情况按从小到大的顺序来排列(升序))
然后,再处理过的序列当中去找原数据的位置 -------- 下方
下标: 1 2 3 4
处理后数据: 1 15 999 10000
这样1就变成了1,15变成了2.....
接着,再按原数组的顺序来排,1(1),10000(4),999(3),15(2),排起来就是
1,4,3,2。其实,就是找数据再原数组中的排第几(升序)。
练习1:
测试一下所学内容吧 :
原数据:1 2 3 4 离散化后:1 2 3 4
4 3 2 1 4 3 2 1
10000 9999 8 706 4 3 1 2
小测试:
离散化I
时间限制:1秒 内存限制:128M
题目描述
现有数列A1,A2,…,An,数列中可能有重复元素。
现在要求输出该数列的离散化数列,重复元素离散化后的数字相同。
输入描述
第一行,一个整数n(1<= n <= 10^5)。
第二行,n个整数A1,A2,…,An,(-10^9 <= Ai <= 10^9)。
输出描述
一行,包括n个整数。表示数列对应的离散化数列,重复元素离散化后的数字相同。
样例
输入
6
1 23424 242 65466 242 0
输出
1 3 2 4 2 0
上代码!
解题思路
讲一下我的解题思路,首先,离散化排序要保证数组内没有重复,可以用STL函数库里的去重函数unique,接着进行sort排序,在这里提醒一下大家,在输入原数组时,要再建一个数组,赋上原数组的值,方便后期能够排序,并从排好序的数组中找原数据的值(注意!!要排新建的数组)。
在这里,又要用到二分查找中的lower_bound函数,返回第一个不小于value的值。
(具体unique函数和lower_bound函数的用法及讲解,可自行搜索,我后期也会在出的)
今天,你都收获了什么呢?