首页 > 其他分享 >离散化

离散化

时间:2023-11-12 21:23:27浏览次数:29  
标签:res odata 离散 start vector copy

离散化是一种数据处理的技巧,本质上可以看成是一种 哈希,其保证数据在哈希以后仍然保持原来的全/偏序关系。
https://oi-wiki.org/misc/discrete/
通俗地讲就是当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照排名来处理问题,即离散化。

用来离散化的可以是大整数、浮点数、字符串等等。
最常见方法:排序+去重+二分

//函数接受需要离散化的vector和离散化后对应的数从start开始两个参数
//返回的是离散化的结果vector,下标是离散化追求目标,存的值是原来第i小的数在原数组中排第i个位置
vector<int> discrete(const vector<int>& odata, int start = 0) {
//
    const int n = odata.size();
    auto copy = odata;//对原数组的拷贝操作
    sort(copy.begin(), copy.end());
    // 考虑重复值
     copy.erase(unique(copy.begin(), copy.end()), copy.end());

    vector<int> res(n);
    for (int i = 0; i < n; i += 1) {
        // lower_bound >= 由于数值本身就存在,因此必然是找到=的情况
        res[i] = lower_bound(copy.begin(), copy.end(), odata[i]) - copy.begin() + start;
             
    }
    return res;
}

2.借助 map 自动排序


vector<int> discrete(const vector<int>& odata, int start = 0) {
    const int n = odata.size();
    // C++中的map自带升序效果
    // <数值,下标>
    map<int, int> autoSort;
    for (int i = 0; i < n; i += 1) {
        autoSort[odata[i]] = i;
    }
//autosort排序后,小数在前面,
    vector<int> res(n);
    for (auto it = autoSort.begin(); it != autoSort.end(); ++it) {
        res[it->second] = start;
        start += 1;
    }
    return res;
}
999在原来的数中排名第15小,它会被映射成15,我们需要保证结果和999这个值没有关系,或者只和相对大小的有关。代入题目例子更容易理解,可以看acwing板子题区间和https://www.acwing.com/problem/content/804/

标签:res,odata,离散,start,vector,copy
From: https://www.cnblogs.com/mathiter/p/17827755.html

相关文章

  • 离散化
    背景引入对于一个数字序列,如果我们只关心他们之间的相对大小,而不关心具体数值,并且直接使用原数值会对我们的解决方案产生影响,此时我们采用离散化具体步骤即将一个原数组映射到另一个等大的数组中,并且两个数组数字之间的大小关系不变如:原序列=[12480761145*10e10]可......
  • 离散数学 第一章 命题逻辑 1-3命题公式与翻译
    前面已经提到,不包含任何联结词的命题叫做原子命题,至少包含一个联结词的命题称作复合命题。设p和q是任意两个命题,则┓p,p∨q,(p∧q)∨(p→q),p«(q∨┓p)等都是复合命题。若p和q是命题变元,则上述各式均称作命题公式。p和q称作命题公式的分量。必须注意:命题公式是没有真假值的,仅当在一个公式中......
  • 离散数学 第一章 命题逻辑 1-2 联结词
    在自然语言中,常常使用“或”,“与”,“但是”等一些联结词,对于这种联结词的使用,一般没有很严格的定义,因此有时显得不很确切。在数理逻辑中,复合命题是由原子命题与逻辑联结词组合而成,联结词是复合命题中的重要组成部分,为了便于书写和进行推演,必须对联结词作出明确规定并符号化。下面介......
  • 离散数学 第一篇 数理逻辑
    第一篇数理逻辑    逻辑学是一门研究思维形式及思维规律的科学。逻辑规律就是客观事物在人的主观意识中的反映。逻辑学分为辨证逻辑与形式逻辑两种,前者是以辨证法认识论的世界观为基础的逻辑学,而后者主要是对思维的形式结构和规律进行研究的类似于语法的一门工具性学科。......
  • 离散数学蕴含式的问题
    如何理解数理逻辑中的蕴含?P→Q它表示自然语言的“如果…,则…”这种假言判断的,如果P为真命题,Q也为真命题时,P→Q是真命题,当P为真命题,而Q为假命题时,P→Q是一个假命题。比如张三说,“如果明天天不下雨(P),那么他去你家玩(Q)”,如果第二天天不下雨,他去了你家,他说了真话(P→Q为真),如果天不......
  • 离散数学 第一章 命题逻辑 1-1 命题及其表示法
    在数理逻辑中,为了表达概念,陈述理论和规则,常常需要应用语言进行描述,但是日常使用的自然语言进行描述,往往叙述时不够确切,也易产生二义性,因此就需要引入一种目标语言,这种目标语言和一些公式符号,就形成了数理逻辑的形式符号体系。所谓目标语言就是表达判断的一些语言的汇集,而判断就是对......
  • 《离散数学》双语专业词汇表 名词术语中英文索引
    《离散数学》双语专业词汇表set:集合subset:子集element,member:成员,元素well-defined:良定,完全确定brace:花括号representation:表示sensible:有意义的rationalnumber:有理数emptyset:空集Venndiagram:文氏图contain(in):包含(于)universalset:全集finite(infinite)set:有限(无限)集......
  • 离散化
    AcWing笔记--离散化前言所谓离散化,是将给定的有序序列通过二分查找,将其对应的值映射到其对应的序号的过程。如给定一个数组元素[5,10,55,96,1055464,546467979],显然这是一个给定长度的有序数组。对于这样一个元素确定的有序数组,离散化之后,5映射为1也就是其序号(映射为0......
  • MATLAB 使用离散数据点实现三维曲面插值
    依靠若干离散点实现三维曲面插值是工程应用中的常见问题,也是数据处理工作的常见需求。MATLAB实现上述功能主要依靠 griddata函数,该函数支持基于三角形的三次插值(仅支持内插值,估计是一种保形插值)和双调和样条插值(支持外插值)。案例数据如下图所示:案例数据空间分布如下:案例代......
  • 计算离散点的边界 MATLAB计算多维凸包
    无论是进行回归、拟合还是深度学习,总要将总体数据集划分为训练样本集和测试样本集。然而,一般情况下,测试集位于训练集“所覆盖的范围之内”时(如下图所示,红色星号表示训练样本集所在位置,蓝色圆点表示测试样本集所在位置),测试效果较好,测试结果也更具合理性。但是如何验证测试集是否在......