0

0

C++怎么实现离散化_C++坐标压缩技巧【算法】

冰火之心

冰火之心

发布时间:2026-02-25 15:35:51

|

447人浏览过

|

来源于php中文网

原创

离散化本质是映射,即将稀疏原始值压缩为从0或1开始的连续整数序列;需先收集所有待离散值(含查询点、端点等),排序去重后用lower_bound查坐标,二维需分别处理x、y并独立建映射。

c++怎么实现离散化_c++坐标压缩技巧【算法】

离散化本质是映射,不是排序

离散化真正要解决的,是把一堆稀疏、可能极大(比如 1e9)或带负数的原始值,压缩成紧凑、从 01 开始的连续整数序列。它不依赖排序本身,但排序是最常用手段——因为只有排好序,才能去重 + 建立下标到值的映射关系。

常见错误是只做 sort + unique,却忘了用 lower_bound 把原值“查回去”。没这一步,离散化就只是扔掉了重复值,没完成坐标压缩。

  • 必须先收集所有待离散的值(包括查询点、端点、修改位置等),不能只对输入数组操作
  • vector 存原始数据,sort 后调用 unique 返回新尾迭代器,再用 erase 真删除
  • 每次查找用 lower_bound(v.begin(), v.end(), x) - v.begin(),结果就是压缩后的坐标

std::lower_bound 的边界行为必须确认

离散化后坐标从 0 开始,但如果你的原始数据里有比最小值还小的数(比如查询时传入非法值),lower_bound 会返回 v.begin(),减出来是 0 —— 这看起来像合法坐标,实则越界。这不是 bug,是设计如此,你得自己兜底。

  • 如果业务要求严格范围检查,查之前加 if (x v.back())
  • 若允许“插入不存在的值”,那 lower_bound 返回的下标就是它该在的位置,直接用没问题
  • 别用 upper_bound 替代,它返回的是第一个大于的下标,会导致相同值映射到不同坐标

重复值必须去重,但去重方式影响稳定性

离散化要求“相同原始值 → 相同压缩坐标”,所以去重不可省。但 unique 只移除相邻重复项,必须配合 sort 才生效;单独 unique 在未排序容器上等于白干。

Gatekeep
Gatekeep

Gatekeep AI是一个专注于将文本转化为教学视频的智能教学工具,主要用于数学和物理等学科的教育。

下载

立即学习C++免费学习笔记(深入)”;

  • 正确顺序: sort(v.begin(), v.end()); auto it = unique(v.begin(), v.end()); v.erase(it, v.end());
  • 不要用 set 替代:虽然自动去重+有序,但插入复杂度高,且无法保证后续 lower_bound 查找效率(set 不支持随机访问迭代器)
  • 若原始数据已部分有序(比如按时间戳追加),仍需全量 sort,不能只 merge,否则 unique 会漏掉非邻接重复

二维坐标压缩要分别处理 x 和 y

遇到点集(如 vector<pair int>></pair>)需要压缩,不能把 xy 拼成一个数再离散——比如 x=1000, y=2x=10, y=200 可能哈希冲突。必须拆开,各自建映射表。

  • 分别提取所有 x 值到 xs,所有 y 值到 ys,各自排序去重
  • 每个点 (x, y) 映射为 (lower_bound(xs.begin(), xs.end(), x) - xs.begin(), lower_bound(ys.begin(), ys.end(), y) - ys.begin())
  • 注意:压缩后二维索引仍是稀疏的,不能直接开二维数组,要用 map<pair>, T></pair> 或哈希表存

离散化最易被忽略的点,是“哪些值该进离散池”——漏掉查询中出现的坐标、区间端点、或者更新目标,压缩后查不到,程序就静默错。宁可多塞几个值,别省那几毫秒排序时间。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

830

2023.08.22

sort排序函数用法
sort排序函数用法

sort排序函数的用法:1、对列表进行排序,默认情况下,sort函数按升序排序,因此最终输出的结果是按从小到大的顺序排列的;2、对元组进行排序,默认情况下,sort函数按元素的大小进行排序,因此最终输出的结果是按从小到大的顺序排列的;3、对字典进行排序,由于字典是无序的,因此排序后的结果仍然是原来的字典,使用一个lambda表达式作为key参数的值,用于指定排序的依据。

404

2023.09.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

423

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

596

2023.08.10

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

77

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

46

2025.11.27

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

65

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.2万人学习

C 教程
C 教程

共75课时 | 5万人学习

C++教程
C++教程

共115课时 | 19.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号