离散化

离散化有很大的局限性(目前以个人认知来说),几乎只适合在树状数组求逆序对使用。

离散化概念

离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。
通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。

离散化实现

建立一个结构体包含\(val\)\(id\)\(val\)就是输入的数,\(id\)表示输入的顺序。然后按照\(val\)从小到大排序,如果\(val\)相等,那么就按照\(id\)从小到大排序。

如果不明白我们可以举了个例子:

结构体内:
val 10 100 1 6
id 1 2 3 4
排序后结构体内:
val 1 6 10 100
id 3 4 1 2
两者的逆序对都是:4

总结一下:把原序列中每个元素的值和下标存到结构体内,之后把数组按元素值从小到大排序,数值相同\(id\)小的在前,这样得到的结点的下标值即是离散化结果,等同于原序列的数值。

//val数值    id下标   n 原数组大小
struct node{
	int val, id;
	bool operator < (const node & rhs) const{
		return (this->val < rhs.val) || (this->val == rhs.val && this->id < rhs.id);
	}
}arr[MAXN];

for(int i = 1; i <= n; i++){
	cin >> arr[i].val;
	arr[i].id = i;
}
sort(arr+1,arr+1+n);
for(int i = 1; i <= n; i++){
	cout << arr[i].id << " ";
}
posted @ 2021-05-09 13:08  h星宇  阅读(176)  评论(0编辑  收藏  举报