您的位置:首页 > 编程语言 > C语言/C++

离散化————实现梦想的算法

2020-04-13 12:11 253 查看

【今日推荐】:为什么一到面试就懵逼!>>>

离散化

一、概述

离散化是一个非常重要的思想,可以实现很多你本来无法实现的操作(本蒟蒻原因懒惰不想学习离散化,但它真的可以让你的很多想法实现);

比如:你有10^4个数,每个数大小不超过10^10,要对这些数进行一些操作,如果开10^10的数组作为桶肯定是会爆掉的,而10^4的数组是完全ok;

 

 

定义:离散化,是把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。(by别人的博客)

其实就是在不改变数据相对大小的条件下,将数据进行缩小。

举个栗子:

 

原数据:555555,666666,888888,222222;处理后:2,3,4,1;

原数据:{887755,669955},{123456,456789},{654321,789456};

处理后:{6,4},{1,2},{3,5};

 

 

二、原理与操作

1、排序

2、去重

3、索引

 

首先我们用sort进行排序

sort(sy+1,sy+n+1);

 

然后是去重操作,为了高效,我们采用两个STL函数:unique()和lower_bound(),

它们同属于#include<algorithm>

#include<algorithm>//unique和lower_bound的库

int size=unique(sy+1,sy+n+1)-sy;//unique显示去重后的个数

lsh[i]=lower_bound(sy+1,sy+size+1,lshcopy[i])-sy;//即lsh为lshcopy离散化后对应的值

 

则全体代码如下

#include<iostream>
#include<cstdio>
#include<algorithm>//unique和lower_bound的库

using namespace std;

int lsh[1000],lshcopy[1000],sy[1000];//sy是即将被离散化的数组,lshcop是lsh的副本,lsh用于排序去重后提供离散化后的值

int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&sy[i]);
lshcopy[i]=sy[i];
}
sort(sy+1,sy+n+1);//第一步排序
int size=unique(sy+1,sy+n+1)-sy-1;//unique显示去重后的个数
for(int i=1;i<=n;i++) {
lsh[i]=lower_bound(sy+1,sy+size+1,lshcopy[i])-sy;//即lsh为lshcopy离散化后对应的值
printf("%d ",lsh[i]);
}
}

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  amp c++