离散化————实现梦想的算法
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]); } }
相关文章推荐
- 通过离散化来实现桶的优化算法(特殊处理)
- 算法基础:删除字符串中出现次数最少的字符(Golang实现)
- 算法思想 算法重要的是思维,不是程序的实现
- 机器学习KNN算法原理及实现
- 图像细化算法 opencv实现 完整代码(附实验结果)
- 算法与数据结构基础11:C++实现——二拆搜索树节点删除
- LRU 算法实现
- 如何在Cocos2D游戏中实现A*寻路算法(一)
- Java实现十进制数转化为二进制数的算法
- 关于算法4中重定向在eclipse中的实现
- 算法(第四版)笔记<一>-------动态队列的数组实现(Java语言)
- 编程珠玑第二章的算法实现
- DES加密与解密算法的实现
- KNN算法工作原理及实现
- 链表(上):如何用链表来实现LRU缓存淘汰算法?
- 【算法】用固定数组实现FIFO buffer
- 实用算法实现-第 25 篇 最大公约数
- 算法基础之插入排序(GO实现)
- 【LeetCode-面试算法经典-Java实现】【05-Longest Palindromic Substring(最大回文字符串)】
- 如何在Cocos2D游戏中实现A*寻路算法(六)