当前位置: 首页 > news >正文

离散化模板

离散化就是把较大的数映射成较小的数。

题⽬描述:定 n 个数,离散化之后,输出每⼀个数离散化之后的值。

测试数据:

10 1999999 12 1999999-48444 568 12-100-2845630 100000001 263

// 输出 7 4 7 2 6 4 3 1 8 5

代码:

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1e5 + 10;  // 定义常量N为100010,作为数组最大长度

int n;          // 数据元素个数
int a[N];       // 原始数据数组

int pos;        // 离散化数组的当前位置/长度
int disc[N];    // 用于离散化的临时数组

// 二分查找函数:在离散化数组disc中查找x的位置。大于等于。
int find(int x)
{
    int l = 1, r = pos;  
    while(l < r)
    {
        int mid = (l+r)/2;    // 计算中间位置
        if (disc[mid] >= x)   // 如果中间值大于等于x
            r = mid;          // 调整右边界
        else
            l = mid+1;        // 调整左边界
    }
    return l;                 // 返回x在disc中的位置
}

int main()
{
    cin >> n;  // 输入数据个数
    
    // 读取原始数据并复制到离散化数组
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        disc[++pos] = a[i];  // 将数据存入离散化数组,pos自增
    }
    
    // 对离散化数组进行排序
    sort(disc+1, disc+1+pos);

    // 去除离散化数组中的重复元素,并更新pos为不重复元素的数量
    pos = unique(disc+1, disc+1+pos) - (disc+1);
    
        //  unique()函数的作用
        //  unique(disc+1, disc+1+pos)对数组 disc从索引1到pos的部分进行去重
        //  unique()函数会将相邻的重复元素移动到数组末尾,并返回指向第一个重复元素的迭代器(指针)
        //    注意:unique()只去除相邻的重复元素,这就是为什么需要先排序
 
        //    指针运算
        //    指向重复的指针减去第一个指针 ==> 不重复的元素的数量 

    // 输出每个原始数据离散化后的值:用二分查找
    for (int i = 1; i <= n; i++)
    {
        cout << find(a[i]) << endl; 
    }
    
    return 0; 
}

总代码:

#include <iostream>
#include <algorithm>
using namespace std;const int N = 1e5 + 10;  int n;          
int a[N];       int pos;        
int disc[N];    int find(int x)
{int l = 1, r = pos;  while(l < r){int mid = (l+r)/2;    if (disc[mid] >= x)   r = mid;          elsel = mid+1;        }return l;                 
}int main()
{cin >> n; // 读取原始数据并复制到离散化数组for (int i = 1; i <= n; i++){cin >> a[i];disc[++pos] = a[i];  }// 对离散化数组进行排序sort(disc+1, disc+1+pos);pos = unique(disc+1, disc+1+pos) - (disc+1);for (int i = 1; i <= n; i++){cout << find(a[i]) << endl; }return 0; 
}

时间复杂度为 ​​O(n log n)​​,适用于大规模数据(如 n ≤ 10^5)

画图很重要哦

http://www.dtcms.com/a/456879.html

相关文章:

  • linphone + minisipserver 下载和配置
  • 网站建设登录界面代码wordpress 按钮美化
  • 吴恩达机器学习课程(PyTorch 适配)学习笔记:3.4 强化学习
  • jEasyUI 自定义窗口工具栏
  • Spring Boot 和 MyBatis 环境下实现动态数据源切换
  • 2025 年度国产大模型「开源 vs. 闭源」深度评测与实战指南
  • 网页设计与网站建设电话香洲网站建设
  • 移动论坛网站模板免费下载revolution slider wordpress
  • TPM(Total Productive Maintenance)现场管理
  • 从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 11 自动化测试--框架设计--基础知识 7--各种弹窗处理
  • ubuntu terminal 设置代理
  • 《传感器与检测技术》第 2 章 电阻式传感器原理与应用
  • Linux中input子系统
  • 探索Linux:开源世界的钥匙
  • GitHub 热榜项目 - 日榜(2025-10-08)
  • 手写Function.prototype.bind:从原理到完整实现
  • 百度做网站的公司施工企业的施工现场消防安全责任人应是
  • 做电商网站报价网站开发工程师需要会写什么
  • (3)容器布局进阶:Spacer、Divider、Frame 与 Alignment
  • 墨西哥证券交易所(BMV)等多个交易所股票数据API对接文档
  • 【数据分析与可视化】2025年一季度金融业主要行业资产、负债、权益结构与增速对比
  • app网站建设阿里巴巴卓拙科技做网站吗
  • 乌苏市城乡建设局网站北京朝阳区邮政编码
  • 个人用云计算学习笔记 --18(NFS 服务器、iSCSI 服务器)
  • 智能制造——解读MES在各行业中的需求与解决方案【附全文阅读】
  • 老题新解|棋盘覆盖
  • 网站可不可以做自己的专利东莞沙田网站建设
  • Redis Hash 全解析:从入门到精通,解锁高性能对象存储的钥匙
  • 14.排序
  • Python自动化实战第一篇: 自动化备份100+台服务器Web 配置