离散化
离散化:不关注数字本身,只关注大小关系时,利用排名代替原数据
本质:一种哈希,将离散的数字、浮点数,转换成 1 − n 1-n 1−n
例如:【 100 , 200 , 300 , 400 , 500 100,200,300,400,500 100,200,300,400,500】,离散化后为【 1 , 2 , 3 , 4 , 5 1,2,3,4,5 1,2,3,4,5】
所有仅关注偏序关系的题目,均可以先离散化
- 一般不会单独考离散化,会结合树状数组、线段树等结构一起考
- 先离散化后数组变成 1 − n 1-n 1−n,此时可以当作下标
数组 a a a 的离散化步骤:
- 把 a a a 拷贝一份设置为 b b b
- 对 b b b 排序、去重
- 把 a a a 中每个元素设置为 b b b 数组中的下标(二分查找)
写法一:
from bisect import bisect_left
def Discrete(a):""":param a: 输入列表a:return: 返回离散后的结果"""# 拷贝一份b,排序去重b = list(set(a))b.sort()ans = []# 对a中的每个元素x,将x转换成b列表中的下标for x in a:ans.append(bisect_left(b, x))return ans
写法二:
def Discrete(a):""":param a: 输入列表a:return: 返回离散后的结果"""# 拷贝一份b,排序去重b = list(set(a))b.sort()ans = []value = list(range(len(b)))dic = dict(zip(b, value))# 对a中的每个元素x,将x转换成b列表中的下标for x in a:ans.append(dic[x])return ans
详见个人博客内容:离散化