基础思维——离散化(附例题)

离散化是将无限空间中有限的个体映射到有限空间,以提高算法效率。文章介绍了两种离散化方法:去重与不去重,并通过例题详细解释了它们的应用,包括在坐标轴很长的场景下如何处理数据,以及在解决判定问题时如何利用离散化降低空间复杂度。最后,总结了离散化的重要性及其在程序设计中的作用。
摘要由CSDN通过智能技术生成
引论

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

例如:
原数据:1,999,100000000000,15;处理后:1,3,4,2;
原数据:{100,200},{20,50000},{1,400};
处理后:{3,4},{2,6},{1,5};

例如:
在一个坐标轴很长(>1e8),给你1e4个坐标,询问某一个点,坐标比它小的点有多少。我们只需要知道他们之间的相对大小就可以,这就需要离散化。

两种离散化方法(去重与不去重)
1、离散化——去重

理解思路
①、在 book 数组中记录出现的元素大小 tot。
②、对 book 数组进行从小到大排序,利用 unique函数对 book 数组进行去重,得到去重后的数组大小 c 。

//unique(book,book+n);
//前一个是当序列的相邻的数据相同时,删除相邻相同的数字。
sort(book, book+tot);
//必须先排序
int c = unique(book, book+tot) - book;

③、再对 book 数组进行从小到大排序,在 book 数组下找原数组 num 对应的下标即为离散数组 ans。

for (int i=0; i<n; i++) {
   
    ans[i] = lower_bound(book, book+c, num[i])-book;
}

离散化——去重:整合代码

#include<bits/stdc++.h>
using namespace std;
int ans[100010]={
   0};//离散化后数组
int num[100010], book[100010];
int n;

int main(){
   
	int n;
	scanf("%d", &n);
	for (int i=0; i<n; i++) {
   
	    scanf("%d",&num[i]);
	    book[i] = num[i];
	}
	 
	int c = unique(book, book+n) - book;
	sort
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值