离散化算法

news2024/11/20 9:15:17

目录

算法原理

算法模板

1)手工编码

2)c++用STL函数实现离散化

附录:


算法原理

        给出一列数字,在有些情况下,这些数字的值得绝对大小不重要,而相对大小很重要。例如,对一个班级学生的成绩进行排名,此时不关心成绩的绝对值,只需要输出排名,如分数为{95,50,72,21},排名为{1,3,2,4}。

        离散化就是用数字得相对值替代他们得绝对值。离散化是一种数据处理的技巧。

它把分布广而稀疏的数据转换为密集分布,从而能够让算法更快速、更省空间地处理。

例如,(4000,201,11,45,830),数字的分布很稀疏,按大小排序为(5,3,1,2,4),若算法处理的是数字的相对位置问题,那么对后者的处理更容易。

离散化步骤如下

1)排序:首先需要对数列排序,排序后才能确定相对大小。

2)离散化:把排序后的数列元素从 1开始逐个分配数值,完成离散化。

3)归位:把离散化后的每个元素放回原始位置,结束。图 2.15 演示了把(4000,201,11,45,830)离散化为(5,3,1,2,4)的过程。带下画线的字记录了原始位置,相当于数据的原始地址,最后的归位需要利用这些下画线数字。

                

算法模板

1)手工编码

给定得数列中经常有重复的数据,如{4000,201,11,45,11}.数字11重复了,可以分为两种情况进行离散化

1)一般把相同的数据离散化为相同的数据,即把{4000,201,11,45,11}.离散化为{5,4,1,3,1}.

下面是代码,其中olda[]记录原始数据,newa[]是离散化的结果。

#include<stdio.h>
#define N  500010   //自己定义一个范围
struct node{
  int val;              //元素的值
  int id;               //元素的位置
}olda[N]; //离散化之前的原始数据

int newa[N]; //离散化后的结果

int cmp(const void *a,const void *b)
	{ 
	 struct node *aa = (struct node *)a;
     struct node *bb = (struct node *)b;
     return (((aa->val) > (bb->val)));	
	}
	
int main(){
 	int n;      
	scanf("%d",&n);                  //读元素个数
    for(int i=1;i<=n;i++)
	{
        scanf("%d",&olda[i].val);                //读元素的值
        olda[i].id = i;                          //记录元素的位置
	}
	qsort(&olda[1],n,sizeof(olda[1]),cmp);             //对元素的值排序
    for(int i=1;i<=n;i++)
	{                       //生成 newa[]
		newa[olda[i].id]=i; //这个元素原来的位置在olda[i].id,把它的值赋为i,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;
}

2)有时要求后出现的数据比先出现的大,即把{4000,201,11,45,11}.离散化为{5,4,1,3,2}.把上面的代码的倒数第六七行注释即可。

对于c++玩家,若需要对重复的数据进行去重,可以使用unique函数

2)c++用STL函数实现离散化

可以用 STL的 lower bound()和unique函数实现离散化。
lower_bound()函数的功能是在有序的数列中查找某个元素的相对位置。这个位置正好是做离散化时元素初值对应的新值。
有时还需要用 unique()函数去重,下面分别讨论不去重和去重情况下的操作。
(1)不去重,把相同的数据离散化为相同的数据。把(4000,201,11,45,11)离散化为(5,4,1,3,1),代码如下。

#include<bits/stdc++.h>
using namespace std;
const int N = 500010;  // 自己定义一个范围
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+1+n);         //排序
    int cnt = n;
  //cnt = unique(olda+1,olda+1+n)-(olda+1);  //去重,cnt是去重后的数量
    for(int i=1;i<=cnt;i++)                  //生成 newa[]
		newa[i]=lower_bound(olda+1,olda+1+n,newa[i])-olda; 
                   //查找相等的元素的位置,这个位置就是离散化后的新值
    for(int i=1;i<=cnt;i++)   printf("%d ",newa[i]);   //打印出来看看        
    printf("\n cnt=%d",cnt);    
    return 0;
}

2)去重,把相同的数据离散化为一个数据,上述代码加上第14行的去重功能后,离散化为{4,3,1,2}

附录:

               

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片加水印怎么弄?这些图片加水印方法分享给你

相信很多小伙伴平常会喜欢将自己拍摄的作品上传到社交平台上与他人分享吧。然而有时会遇到自己辛苦拍摄的视频或者图片被他人盗用&#xff0c;甚至是获利的情况。其实想要避免自己的作品被他人盗用&#xff0c;我们可以在作品上面添加专属自己的水印&#xff0c;不仅可以给作品…

Java学生成绩管理系统

1、内容要求 编写一个学生成绩管理系统。学生的属性包括学号、姓名、年龄等。每个学生要学习若干课程&#xff0c;每门课程有平时成绩、期中考试成绩、期末考试成绩以及总评成绩&#xff0c;其中总评成绩平时成绩*30%期中成绩*30%期末成绩*40%。请先设计合理的类存放这些信息&a…

Span-level Bidirectional Network(2022 EMNLP)

论文题目&#xff08;Title&#xff09;&#xff1a;A Span-level Bidirectional Network for Aspect Sentiment Triplet Extraction 研究问题&#xff08;Question&#xff09;&#xff1a;方面情感三元组提取(ASTE)是一种新的细粒度情感分析任务&#xff0c;旨在从评论句中提…

【ML】机器学习中的十大深度学习算法

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

RTOS多任务切换实现

实现任务需要的基础知识 1、程序内部细节 通过分析C语言程序的编码会发现程序都是一些指令和数据。 什么是程序&#xff1f; 指令运行过程中的数据 2、常用汇编指令 汇编指令详解 3、ARM架构过程调用标准AAPCS 传参&#xff1a; 通过r0-r3传递&#xff0c;多于4个参数的部…

【矩阵论】6. 范数理论——基本概念——向量范数与矩阵范数

6.1 基本概念 6.1.1 向量范数 a. 模长&#xff08;二范数&#xff09; Cn中向量X(x1x2⋮xn)的模长为∣X∣(X,X)tr(AHA)∣x1∣2∣x2∣2⋯∣xn∣2C^n中向量 X\left( \begin{matrix} x_1\\x_2\\\vdots\\x_n \end{matrix} \right)的模长为 \vert X\vert\sqrt{(X,X)}\sqrt{tr(A^HA…

nginx+keeplived 实现高可用 Web 负载均衡

nginxkeeplived 实现高可用 Web 负载均衡 一、架构简介 在系统设计中&#xff0c;可以利用Nginx的反向代理和负载均衡实现后端应用的高可用性&#xff0c;同时我们还需要考虑Nginx的单点故障。如果Nginx所在服务器宕机&#xff0c;或者Nginx服务不可用就会造成整个系统的不可…

鸡蛋车的控制律

这个老头像幽灵&#xff0c; ​拿个鸡蛋来炸群。 ​只见动画不见车&#xff0c; ​骗人无果还丢人&#xff01; 温州一个做汽车驾驶模拟器的&#xff0c;在重庆为我约了美女&#xff0c;为鸡蛋车站台。他掏空口袋砸我&#xff0c;材料、工资、车马&#xff0c;都是他担。 余姚一…

代码随想录算法训练营第十天(字符串)| 232.用栈实现队列,225. 用队列实现栈

代码随想录算法训练营第九天&#xff08;字符串&#xff09;| 232.用栈实现队列&#xff0c;225. 用队列实现栈 232. 用栈实现队列 大家可以先看视频&#xff0c;了解一下模拟的过程&#xff0c;然后写代码会轻松很多。 题目链接/文章讲解/视频讲解&#xff1a; 看到题目的…

react笔记_08生命周期

目录生命周期(旧)生命周期componentWillMountcomponetdidMountshouldComponentUpdatecomponentWillUpdatecomponentDidUpdatecomponentWillUnmountcomponentWillReceiveProps组件的挂载、更新、销毁案例1渲染过程更新过程1-通过setState去修改数据更新过程2-通过forceUpdate强制…

用Python分析《阿凡达·水之道》的豆瓣短评

《阿凡达水之道》于2022年12月16日上映。第一部的口碑、评分等都非常高&#xff0c;第二部是否能延续呢&#xff0c;本文获取了该电影的豆瓣短评&#xff0c;进行了初步的分析&#xff0c;看下观众都是如何评价的。 数据获取 打开豆瓣首页&#xff0c;搜索电影名&#xff0c;进…

Spring(三): 使用注解来存储和读取Bean对象

目录一、存储Bean对象1.1 配置扫描路径1.2 使用注解存储Bean对象1.3 通过上下文读取Bean对象1.4 Bean命名规则1.5 方法注解 Bean1.5 重命名Bean二、获取Bean对象2.1 属性注入2.2 Setter注入2.3 构造方法注入2.4 Resource注解2.5 Resource注解中name参数的作用一、存储Bean对象 …

说明书丨艾美捷Annexin-V-Cy3凋亡检测试剂盒

Cy3标记的重组人膜联蛋白V显示亮红色荧光&#xff08;Ex&#xff08;max&#xff09;:543nm&#xff1b;Em&#xff08;最大值&#xff09;&#xff1a;570nm&#xff09;。 艾美捷Annexin-V-Cy3凋亡检测试剂盒化学性质&#xff1a; Applications: Flow Cytometry, Fluorescen…

C++【修理之路】初识string

这里写目录标题为什么学习string类&#xff1f;标准库中的string类string的定义转换为C风格的字符串string类的输出和输出访问字符串中的字符字符串的拼接string 字符串的增删改查总结为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合…

3D数学之四元数 学习笔记

四元数有三个虚部&#xff0c;一个实部 [ w (x y z) ] w xi yj zk i j k ijk -1 用于表示&#xff0c;物体在空间中的任意角度旋转 四元数的模 Sqrt(pow(w, 2) pow(x, 2) pow(y, 2) pow(z, 2)) 四元数共轭&#xff1a;p a bi 共轭为&#xff1a; p a - bi …

一文梳理 | 电力企业网络安全管理及等级保护工作重点

前言 为加强电力行业网络安全监督管理&#xff0c;规范电力行业网络安全工作&#xff0c;国家能源局近日印发《电力行业网络安全管理办法》和《电力行业网络安全等级保护管理办法》&#xff08;以下简称“两办法”&#xff09;&#xff0c;有效期均为5年。随着这两部规范性文件…

门神 马丁内斯 要什么样的成就,才不枉这些年的颠沛流离

2022-12-18日 随着劳塔罗的最后一球波网而入 阿根廷成功获得了卡塔尔世界杯的冠军 结束后 所有人都去拥抱劳塔罗 只有梅西拉起了倒在地上的马丁内斯 很多人说 在这次比赛中 阿根廷有两个神 一个是球王梅西 另一个则是 门将 马丁内斯 当场上二比零时 所有人都以为阿根廷胜券在…

(二)汇编语言——寄存器

目录 通用寄存器 汇编指令 物理地址 接下来我们来介绍寄存器&#xff0c;同时会介绍一些基本的语句&#xff08;mov,add等)&#xff0c;好了&#xff0c;就让我们进入今天的学习吧&#xff01;同时&#xff0c;我们以8086为例子来介绍&#xff0c;参考来自王爽老师的书。 说…

JAVA架构与开发(从0开始搭建一个springCloud web项目)

从0开始搭建一个springCloud web项目。 一、首先需要的开发工具&#xff1a; 1、SpringToolSuite4 &#xff0c;个人目前用的最熟练的JAVA开发工具。 2、JDK1.8&#xff0c;按照网上安装jdk的步骤安装就行。 3、maven-3.6.1 4、springBoot官网 Spring Boot 5、配置中心 Apo…

架构师必读 —— 逻辑模型(14)

从"is/is not" "before / after”的角度思考 遇到问题时&#xff0c;为了研究“为什么会发生这种问题”&#xff0c;可以将问题发生之前和发生后做一个对比&#xff0c;这样效果会更明显。通过明确差距&#xff08;差异&#xff09;&#xff0c;可以比较"在…