离散化

#include <iostream>
#include <algorithm>

using namespace std;

int* a, * d, * c, n,ctop;
//a原数组 d为排序后的数组 c为去重后的数组

int bin_search(int target) {
	int l = 1, r = ctop;
	while (l < r) {
		int mid = l + r >> 1;
		if (c[mid] >= target)r = mid;
		else l = mid + 1;
	}
	return l;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	a = new int[n + 5];
	d = new int[n + 5];
	c = new int[n + 5];
	for (int i = 1; i <= n; i++)cin >> a[i], d[i] = a[i];
	sort(d + 1, d + 1 + n);
	for (int i = 1; i <= n; i++)
		if (d[i] != d[i - 1] || i == 1)c[++ctop] = d[i];
	for (int i = 1; i <= n; i++) {
		int x = bin_search(a[i]);
		a[i] = x;
	}
	for (int i = 1; i <= n; i++)cout << a[i] << ' ';
	delete[] a;
	delete[] d;
	delete[] c;
	return 0;
}

关于离散化

就是把大的数据按大小排序后的序号重新赋值,将其映射到一个较小的空间
步骤:

  1. 排序
  2. 去重
  3. 在去重后的数组里确定原数组每个数的位置,那个位置(即下标)就是离散化后的值

说明

排序去重,即保证原数组每个数(这些数可能有重复)在步骤3中能被唯一确定或者方便获取离散化后的值
最后在去重后的数组中二分查询原数组每个数,得到下标,下标即每个数的排名,即离散化后的值。

完结散花 ❀

posted @ 2024-07-27 19:45  槿梶  阅读(2)  评论(0编辑  收藏  举报