离散化——Acwing.802区间和

news2025/1/12 21:22:05

离散化

定义

离散化可以简单理解为将连续的数值或数据转换为离散的、有限个不同的值或类别。离散化就是将一个可能具有无限多个取值或在一个较大范围内连续取值的变量,通过某种规则或方法,划分成若干个离散的区间或类别,并将原始数据映射到这些离散的类别中。

主要目的通常是为了简化数据处理、降低数据维度、提高计算效率或适应特定的算法和模型要求。离散化可以去除一些不太重要的细节信息,突出数据的主要特征和模式。

运用情况

当数据范围很大,但实际涉及到的不同值相对较少时,通过离散化可以用较小的索引或标记来代表原来的数值,从而节省空间和提高处理效率。

例如,有一组数值可能非常大(比如从 1 到 1000000),但实际上只有少数几种不同的值频繁出现,通过离散化可以将这些值映射到一个较小的范围内(比如 1 到 10)。

离散化的一个常见做法是先对原始数据进行排序,然后为每个不同的值分配一个唯一的编号或索引。这样在后续的处理中就可以用这些编号来代替具体的数值进行操作。

离散化在一些算法中,如一些基于区间或计数的问题中经常被用到,可以使问题的处理更加简洁和高效。

注意事项

  1. 要确保离散化后的数据能准确反映原始数据的关键特征和关系,不能丢失重要信息。
  2. 注意边界情况的处理,避免出现遗漏或错误分类。
  3. 对于不同的应用场景,选择合适的离散化方法,考虑数据分布特点和后续算法的需求。

离散方法

  1. 等宽离散化:将数据的取值范围划分为若干个等宽的区间,每个区间对应一个离散值。
  2. 等频离散化:将数据划分为若干个区间,使得每个区间内的数据数量大致相等。
  3. 基于聚类的离散化:利用聚类算法将数据聚成若干类,然后将这些类作为离散化后的类别。
  4. 基于特定规则的离散化:根据具体问题和业务需求,人为设定一些规则来进行离散化,比如根据某个阈值进行划分。
  5. 基于决策树的离散化:通过构建决策树,根据节点分裂的情况来确定离散化的划分点。

解题思路

  1. 分析问题:确定是否适合使用离散化,以及离散化的目的是什么。
  2. 选择方法:根据数据特点和问题需求选择合适的离散化方法,如等宽、等频等。
  3. 处理数据:按照选定的方法对数据进行离散化操作,建立映射关系。
  4. 验证效果:检查离散化后的数据在后续处理或分析中是否达到预期效果,必要时进行调整。
  5. 结合算法:考虑离散化后如何与具体的算法或模型相结合,使其更好地发挥作用。

例如,在处理一些区间相关的问题时,可能先对区间的端点进行离散化,然后根据离散化后的索引进行计算和处理;或者在数据量很大但实际不同值有限的情况下,通过离散化来提高存储和计算效率。同时,在解题过程中要不断思考如何优化离散化的过程以及更好地利用离散化后的结果。

Acwing.802区间和

题目描述

802. 区间和 - AcWing题库

运行代码

#include<bits/stdc++.h>  
using namespace std;  
typedef pair<int, int> PII;  
const int N = 300010;  
PII add[N];  
PII query[N];  
int a[N], s[N];  
vector<int> alls;  
int find(int x) {  
    return lower_bound(alls.begin(), alls.end(), x) - alls.begin() + 1;  
}  

int main() {  
    int n, m;  
    cin >> n >> m;  
    // 读取修改操作并存储到alls中  
    for (int i = 0; i < n; i++) {  
        cin >> add[i].first >> add[i].second;  
        alls.push_back(add[i].first);  
    }  
    // 读取查询操作并存储到alls中  
    for (int i = 0; i < m; i++) {  
        cin >> query[i].first >> query[i].second;  
        alls.push_back(query[i].first);  
        alls.push_back(query[i].second);  
    }  
    // 离散化  
    sort(alls.begin(), alls.end());  
    alls.erase(unique(alls.begin(), alls.end()), alls.end());  
    // 根据离散化后的位置更新a数组  
    for (int i = 0; i < n; i++) {  
        int pos = find(add[i].first);  
        a[pos] += add[i].second;  
    }  
    // 计算前缀和  
    for (int i = 1; i <= alls.size(); i++) {  
        s[i] = s[i - 1] + a[i];  
    }  
    // 处理查询  
    for (int i = 0; i < m; i++) {  
        int l = find(query[i].first);  
        int r = find(query[i].second);  
        cout << s[r] - s[l - 1] << endl;  
    }  
    return 0;  
}

代码思路

  1. 读取输入
    • 读取修改操作的个数 n 和查询操作的个数 m
    • 读取每个修改操作,包括修改的位置 x 和增加的值 c,并将位置 x 存储在 add 数组中。
    • 读取每个查询操作,包括查询的左边界 l 和右边界 r,并将它们存储在 query 数组中。
  2. 离散化:将所有修改和查询中涉及到的位置(即 add 和 query 数组中的 xl 和 r)存储到 alls 向量中。对 alls 向量进行排序,并使用 unique 函数去除重复元素,实现离散化。
  3. 更新数组:遍历 add 数组,对于每个修改操作,使用 find 函数找到离散化后的位置 pos,并更新 a[pos] 数组的值。
  4. 计算前缀和:遍历离散化后的位置数组 alls(从索引 1 开始,因为索引 0 不代表任何位置),计算 a 数组的前缀和,并将结果存储在 s 数组中。
  5. 处理查询
    • 遍历 query 数组,对于每个查询操作,使用 find 函数找到离散化后的左边界 l 和右边界 r 的位置。
    • 输出区间和 s[r] - s[l - 1],其中 s[r] 是右边界的前缀和,s[l - 1] 是左边界左边一个位置的前缀和(用于排除左边界本身)。
  6. 输出结果:对于每个查询操作,输出计算得到的区间和。

这个代码的时间复杂度主要由离散化、更新数组、计算前缀和以及处理查询四部分组成。其中,离散化和计算前缀和的时间复杂度都是 O(n log n),其中 n 是修改和查询操作的总数(因为 alls 的大小可能达到这个数量级)。更新数组和处理查询的时间复杂度都是 O(n),所以整体的时间复杂度是 O(n log n)。

改进思路

  1. 减少alls数组中的冗余元素:在将位置加入alls数组时,如果两个修改或查询操作的位置相同,我们只需要存储一个。这可以通过在加入新位置之前检查alls数组的末尾元素是否与新位置相同来实现。

  2. 使用std::vectorback_inserter:在将位置加入alls数组时,使用std::back_inserter可以避免显式地调用push_back,这可能会稍微提高性能。

  3. 使用std::lower_bound的返回值直接作为索引:在find函数中,我们可以直接使用std::lower_bound返回的迭代器减去alls.begin()得到离散化后的索引,而不是将其转换为整数。

改进代码(AI)

#include<bits/stdc++.h>  
using namespace std;  
typedef pair<int, int> PII;  
const int N = 300010;  
  
PII add[N];  
PII query[N];  
int a[N], s[N];  
vector<int> alls;  
  
int find(int x) {  
    return lower_bound(alls.begin(), alls.end(), x) - alls.begin() + 1;  
}  
  
int main() {  
    int n, m;  
    cin >> n >> m;  
  
    // 读取修改操作  
    for (int i = 0; i < n; i++) {  
        cin >> add[i].first >> add[i].second;  
        if (alls.empty() || alls.back() != add[i].first) alls.push_back(add[i].first);  
    }  
  
    // 读取查询操作  
    for (int i = 0; i < m; i++) {  
        cin >> query[i].first >> query[i].second;  
        if (alls.empty() || alls.back() != query[i].first) alls.push_back(query[i].first);  
        if (alls.empty() || alls.back() != query[i].second) alls.push_back(query[i].second);  
    }  
  
    // 离散化  
    sort(alls.begin(), alls.end());  
    alls.erase(unique(alls.begin(), alls.end()), alls.end());  
  
    // 根据离散化后的位置更新a数组  
    for (int i = 0; i < n; i++) {  
        int pos = find(add[i].first);  
        a[pos] += add[i].second;  
    }  
  
    // 计算前缀和  
    for (int i = 1; i <= alls.size(); i++) {  
        s[i] = s[i - 1] + a[i];  
    }  
  
    // 处理查询  
    for (int i = 0; i < m; i++) {  
        int l = find(query[i].first);  
        int r = find(query[i].second);  
        cout << s[r] - s[l - 1] << endl;  
    }  
  
    return 0;  
}

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

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

相关文章

【课程总结】Day8(下):计算机视觉基础入门

前言 数据结构 在人工智能领域&#xff0c;机器可以处理的数据类型如上图&#xff0c;大约可以分为以上类别。其中较为常用的数据类别有&#xff1a; 表格类数据 数据特点&#xff1a; 成行成列&#xff1a;一行一个样本&#xff0c;一列一个特征特征之间相互独立&#xff0…

最实用的AI软件开发工具CodeFlying测评

就在上个月&#xff0c;OpenAI宣布GPT-4o支持免费试用&#xff0c;调用API价格降到5美元/百万token。 谷歌在得到消息后立马将Gemini 1.5 的价格下降到0.35美元/百万token。 Anthropic的API价格&#xff0c;直接干到了0.25美元/百万token。 国外尚且如此&#xff0c;那么国内…

科技赋能,避震婴儿车或成为行业硬通货

全球知识经济发展发展到今天&#xff0c;消费者对于品质、服务、体验的要求越来越高&#xff0c;与之对应的产品也就越来越科技化、智能化、个性化&#xff0c;品牌化和差异化逐步成为产品的竞争核心。 婴儿推车作为关系婴幼儿出行安全的支柱性产业之一&#xff0c;从车架结构…

分享一份 .NET Core 简单的自带日志系统配置,平时做一些测试或个人代码研究,用它就可以了

前言 实际上&#xff0c;.NET Core 内部也内置了一套日志系统&#xff0c;它是一个轻量级的日志框架&#xff0c;用于记录应用程序的日志信息。 它提供了 ILogger 接口和 ILoggerProvider 接口&#xff0c;以及一组内置的日志提供程序&#xff08;如 Console、Debug、EventSo…

STM32-17-DAC

STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD STM32-15-DMA…

uni-ui:基于uni-app的全端兼容高性能UI框架

一、引言 在移动应用开发领域&#xff0c;跨平台框架因其能够降低开发成本、提高开发效率而备受开发者青睐。其中&#xff0c;uni-app作为一个使用Vue.js开发所有前端应用的框架&#xff0c;不仅支持编译到iOS、Android、H5、以及各种小程序等多个平台&#xff0c;还因其丰富的…

实现开发板三盏灯点亮熄灭

实现开发板三盏灯点亮熄灭 typedef struct {volatile unsigned int MODER; // 0x00volatile unsigned int OTYPER; // 0x04volatile unsigned int OSPEEDR; // 0x08volatile unsigned int PUPDR; // 0x0Cvolatile unsigned int IDR; // 0x10volatile unsigned int OD…

无线网络与物联网技术[1]之近距离无线通信技术

无线网络与物联网技术 近距离无线通信技术WIFIWi-Fi的协议标准Wi-Fi的信道Wi-Fi技术的术语Wi-Fi的组网技术Ad-hoc模式无线接入点-APAP&#xff1a;FAT AP vs FIT AP Wi-Fi的特点与应用Wi-Fi的安全技术 Bluetooth蓝牙技术概论蓝牙的技术协议蓝牙的组网技术微微网piconet(了解)散…

C#聊天室①

聊天室服务器&#xff1a; 创建项目 桌面不需要使用控件 Program.cs internal class Program {static TcpListener server;[STAThread]static void Main(){Program p new Program(); p.start();}void start(){server new TcpListener(IPAddress.Parse(GetIP()), 33…

58.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露(6)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;57.WEB渗透测试-信息收集- 端口、目录扫描、源码泄露&#xff08;5&#xff09;-CSDN博客…

模拟笔试 - 卡码网周赛第二十一期(23年美团笔试真题)

第一题&#xff1a;小美的排列询问 解题思路: 简单题&#xff0c;一次遍历数组&#xff0c;判断 是否有和x、y相等并且相连 即可。 可优化逻辑&#xff1a;因为x和y是后输入的&#xff0c;必须存储整个数组&#xff0c;但是上面说了 **排列是指一个长度为n的数组&#xff0…

学习笔记——网络管理与运维——概述(网络管理)

二、概述 1、什么是网络管理&#xff1f; 网络管理是通过对网络中设备的管理&#xff0c;保证设备工作正常&#xff0c;使通信网络正常地运行&#xff0c;以提供高效、可靠和安全的通信服务&#xff0c;是通信网络生命周期中的重要一环。 2、网络管理分类 网络管理(Network …

C++ 24 之 拷贝构造函数

c24拷贝构造函数.cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std;class Person3 { private:int p_age; public:// 构造函数分类&#xff1a;// 按参数分类&#xff1a;1、有参 2、无参// 按类型分类:普通、拷贝&#xff08;复制&…

Charles代理https接口到本地

一、操作手册 1、安装工具 1.1、安装代理软件Charles 软件下载地址&#xff1a;Download a Free Trial of Charles • Charles Web Debugging Proxy 1.2、安装https代理插件&#xff1a;&#xff08;有问题自行百度解决&#xff09; 2、配置策略 以下以https接口为例&…

型号设计师和指挥调度体系: 中国航天系统工程的组织方式

在中国航天&#xff0c;系统工程的组织管理体系是设计师系统和指挥调度系统。 型号设计师系统是型号的技术体系&#xff0c;总设计师是研制任务的技术总负责人&#xff0c;是设计技术方面的组织者、指挥者&#xff0c;重大技术问题的决策者。 指挥调度系统是型号行政管理系统…

C++switch陈述

C 使用关键字 switch、case、default对一个常数执行不同的分流&#xff0c;这构成多重选择的结构&#xff0c;形式如下 简单来说&#xff0c;switch后头接一小括弧&#xff0c;小括弧内为一常数运算式&#xff0c;计算出常数值若与其后case的位标(label) 相符&#xff0c;就会执…

文件没有权限问题:cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied

问题描述 执行 aem bootstrap start --plus 命令启动 Dreamview 提示错误&#xff1a; /bin/sh: 1: cannot create /opt/apollo/neo/data/log/monitor.log: Permission denied [ERROR] Failed to start Dreamview. Please check /opt/apollo/neo/data/log/dreamview.log or /op…

Windows环境RocketMQ启动broker时启动失败

在输入”start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnabletrue“命令启动失败后&#xff0c;会出现如下图所示的样子。 但我们重新启动电脑、重新启动RocketMQ或者杀死进程等方法都对此无效&#xff0c;还是没有启动成功。 启动失败的原因&#xff1a; 中途断网或…

Kaggle -- Multi-Class Prediction of Obesity Risk

使用简单的决策树进行分类&#xff0c;代码如下&#xff1a; import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.model_selection import train_test_splitdf pd.read_csv("train.csv")df[Gender] df[Gender…

React 中的 Lanes

React 中有一个 Lane 的概念&#xff0c;Lane 就像高速路上的不同车道&#xff0c;具有不同优先级&#xff0c;在 React Lane 通过一个 32 位的二进制数来表示。越小优先级别越高&#xff0c;SyncLane 级别最高。用二进制存储的方式&#xff0c;可以通过逻辑操作快速判断 Lane …