离散化思想

news/2024/11/7 10:44:56/

给出一列数字,在有些情况下,这些数字的值的绝对大小不重要,而相对大小很重要。如班级的分数有99 98 97 95 96,排名为 1 2 3 5 4。

离散化是一种数据处理的技巧,它把分布广而稀疏的数据转换位密集分布,从而能够让算法更快速、更省空间地处理。

离散化地步骤:排序,离散化,归位。

如:               4000 210 11 45 800

  数组下标为  1         2     3    4   5

将它们存储在结构体中,在进行排序。

---------------------

排序:            11     45    210  800 4000

                        3          4       2     5     1

------------------------

离散化:       1        2         3        4      5

数组的下标:3         4         2       5       1

----------------------

归位  :        5          3          1        2    4     

数组下标       1          2           3       4     5

下面是代码解析:

#define _CRT_SECURE_NO_WARNINGS 1
//离散化
#include<bits/stdc++.h>
using namespace std;
const int N = 500010;
struct data1 {int val;int id; // 用坐标代替
}olda[N];
int newa[N];
bool cmp(data1 x, data1 y) { return x.val < y.val; }
int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &olda[i].val);olda[i].id = i;}sort(olda + 1, olda + 1 + n, cmp); //排序//离散化 + 归位 for (int i = 1; i <= n; i++) {newa[olda[i].id] = i;if (olda[i].val == olda[i - 1].val)newa[olda[i].id] = newa[olda[i - 1].id];}for (int i = 1; i <= n; i++)printf("%d", newa[i]);return 0;
}

用STL函数实现离散化:

lower_bound() 和 unique()函数实现离散化。

查找第1个等于或大于x的元素:lower_bound()且等于x。位置如 pos = lower_bound(a,a+n,x) - a。

unique()函数:

unique是 c++标准模板库STL中十分实用的函数之一,使用此函数需要#include <algorithm>头文件

该函数的作用是“去除”容器或者数组中相邻元素的重复出现的元素
(1) 这里的去除并非真正意义的erase,而是将重复的元素放到容器的末尾,返回值是去重之后的尾地址。 

注意这一点:它只对相邻的元素。
(2) unique针对的是相邻元素,所以对于顺序错乱的数组成员,或者容器成员,需要先进行排序,可以调用std::sort()函数。

#define _CRT_SECURE_NO_WARNINGS 1
//离散化
#include<bits/stdc++.h>
using namespace std;
const int N = 5000010;
int olda[N];
int newa[N];
int main() {int n;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d", &olda[i]);newa[i] = olda[i]; //这一步很关键}sort(olda + 1, olda + n + 1);//默认是从小到大 less<int>()int cnt = n; // 记录个数 调用unique函数时,是去重的数组//cnt = unique(olda + 1, olda + 1 + n) - (olda + 1);//返回不重复的尾元素 如  1 1 2 3 调用函数后 1 2 3 1 返回 3 for (int i = 1; i <= cnt; i++) {newa[i] = lower_bound(olda + 1, olda + 1 + n, newa[i]) - olda;}for (int i = 1; i <= cnt; i++) {printf("%d  ", newa[i]);}return 0;
}


http://www.ppmy.cn/news/9115.html

相关文章

Webrtc Native C++添加多个视频源,并实时切换

WebRTC的C++ API提供了一个rtc::VideoSourceInterface,它可以接收多个视频源,可以实时切换video0和video1。例如,可以使用以下步骤来实现: 创建一个rtc::VideoSourceInterface的实例。 使用AddOrUpdateSink()方法添加video0和video1视频源。 调用SwitchSource()方法来切换v…

Hi3861鸿蒙物联网项目实战:智能温度计

华清远见FS-Hi3861开发套件&#xff0c;支持HarmonyOS 3.0系统。开发板主控Hi3861芯片内置WiFi功能&#xff0c;开发板板载资源丰富&#xff0c;包括传感器、执行器、NFC、显示屏等&#xff0c;同时还配套丰富的拓展模块。开发板配套丰富的学习资料&#xff0c;包括全套开发教程…

重点算法排序之快速排序、归并排序(上篇)

文章目录 一、排序的概念及常见的排序算法 二、快速排序的思想及代码详解 2、1 快速排序的思想 2、2 挖坑法 2、2、1 挖坑法实现思想 2、2、2 挖坑法举例 2、2、3 挖坑法代码实现 2、3 左右指针法 2、3、1 左右指针法实现思想 2、3、2 左右指针法举例 2、3、3 左右指针法代码…

算法复杂度分析

目录 一、计算资源 1、第十三届蓝桥杯 Python 组题目的时空限制汇总 2、Python 与 C/C 、Java 的限制对比 3、时间和空间限制 4、测量代码的运行时间 二、算法定义 1、计算复杂度 2、有哪些复杂度 三、算法评估 1、分类 2、易解问题——难解问题&#xff1a;用多项…

ArrayList iterator源码分析,为什么迭代器删除元素不会报错

写这篇文章的原因要从前不久的一件事说起。 有一天&#xff0c;朋友问我&#xff0c;“ArrayList遍历中删除元素会怎么样”&#xff1f; 我当时脑子里第一想到的就是forEach这种循环方式&#xff0c;没多想就回答他&#xff1a;“当然会报错了。” 朋友再问&#xff1a;“如…

公司业财一体化详解

一、传统财务会计如何手工做账1.没有财务系统&#xff08;软件&#xff09;时公司会计用手工记账&#xff0c;流程包括&#xff1a;建立总账&#xff1b;首先建立账簿&#xff0c;登记会计账簿时&#xff0c;应当将会计凭证日期、编号、业务内容摘要、金额和其他有关资料逐项计…

STM32配置LED模块化

文章目录前言一、LED的模块化二、GPIO初始化详细解析三、LED代码封装总结前言 本篇文章将带大家深入了解GPIO的配置&#xff0c;并带大家实现LED模块化编程。 一、LED的模块化 什么叫模块化编程&#xff1f;我的理解就是每一个模块都分别写成对应的.c和.h文件&#xff0c;有…

【小程序】如何开发属于自己的一款小程序

文章目录小程序简介概念小程序与普通网页开发的区别微信开发者工具小程序代码构成项目结构JSON 配置文件WXML 模板WXSS 样式JS 逻辑交互小程序的宿主环境宿主环境简介通信模型运行机制组件常用的视图容器类组件常用的基础内容组件其它常用组件API协同工作小程序成员管理小程序的…