离散化

离散化,把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。

使用的函数:

unique()函数:unique的作用是“去掉”容器中相邻元素的重复元素(不一定要求数组有序,可以先sort一下),它会把重复的元素添加到容器末尾(所以数组大小并没有改变),而返回值是去重之后的尾地址,由于返回的是容器末尾,所以如果想得到去重后的size,需要减去初始地址。

upper_bound 和lower_bound是二分查找,效率略高

upper_bound返回第一个大于的元素的下标; 
lower_bound返回第一个大于等于元素的下标;

#include <iostream>
#include <algorithm>//必须包含的头文件
using namespace std;
int main()
{
  int point[10] = {1,3,7,7,9};
  int tmp = upper_bound(point, point+5, 7) - point;//按从小到大,7最多能插入数组point的哪个位置 
  tmp = lower_bound(point, point+5, 7) - point;按从小到大,7最少能插入数组point的哪个位置 
  printf("%d\n",tmp); 
  return 0;
}

output:


2

 

离散化思想:因为数字太大,导致没有办法开那么大的数组,又因为数字个数并不多,这时候就可以对它们进行离散化,离散化是改变了数字的相对大小,例如,有500000个数字,他们的范围是0-1e9的,这样就满足离散化的条件。

就比如说,你可以开一个5e5的数组,但是你不能开一个1e9的数组。只改变这些数字的相对大小.
代码如下:

const int N=1e5+7;
int t[N],a[N];
int main()
{
  cin>>n;
  for(int i=1;i<=n;i++)
    cin>>a[i],t[i]=a[i];
  sort(t+1,t+n+1);
  m=unique(t+1,t+n+1)-t-1;  //减去第一个元素位置才是不重复数据的个数
  for(int i=1;i<=n;i++)
    a[i]=lower_bound(t+1,t+m+1,a[i])-t; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值