离散化详解

news2024/11/27 17:40:33
一.概念
       把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散在不改变数据相对大小的条件下,对数据进行相应的缩小。
二.适用范围
      数组中元素值域很大,但个数不是很多。
      比如将a[]=[1,3,100,2000,500000]映射到[0,1,2,3,4]这个过程就叫离散化。
三.示例

 

 

 

首先进行问题分析

        看到执行n次在某位置x上加上c,并且还询问m次给定区间的和这种问题。第一反应就是这是道考察前缀和的题目。

但仔细看下数据范围:
        姑且不说我们是否能开那么大的数组,就算开得了,那么大的范围做前缀和,预处理时的时间复杂度也是无法忍受的。 而再看一下我们实际需要处理的数据量 n,m ,都是量级相对来说很小,我们只需要聚焦处理这量级的数据即可。在这种情况下,我们就可以用离散化了。
首先可以明确的是,在这道题中我们离散化的对象是数轴的坐标。所以对于输入的位置x和对应的数值c,只需要把数轴下标放到数组discretization[n] 中即可,这里的 discretization[n] 为离散化后的映射数组。
(1)对x和c进行一个封装 , 以及对l和r进行封装
  static class Pair{
        int x;
        int c;
        Pair(int x , int c){
            this.x = x;
            this.c = c;
        }
    }
    static class Range{
        int l;
        int r;
        Range(int l , int r){
            this.l = l;
            this. r = r;
        }
    }

(2)创建一个存储Pair的集合和一个存储Range的集合以及一个存储x坐标值的集合

//创建一个集合存储Pair
    List<Pair> list = new ArrayList<>();
    //存储x的值,因为x是坐标轴上的值非常大,所以要对其进行系列化
    Set<Integer> points = new TreeSet<>();

    List<Range> ranges = new ArrayList<>();

(3)分别填充三个集合

   首先我们可以在控制台输入对应的修改次数(n)和查询次数(m)

Scanner scanner = new Scanner(System.in);
        int m,n;//n次修改,m次查询
        System.out.println("请以此输入m,n");
        m = scanner.nextInt();
        n = scanner.nextInt();

接下来填充集合

 //输入n次修改操作,(将位置为x的值加c)
        for (int i = 0; i < n; i++) {
            int x = scanner.nextInt();
            int c = scanner.nextInt();
            list.add(new Pair(x,c));
            points.add(x);
        }


        //进行m次查询操作
        for (int i = 0; i < m; i++) {
            int l = scanner.nextInt();
            int r = scanner.nextInt();
            ranges.add(new Range(l,r));
            points.add(l);
            points.add(r);
        }
这个离散化后的新数组(points),有多个相同且无序的值,这肯定是不行的。所以第二步就是对points [n] 排序、去重.
(4)对存储x的集合进行转换为数组并且去重和排序
我们创建集合时利用的是Set集合, 所以只需要进行排序操作
//排序(离散化的数组)
     int[] discretization = points.stream().sorted().mapToInt(Integer::valueOf).toArray();

但是目前为止我们集合中存放的并不是值, 而是坐标位置x , 所以我们还要创建一个数组来存储

discretization[n]数组中对应的值
(5)创建一个数组存储x对应的值
int []c = new int[discretization.length];

 //接下来填充数组c
        list.stream().forEach(list -> {
            int x = list.x;
            int v = list.c;
            int index = BinnearySearch(x);
            c[index] += v;
        });

上述代码的解读如下:

     首先创建一个长度和discretization[n]数组一样的数组 , 再对存储Pair的数组中循环 , 拿出其中的x和对应的值c , 然后利用二分查找法将x在discretization[n]数组中的索引拿出来 , 填充到对应数组c[]的索引的地方 , 找到要填充的c的索引后, 对其进行操作 , 也就是c[index] += v;

二分查找法代码如下:

 //二分查找法
    public int BinnearySearch(int x){
        int l = 0;
        int r = discretization.length-1;
        while (l<=r){
            int mid = l+(r-l)/2;
            if(discretization[mid] == x){
                return mid;
            }else if(discretization[mid] > x){
                r = mid-1;
            }else {
                l = mid+1;
            }
        }
        return -1;
    }

(6) 创建一个sum数组 , 用来存储c中前i项的值的和

//创建一个sum数组
         sum = new int[c.length+1];
        for (int i = 1; i < sum.length; i++) {
            sum[i] = sum[i-1] + c[i-1];
        }

(7)用Range数组中的l和r分别对应的sum中的值相减就是l和r中间值的和

ranges.stream().forEach(range ->{
            int lrange = range.l;
            int rrange = range.r;
            System.out.println(sum[rrange+1]-sum[lrange]);
        });

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

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

相关文章

CloudCompare二次开发之如何通过PCL进行点云滤波?

文章目录 0.引言1.CloudCompare界面设计滤波(filter)按钮2.PassThrough直通滤波器3.VoxelGrid体素滤波器4.UniformSampling均匀采样5.StatisticalOutlierRemoval统计滤波器6.RadiusOutlierRemoval半径滤波器7.ConditionRemoval条件滤波器8.ProjectInliers投影滤波器9.ModelOutl…

js跨域的解决方案

一、什么是跨域&#xff1f; 指的是浏览器不能执行其他网站的脚本&#xff0c;简单来说是浏览器同源政策的限制&#xff0c;浏览器针对于ajax的限制。 同源政策 两个页面拥有相同的 协议&#xff0c;端口&#xff0c;域名 就是同源&#xff0c;如果有一个不相同就是不同源…

【SQL】作为前端,应该了解的SQL知识(第四弹)

&#x1f4d1;集合运算 集合运算就是对满足同一规则的记录进行的加减等四则运算。 &#x1f449; 对行数进行增减。 &#x1f4c3;UNION 取并集 集合运算符会去除重复的记录 SELECT product_id, product_nameFROM Product **UNION** SELECT product_id, product_nameFROM …

图神经网络:(图的分类)在MUTAG数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8848。 文章目录 MUTAG数据集说明图的小批量处理法图分类的基本流程改进算法 MUTAG数据集说…

Webpack4 应用

文章目录 Webpack4 应用处理CSS文件使用css-loader和style-loader内联CSS安装配置webpack.config.js编写源代码编译打包 使用css-loader和mini-css-extract-plugin外部链接CSS安装配置webpack.config.js编译打包 处理图片使用file-loader处理CSS图片安装file-loader配置webpack…

ChatGPT使用体验

ChatGPT使用体验 前言 介绍ChatGPT 体验ChatGPT 菜谱 编程学习 出行导航 导游攻略 中英翻译 电影推荐 文章总结 总结 前言 最近关于ChatGPT的话题已经火爆了&#xff0c;我也观察和体验了一段时间。平心而论&#xff0c;这东西真的黑科技&#xff0c;大多行业都能通…

Unity-Android 打包报错

目录 报错&#xff1a; 分析&#xff1a; 1.代码剔除等级设置 2.什么方式会被剔除 3.解决办法 报错&#xff1a; FileNotFoundException: Could not load file or assembly XXX or one of its dependencies at System.AppDomain.Load (System.String assemblyString, Sys…

AI低代码,或将再次颠覆开发行业

IT行业最不缺少概念&#xff0c;大多数人也都是一知半解。AI的火爆&#xff0c;低代码的盛行&#xff0c;如今AIGC低代码、AI低代码、智能开发、AI生成式开发、AIGS(AI生成软件)等等呼之欲出&#xff0c; AIGC&#xff08;AI Generated Content&#xff0c;AI生成内容&#xff…

攻防世界-web-php_rce

题目描述&#xff1a;无&#xff0c;只给了下面一张图&#xff08;PS&#xff1a;图中的链接没问题&#xff09; 1. 思路分析 图中信息给的不是很到位&#xff0c;需要有点外部知识&#xff0c;网上搜索ThinkPHP V5&#xff0c;可以看到是think php的一个历史高危漏洞&#x…

Grafana插件安装并接入zabbix数据源(03)

一、在线安装插件 如果不指定插件安装位置,则默认安装位置为/var/lib/grafana/plugins;插件安装后需要重启grafana-server 安装zabbix插件alexanderzobnin-zabbix-app # grafana-cli plugins install alexanderzobnin-zabbix-app 使用--pluginsDir指定安装路径 # grafana…

分库分表的 21 条法则,hold 住

不着急实战&#xff0c;咱们先介绍下在分库分表架构实施过程中&#xff0c;会接触到的一些通用概念&#xff0c;了解这些概念能够帮助理解市面上其他的分库分表工具&#xff0c;尽管它们的实现方法可能存在差异&#xff0c;但整体思路基本一致。因此&#xff0c;在开始实际操作…

【字典详细介绍】——python基础——如桃花来

目录索引 字典的意义和特征&#xff1a;创建字典的语法&#xff1a;创建空字典的两种形式&#xff1a;创建字典的形式&#xff1a;*直接用大括号包裹即可&#xff1a;* 字典的常见操作&#xff1a;新增及修改&#xff1a;删除&#xff1a;***语法&#xff1a;****clear()清空字…

【方法】PDF文档很多页,怎么提取并保存其中一页或多页?

​生活或工作中&#xff0c;PDF文档都很常见&#xff0c;有时候我们得到一份PDF文档&#xff0c;想要提取里面的内容&#xff0c;只需要其中一页或多页&#xff0c;或部分内容&#xff0c;那要怎么提取并保存下来呢&#xff1f;下面小编分享3个方法&#xff0c;简单快速解决问题…

大型集团数字化现状洞察,三步解决组织分级分权管理难题|身份云研究院

在经历全球范围的疫情冲击后&#xff0c;疫情对企业数字化转型的影响已经从初期被迫式、局部场景的“云办公”转化为长期深远地全场景影响。加之近年中美技术加速解耦&#xff0c;以及信创政策的加持下&#xff0c;中国企业在数字化转型中使用本地化解决方案代替原有的外企套装…

Linux 使用笔记(本人出品,必属精品)

文章目录 Part.I IntroductionChap.I 快应用Chap.II 课程所学 Part.II 基础知识Chap.X 杂记 Part.I Introduction Linux 是笔者在大四上学期学的&#xff0c;当时授课的刘老师现在还能偶尔见到。但是平时一般用 Windows&#xff0c;有机会接触 Linux 一般是偶尔在服务器上跑跑程…

Android还要继续学习吗?高薪高级开发领先位置占据一席之地

Android开发还有必要学习吗 &#xff1f; 我们来看Android从业大佬的回答&#xff1b;从回答中可以读取出一些信息&#xff0c;Android市场仍有岗位需求&#xff0c;只不过减少许多初级Android开发岗位。对于中高端市场还是面临着缺少人才&#xff1b;因为初级开发人员多啊&am…

数据治理实践-全面总结:小文件治理

01 背景 小文件是如何产生的&#xff1a; 日常任务及动态分区插入数据&#xff08;使用的Spark2 MapReduce引擎&#xff09;&#xff0c;产生大量的小文件&#xff0c;从而导致Map数量剧增&#xff1b; Reduce数量越多&#xff0c;小文件也越多(Reduce的个数和输出文件是对应…

Cube Map 系列之:手把手教你 使用 立方体贴图

什么是Cube Map 在开始立方体贴图之前&#xff0c;我们先简单了解下cube map。 cube map 包含了六个纹理&#xff0c;分别表示了立方体的六个面&#xff1b; 相较二维的纹理使用坐标uv来获取纹理信息&#xff0c;这里我们需要使用三维的方向向量来获取纹理信息&#xff08;一…

[PyTorch][chapter 33][卷积神经网络]

前言 参考&#xff1a; 《数字图像处理与机器视觉》 第五章 空间域图像增强&#xff0c; 图像卷积&#xff1a; 空间域图像增强 图像增强是根据特定需要突出一副图像中的某些信息&#xff0c;同时削弱或去除 某些不需要信息的处理方法,其主要目的是是的处理后的图像对某种特定的…

有人问C# web怎么部署iis上面

C# web怎么部署iis上面 C# web项目怎么来&#xff1f;&#xff1f;&#xff1f;IIS作用 IIS怎么开启步骤一&#xff1a;打开控制面板->程序->启动或关闭windows 功能->找到**Internet Information Services**步骤二&#xff1a;勾选 web管理工具&#xff0c;http错误&…