引入

离散化,就是把一些很离散的点给重新分配。

举个例子,如果一个坐标轴很长(>1e10),给你1e4个坐标,询问某一个点,坐标比它小的点有多少。

很容易就知道,对于1e4个点,我们不必把他们在坐标轴上的位置都表示出来,因为我们比较有多少比它小的话,只需要知道他们之间的相对大小就可以,而不是绝对大小,这,就需要离散化。

而离散化又分为两种,分为的两种是对于重复元素来划分的。第一种是重复元素离散化后的数字相同,第二种就是不同。

第一种

其实就是用一个辅助的数组把你要离散的所有数据存下来。

然后排序,排序是为了后面的二分。

去重,因为我们要保证相同的元素离散化后数字相同。

再用二分把离散化后的数字放回原数组。

代码如下。

#include<algorithm> // 头文件
//n 原数组大小 num 原数组中的元素 lsh 离散化的数组 cnt 离散化后的数组大小
int lsh[MAXN] , cnt , num[MAXN] , n;
for(int i=1; i<=n; i++) {scanf("%d",&num[i]);lsh[i] = num[i];
}
sort(lsh+1 , lsh+n+1);
cnt = unique(lsh+1 , lsh+n+1) - lsh - 1;
for(int i=1; i<=n; i++)num[i] = lower_bound(lsh+1 , lsh+cnt+1 , num[i]) - lsh;

注意事项:

1.去重并不是把数组中的元素删去,而是重复的部分元素在数组末尾,去重之后数组的大小要减一

2.二分的时候,注意二分的区间范围,一定是离散化后的区间

3.如果需要多个数组同时离散化,那就把这些数组中的数都用数组存下来

第二种

第二种方式其实就是排序之后,枚举着放回原数组

用一个结构体存下原数和位置,按照原数排序

我结构体里面写了个重载,也可以写一个比较函数

最后离散化后数在rank[]rank[]里面

#include<algorithm>
struct Node {int data , id;bool operator < (const Node &a) const {return data < a.data;}
};
Node num[MAXN];
int rank[MAXN] , n;
for(int i=1; i<=n; i++) {scanf("%d",&num[i].data);num[i].id = i;
}
sort(num+1 , num+n+1);
for(int i=1; i<=n; i++)rank[num[i].id] = i;

总结

先送一道有离散化的题:Luogu1955

很水的一道题,解析在这:NOI2015程序自动分析

用的最多的是第一种方法,第二种方法感觉比较陌生,不过还是需要学的。(20190506第二种方法On啊,,第一种是nlogn的,但是第二种方法只适用于无重复元素的。对于第一种方法,当所有a[i]<2e6这样子时,可以开数组预处理一下每个数的位置,也可以优化到nlogn预处理之后单次查询O1,有的同学说,那你a[i]<2e6了,直接开数组不就行了吗还要啥离散化,但是你别忘了,你万一是个二维数组呢?怎么开?比如这个题【CodeForces - 255C】)。

转自https://blog.csdn.net/weixin_43061009/article/details/82083983

算法笔记 -- 离散化相关推荐

  1. python决策树 value_机器学习 | 算法笔记(四)- 决策树算法以及代码实现

    概述 上一篇讲述了<机器学习 | 算法笔记(三)- 支持向量机算法以及代码实现>,本篇讲述机器学习算法决策树,内容包括模型介绍及代码实现. 决策树 决策树(Decision Tree)在机 ...

  2. 《算法笔记》——笔记

    算法笔记 胡凡 曾磊 主编 机械工业出版社 文章目录 算法笔记 C/C++快速入门 提醒 memset sscanf与sprintf 引用 浮点数的比较 圆周率 复杂度 黑盒测试 入门篇(1)--入门 ...

  3. DSML_分类算法笔记之逻辑回归模型

    其他相关文章 DS&ML_关联分析笔记 DS&ML_分类算法笔记之支持自动机SVM模型 DS&ML_分类算法笔记之随机森林.梯度提升树.XGBoost模型 DS&ML_ ...

  4. 《算法笔记》中文版 - 包括数组,链表,树,图,递归,DP,有序表等相关数据结构与算法的讲解及代码实现...

    来源:专知本文为资源,建议阅读5分钟本文为你分享<算法笔记>中文版. https://github.com/Dairongpeng/algorithm-note 目录概览 第一节 复杂度. ...

  5. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  6. 数据结构与算法笔记(十六)—— 二叉搜索树

    一.二叉搜索树定义 二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). 二叉搜索树是具有有以下性质的二叉树: 若左子树不为空,则左子树上所有节点的 ...

  7. 数据结构与算法笔记(十五)—— 散列(哈希表)

    一.前沿 1.1.直接寻址表 当关键字的全域U比较小时,直接寻址是一种简单而有效的技术.假设某应用要用到一个动态集合,其中每个元素都有一个取自全域U={0,1,-,m-1)的关键字,此处m是一个不很大 ...

  8. 《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

  9. 【算法】《algorithm-note》算法笔记中文版正式发布!

    无论是做机器学习.深度学习.自然语言处理还是其它领域,算法的重要性不言而喻!吃透算法底层原理.掌握算法数学推导和代码实现,对提高自己的硬核实力来说非常重要!今天给大家推荐一个超赞的开源算法笔记!中文版 ...

最新文章

  1. CUDA Samples: Calculate Histogram(atomicAdd)
  2. 基于ncat的简易web服务器
  3. 字节跳动2018校招算法方向(第一批) —— 1-最外层点
  4. 阿里MySQL读写一致_缓存与数据库读写一致的解决方案
  5. 软件项目管理第4版课后习题[附解析]第七章
  6. C++封装继承多态理解
  7. 跟父亲一样伟大的程序员,请一定要照顾好自己!
  8. C++-从cpp文件到exe文件的过程
  9. 基于FPGA的虚拟示波器的设计
  10. Python sklearn针对不同人群的差异化保险费用定价方案
  11. 独立站SaaS建站模式是什么
  12. 深圳连续社保的重要性 - 社保为什么不能中断
  13. C++ 字符跑酷#3 游戏制作实录
  14. 什么是数据中心核心交换机?与普通交换机有什么区别?
  15. AbortController-中止请求
  16. ajax请求是宏任务还是微任务_好程序员web前端学习路线分享了解AJAX是什么
  17. stl排序之sort函数
  18. JavaWeb开发专题(一)-JavaWeb入门
  19. 【Python】【技能树评测】技巧实例-说明改进和实践【02】 - 类的初始化和初始化参数
  20. [MYSQL]完犊子了,索引不生效了

热门文章

  1. [Leetcode][第977题][JAVA][有序数组的平方][排序][双指针]
  2. HDU odd-even number 数位dp
  3. ad19原理图标注_AD19中原理图的模板如何进行编辑?
  4. mysql 字典索引_【大白话mysql】你真的了解 mysql 索引吗?
  5. app推送以及提示音java,springboot 整合 Jpush 极光推送
  6. python ckeditor上传图片400错误_又一款python开发神器
  7. HEC-RAS二维溃坝洪水模拟(尾矿库)
  8. java 读取list文本_【java基础】读取本地文件赋给Bean或list、Map
  9. sip消息概念(一)
  10. wince串口驱动分析(转)