离散化

背景引入

对于一个数字序列,如果我们只关心他们之间的相对大小,而不关心具体数值,并且直接使用原数值会对我们的解决方案产生影响,此时我们采用离散化

具体步骤

即将一个原数组映射到另一个等大的数组中,并且两个数组数字之间的大小关系不变
如:原序列= [ 12 4 80 7 6 11 4 5*10e10] 可以映射成: [5 1 6 3 2 4 1 7]

代码详解

#include <algorithm>
#include <iostream>
using namespace std;
bool cmp(int a, int b) {
	return a < b;
}
int main() {
	int n = 8;
	int arr[] = {12, 4, 80, 7, 6, 11, 4, int(5 * 10e10)};
	int sorted[n];
	copy(arr, arr + n, sorted);
	sort(sorted, sorted + n, cmp);
	for (int i = 0; i < n; i++) {
		arr[i] = lower_bound(sorted, sorted + n, arr[i]) - sorted + 1;
	}
	return 0;
}

解释

在上述代码中,我们先构建了一个原数组的排序,即sorted = [4 4 6 7 11 12 80 5*10e10]
通过代码

for (int i = 0; i < n; i++) {
		arr[i] = lower_bound(sorted, sorted + n, arr[i]) - sorted + 1;
	}

我们先获得的arr[i]在sorted中的第一个不大于它的迭代器(指针),比如对于arr[i]=7,先返回指向sorted中的7的指针,减去sorted就会得到7在sorted中的位置n,即*(sorted+n) = 7,再加一就得到是第几个数字,这样就可以把原数组映射到一个连续且等于其长度的数组中了

posted @ 2023-11-10 23:43  我没有存钱罐  阅读(9)  评论(0编辑  收藏  举报