C++学习笔记总结练习:数组离散化的方法

数组离散化

1 问题描述

  • 离散化一个序列的前提是我们只关心这个序列里面元素的相对大小,而不关心绝对大小(即只关心元素在序列中的排名);离散化的目的是让原来分布零散的值聚集到一起,减少空间浪费。那么如何获得元素排名呢,我们可以对原序列排序后去重,对于每一个 a i a_i ai通过二分查找的方式计算排名作为离散化之后的值。当然这里也可以不去重,不影响排名。
  • 数组本质上是一种有序的映射。i----A---->x 即(A[i]=x)的映射。有时候为了建立值的数量与坐标i的反向映射,但此时值x的范围是离散化的。需要建立离散数组。一个的额外的映射数组,完成反向映射x----B---->i。

2 离散数组——数组实现方法

  • 使用数组B作为离散数组的映射。B的下标i能够反映原来数组中各个元素的大小顺序。但不是原来数组中各个元素的值。
  • 建立离散数组的时间复杂度为O(nlog n)需要对原数组进行快速排序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aoDMYX8E-1692608037902)(image/2021-03-27-04-40-18.png)]

代码实现

vector<int> nums;//表示原来的数组
vector<int> tmp = nums;

//对离散数组进行排序
sort(tmp.begin(), tmp.end());

//建立原数组到离散数组的映射
for (int& num: nums) {
    num = lower_bound(tmp.begin(), tmp.end(), num) - tmp.begin() + 1;
}

3 离散数组——有序map实现方法

  • 有序map的创建,底层使用红黑树实现。本质上就是一种离散数组。根据键的大小进行了排序。
  • 可以使用这种有序的映射直接完成原数组的值到下表i的映射。并且保持一定的顺序。
#include<iostream>
#include<map>
using namespace std;


int main(){
    map<int,int> m;
    m[10]=10;
    m[4]=4;
    m[5]=5;
    m[1000]=1000;
    m[1]=1;
    for(auto k:m){
        cout<<k.first<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863125

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值