离散化C++

离散化(Discretization)是一种将连续数据映射到离散值的技术,常用于将大数据范围压缩到较小范围,例如将数值映射到索引。离散化在算法竞赛中常用于处理数值范围较大但数据量较小的问题(如区间问题、统计问题等)。

以下是离散化的模板和示例:


1. 离散化的基本步骤

  1. 排序:将所有需要离散化的值排序。
  2. 去重:去除重复的值。
  3. 映射:通过二分查找将原始值映射到离散化后的索引。

2. 离散化模板

2.1 使用 std::vectorstd::unique

#include <iostream>
#include <vector>
#include <algorithm>// 离散化函数
std::vector<int> discretize(std::vector<int>& nums) {// 1. 排序std::vector<int> sorted_nums = nums;std::sort(sorted_nums.begin(), sorted_nums.end());// 2. 去重auto last = std::unique(sorted_nums.begin(), sorted_nums.end());sorted_nums.erase(last, sorted_nums.end());// 3. 映射std::vector<int> result(nums.size());for (size_t i = 0; i < nums.size(); i++) {result[i] = std::lower_bound(sorted_nums.begin(), sorted_nums.end(), nums[i]) - sorted_nums.begin();}return result;
}int main() {std::vector<int> nums = {100, 200, 50, 100, 300, 50};// 离散化std::vector<int> discretized = discretize(nums);// 输出结果std::cout << "Original: ";for (int num : nums) {std::cout << num << " ";}std::cout << std::endl;std::cout << "Discretized: ";for (int num : discretized) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

输出:

Original: 100 200 50 100 300 50 
Discretized: 1 2 0 1 3 0 

2.2 离散化后还原原始值

如果需要还原离散化后的值,可以通过离散化数组进行映射。

#include <iostream>
#include <vector>
#include <algorithm>// 离散化函数
std::pair<std::vector<int>, std::vector<int>> discretizeWithMap(std::vector<int>& nums) {// 1. 排序std::vector<int> sorted_nums = nums;std::sort(sorted_nums.begin(), sorted_nums.end());// 2. 去重auto last = std::unique(sorted_nums.begin(), sorted_nums.end());sorted_nums.erase(last, sorted_nums.end());// 3. 映射std::vector<int> result(nums.size());for (size_t i = 0; i < nums.size(); i++) {result[i] = std::lower_bound(sorted_nums.begin(), sorted_nums.end(), nums[i]) - sorted_nums.begin();}return {result, sorted_nums};
}int main() {std::vector<int> nums = {100, 200, 50, 100, 300, 50};// 离散化auto [discretized, map] = discretizeWithMap(nums);// 输出结果std::cout << "Original: ";for (int num : nums) {std::cout << num << " ";}std::cout << std::endl;std::cout << "Discretized: ";for (int num : discretized) {std::cout << num << " ";}std::cout << std::endl;std::cout << "Map: ";for (int num : map) {std::cout << num << " ";}std::cout << std::endl;// 还原离散化后的值std::cout << "Reconstructed: ";for (int num : discretized) {std::cout << map[num] << " ";}std::cout << std::endl;return 0;
}

输出:

Original: 100 200 50 100 300 50 
Discretized: 1 2 0 1 3 0 
Map: 50 100 200 300 
Reconstructed: 100 200 50 100 300 50 

3. 离散化的应用场景

3.1 区间问题

离散化常用于处理区间问题,例如区间合并、区间查询等。

#include <iostream>
#include <vector>
#include <algorithm>// 区间合并
std::vector<std::pair<int, int>> mergeIntervals(std::vector<std::pair<int, int>>& intervals) {if (intervals.empty()) return {};// 离散化std::vector<int> nums;for (const auto& interval : intervals) {nums.push_back(interval.first);nums.push_back(interval.second);}auto [discretized, map] = discretizeWithMap(nums);// 区间合并std::sort(intervals.begin(), intervals.end());std::vector<std::pair<int, int>> merged;for (const auto& interval : intervals) {if (merged.empty() || merged.back().second < interval.first) {merged.push_back(interval);} else {merged.back().second = std::max(merged.back().second, interval.second);}}return merged;
}int main() {std::vector<std::pair<int, int>> intervals = {{1, 3}, {2, 6}, {8, 10}, {15, 18}};// 区间合并auto merged = mergeIntervals(intervals);// 输出结果std::cout << "Merged Intervals: ";for (const auto& interval : merged) {std::cout << "[" << interval.first << ", " << interval.second << "] ";}std::cout << std::endl;return 0;
}

输出:

Merged Intervals: [1, 6] [8, 10] [15, 18] 

3.2 统计问题

离散化可以用于统计某个范围内数据的频率。

#include <iostream>
#include <vector>
#include <algorithm>// 统计频率
std::vector<int> countFrequency(std::vector<int>& nums) {// 离散化auto [discretized, map] = discretizeWithMap(nums);// 统计频率std::vector<int> freq(map.size(), 0);for (int num : discretized) {freq[num]++;}return freq;
}int main() {std::vector<int> nums = {100, 200, 50, 100, 300, 50};// 统计频率auto freq = countFrequency(nums);// 输出结果std::cout << "Frequency: ";for (int count : freq) {std::cout << count << " ";}std::cout << std::endl;return 0;
}

输出:

Frequency: 2 2 1 1 

4. 总结

  • 离散化的核心步骤是排序、去重和映射。
  • 离散化可以用于处理区间问题、统计问题等。
  • 通过离散化,可以将大数据范围压缩到较小范围,提高算法效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/10426.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验八 JSP访问数据库

实验八 JSP访问数据库 目的&#xff1a; 1、熟悉JDBC的数据库访问模式。 2、掌握使用My SQL数据库的使用 实验要求&#xff1a; 1、通过JDBC访问mysql数据&#xff0c;实现增删改查功能的实现 2、要求提交实验报告&#xff0c;将代码和实验结果页面截图放入报告中 实验过程&a…

RabbitMQ5-死信队列

目录 死信的概念 死信的来源 死信实战 死信之TTl 死信之最大长度 死信之消息被拒 死信的概念 死信&#xff0c;顾名思义就是无法被消费的消息&#xff0c;一般来说&#xff0c;producer 将消息投递到 broker 或直接到queue 里了&#xff0c;consumer 从 queue 取出消息进…

【项目初始化】

项目初始化 使用脚手架创建项目Vite创建项目推荐拓展 使用脚手架创建项目 Vite Vite 是一个现代的前端构建工具&#xff0c;它提供了极速的更新和开发体验&#xff0c;支持多种前端框架&#xff0c;如 Vue、React 等创建项目 pnpm create vuelatest推荐拓展

一文读懂 Faiss:开启高维向量高效检索的大门

一、引言 在大数据与人工智能蓬勃发展的当下&#xff0c;高维向量数据如潮水般涌现。无论是图像、音频、文本&#xff0c;还是生物信息领域&#xff0c;都离不开高维向量来精准刻画数据特征。然而&#xff0c;在海量的高维向量数据中进行快速、准确的相似性搜索&#xff0c;却…

基于Django的Boss直聘IT岗位可视化分析系统的设计与实现

【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言&#xff0c;利用Django这一高效、安全的W…

python 语音识别

目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…

栈和队列特别篇:栈和队列的经典算法问题

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…

使用 OpenResty 构建高效的动态图片水印代理服务20250127

使用 OpenResty 构建高效的动态图片水印代理服务 在当今数字化的时代&#xff0c;图片在各种业务场景中广泛应用。为了保护版权、统一品牌形象&#xff0c;动态图片水印功能显得尤为重要。然而&#xff0c;直接在后端服务中集成水印功能&#xff0c;往往会带来代码复杂度增加、…

C++并行化编程

C并行化编程 C 简介 C 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言&#xff0c;支持过程化编程、面向对象编程和泛型编程。 C 被认为是一种中级语言&#xff0c;它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美…

Java开发vscode环境搭建

1 几个名词 JDK Java Development Kit JRE Java Runtion Environment JVM JDK 包括 Compiler,debugger,JRE等。JRE包括JVM和Runtime Library。 2 配置环境 2.1 安装JDK 类比 C/C的 g工具 官网&#xff1a;https://www.oracle.com/java/technologies/downloads/ 根据自己使…

pytorch基于FastText实现词嵌入

FastText 是 Facebook AI Research 提出的 改进版 Word2Vec&#xff0c;可以&#xff1a; ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码&#xff08;基于中文语料&#xff09;&#xff0c;包含&#xff1…

riscv xv6学习笔记

文章目录 前言util实验sleeputil实验pingpongutil实验primesxv6初始化代码分析syscall实验tracesyscall实验sysinfoxv6内存学习笔记pgtbl实验Print a page tablepgtbl实验A kernel page table per processxv6 trap学习trap实验Backtracetrap实验Alarmlazy实验Lazy allocationxv…

FFmpeg(7.1版本)编译:Ubuntu18.04交叉编译到ARM

一、本地编译与交叉编译 1.本地编译 ① 本地编译&#xff1a;指的是在目标系统上进行编译的过程 , 生成的可执行文件和函数库只能在目标系统中使用。 如 : 在 Ubuntu中&#xff0c;本地编译的可执行文件只能在Ubuntu 系统中执行 , 无法在 Windows / Mac / Android / iOS 系…

创新创业计划书|建筑垃圾资源化回收

目录 第1部分 公司概况........................................................................ 1 第2部分 产品/服务...................................................................... 3 第3部分 研究与开发.................................................…

如何利用天赋实现最大化的价值输出

这种文章&#xff0c;以我现在的实力很难写出来。所以需要引用一些视频。 上92高校容易吗 如果基于天赋努力&#xff0c;非常容易。 如果不是这样&#xff0c;非常非常难。 高考失败人生完蛋&#xff1f;复读考上交大&#xff0c;进入社会才发现学历只是一张纸&#xff0c;98…

LigerUI在MVC模式下的响应原则

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的开发模式&#xff0c;但是也具有其特色的侦听函数&#xff0c;那么当LigerUI作为View层的时候&#xff0c;他所发送后端的必然是表单的数据&#xff0c;在此我们以俩个div为例&#xff1a; {Layout "~/View…

【力扣】49.字母异位词分组

AC截图 题目 思路 由于互为字母异位词的两个字符串包含的字母相同&#xff0c;因此对两个字符串分别进行排序之后得到的字符串一定是相同的&#xff0c;故可以将排序之后的字符串作为哈希表的键。 可以遍历strs&#xff0c;将其中每一个str排序&#xff0c;然后用unodered_ma…

docker安装nacos2.2.4详解(含:nacos容器启动参数、环境变量、常见问题整理)

一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull nacos:2.2.4 2、离线包下载 两种方式&#xff1a; 方式一&#xff1a; -&#xff09;在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -&#xff09;导出 # 导出镜像到…

【图床配置】PicGO+Gitee方案

【图床配置】PicGOGitee方案 文章目录 【图床配置】PicGOGitee方案为啥要用图床图床是什么配置步骤下载安装PicGoPicGo配置创建Gitee仓库Typora中的设置 为啥要用图床 在Markdown中&#xff0c;图片默认是以路径的形式存在的&#xff0c;类似这样 可以看到这是本地路径&#x…

【C++】类与对象(下)

&#x1f984; 个人主页: 小米里的大麦-CSDN博客 &#x1f38f; 所属专栏: 小米里的大麦——C专栏_CSDN博客 &#x1f381; 代码托管: 小米里的大麦的Gitee仓库 ⚙️ 操作环境: Visual Studio 2022 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键…