离散化(算法竞赛)

Ⅰ 离散化简介

离散化:把无限空间中有限的个体映射到有限的空间中去,以此提高算法的时空效率。通俗的说,离散化是在不改变数据相对大小的条件下,对数据进行相应的缩小。

适用范围:数组中元素值域很大,但个数不是很多。

比如将a\[\]=1,3,100,2000,500000映射0,1,2,3,4这个过程就叫离散化。

离散化常与差分、前缀和、数组数组、线段树结合考查。

Ⅱ 离散化的两种实现方式

1.离散化手工编码
cpp 复制代码
#include<bits/stdc++.h>
const int N = 500010;   //自己定义一个范围
struct data{
  int val;              //元素的值
  int id;               //元素的位置
}olda[N];               //离散化之前的原始数据
int newa[N];            //离散化后的结果
bool cmp(data x,data y){ return x.val < y.val; } //用于sort()
int main(){
 int n;      scanf("%d",&n);                  //读元素个数
    for(int i=1;i<=n;i++) {
        scanf("%d",&olda[i].val);                //读元素的值
        olda[i].id = i;                          //记录元素的位置
}
std::sort(olda+1,olda+1+n,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.用STL函数实现离散化
cpp 复制代码
#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;
}
相关推荐
Jerry12 小时前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry14 小时前
LeetCode 459. 重复的子字符串
算法
海石17 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石17 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry19 小时前
LeetCode 151. 反转字符串中的单词
算法
a11177621 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜21 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry21 小时前
LeetCode 541. 反转字符串 II
算法
Jerry1 天前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手1 天前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议