首页 > 其他分享 >《离散化》

《离散化》

时间:2024-12-31 13:42:14浏览次数:1  
标签:tmp begin end 离散 xs ys side

离散化

根据OI WIKI

离散化是一种数据处理的技巧,本质上可以看成是一种 哈希,其保证数据在哈希以后仍然保持原来的 全/偏序 关系。

通俗地讲就是当有些数据因为本身很大或者类型不支持,自身无法作为数组的下标来方便地处理,而影响最终结果的只有元素之间的相对大小关系时,我们可以将原来的数据按照排名来处理问题,即离散化。

用来离散化的可以是大整数、浮点数、字符串等等。

应用场景

  • 题目给的数据范围非常大(开不了那么大的数组),但是数据又都是离散分布时,可以用离散化处理。

处理办法C++

// std::vector<int> arr;
std::vector<int> tmp(arr);  // tmp 是 arr 的一个副本
std::sort(tmp.begin(), tmp.end());
tmp.erase(std::unique(tmp.begin(), tmp.end()), tmp.end());
for (int i = 0; i < n; ++i)
  arr[i] = std::lower_bound(tmp.begin(), tmp.end(), arr[i]) - tmp.begin();
  • 时间复杂度\(O(n * log n)\)
  • 空间复杂度\(O(n)\)

例题

Leetcode LCP74

https://leetcode.cn/problems/xepqZ5/

思路

题目逻辑很简单,就是用差分在数组上实现加减操作,难点是题目给的范围非常大,用数组表示大概率爆空间,其次是即使空间没有爆,差分完了做前缀和的时候遍历这个二维数组,时间也肯定会爆。

但是我们发现,一个矩形用在x轴上的两个端点和在y轴上的两个端点就可以表示,所以如果要创建数组,这个数组上的数据将是及其离散化的,所以可以使用离散化的技巧优化。

代码

class Solution {
public:
    int fieldOfGreatestBlessing(vector<vector<int>>& forceField) {
        vector<long long> xs, ys;
        for (auto f : forceField){
            long long i = f[0], j = f[1], side = f[2];
            xs.push_back(2*i - side);
            xs.push_back(2*i + side);
            ys.push_back(2*j + side);
            ys.push_back(2*j - side);
        }

        sort(xs.begin(), xs.end());
        xs.erase(unique(xs.begin(), xs.end()), xs.end());
        sort(ys.begin(), ys.end());
        ys.erase(unique(ys.begin(), ys.end()), ys.end());

        int n = xs.size(), m = ys.size(), diff[n+2][m+2];
        memset(diff, 0, sizeof(diff));
        for (auto f : forceField){
            long long i = f[0], j = f[1], side = f[2];
            int r1 = lower_bound(xs.begin(), xs.end(), 2*i-side) - xs.begin();
            int r2 = lower_bound(xs.begin(), xs.end(), 2*i+side) - xs.begin();
            int c1 = lower_bound(ys.begin(), ys.end(), 2*j-side) - ys.begin();
            int c2 = lower_bound(ys.begin(), ys.end(), 2*j+side) - ys.begin();
            ++diff[r1+1][c1+1];
            --diff[r1+1][c2+2];
            --diff[r2+2][c1+1];
            ++diff[r2+2][c2+2];
        }
        int ans = 0;
        for (int i = 1; i <= n; i++){
            for (int j = 1; j <= m; j++){
                diff[i][j] += diff[i-1][j] + diff[i][j-1] - diff[i-1][j-1];
                ans = max(ans, diff[i][j]);
            }
        }
        return ans;
    }
};

标签:tmp,begin,end,离散,xs,ys,side
From: https://www.cnblogs.com/califeee/p/18643809

相关文章

  • 二分(离散化/哈希)
    题目:链接:https://ac.nowcoder.com/acm/problem/207053题意:简单来说就是每次猜值,根据反馈判断答案所在的区间,找区间重叠次数最多的那部分的重叠次数思路:若猜中,区间[num,num]次数+1若猜大了,区间[-inf,num-1]次数+1若猜小了,区间[num+1,inf]次数+1在[-inf,inf]上使用......
  • 数据预处理——数据离散化
    离散化,对数据做逻辑分层1.什么是数据离散化?  所谓离散化,就是把无限空间中有限的个体映射到有限的空间中。数据离散化操作大多是针对连续数据进行的,处理之后的数据值域分布将从连续属性变为离散属性,这种属性一般包含2个或2个以上的值域。2.为什么要将数据离散化节约计算资源,提......
  • 离散
    分值第一章22二283、5章一起考四25#离散数学通用规则析取V只要不是00就是1合取^只要不是11就是0->只要不是10就是1<->只要不是11或00就是0作为1的那一排是成真赋值(小项),用小写m加下标二进制用析取连起来(1为真0为假)作为0的那一排是成假赋值(大项),用大写M加下标二进制......
  • 三轴应力作用下颗粒离散元PFC矩张量声发射模拟
    本文摘要(由AI生成):本文利用矩张量分析方法,深入探讨了岩石破坏产生的AE事件的震源机制。通过模拟颗粒间的接触,研究了不同岩石破坏类型,并定量分析了AE事件的震源行为。模拟试样的尺寸与实验试样相同,破坏模式、力-位移曲线和震级通过模拟得出。进一步,根据矩张量文件中的mag列数据,......
  • 洛谷解题日记14||前缀和,差分与离散化
    #include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intmain(){intn;cin>>n;//读取区间的个数nvector<pair<int,int>>intervals(n);//存储区间的起点和终点,使用pair类型//读......
  • 离散数学命题逻辑
    离散数学命题逻辑语雀链接:https://www.yuque.com/g/wushi-ls7km/zyko8c/tfttq5zq0xyldfxn/collaborator/join?token=u0bJmfKd8DcgpA1k&source=doc_collaborator#《离散数学命题逻辑》......
  • 我谈离散傅里叶变换的补零
    有限序列的零延拓——零延拓不会改变离散傅里叶变换的形状的续篇。L点序列可以做N点傅里叶变换,当L⩽NL\leqslantN......
  • 直播预约 | 数据驱动:直击离散制造业数智化转型实践
    11月28日,KaiwuDB 携手施耐德电气全球供应链中国及中工互联联合发起《数据驱动:直击离散制造业数智化转型实践》主题直播,针对离散制造业大数据、IIoT及智能化场景的需求及挑战,和大家深度分享离散制造业场景解决方案及落地实践。✅直播时间: 11月28日(周四)19:00-20:30✅直播平台:K......
  • 使用数据规整进行数据离散变量处理
    在现代数据分析中,数据规整是一项至关重要的技能。无论是从事数据科学、机器学习,还是在商业分析中进行数据的处理和分析,都离不开数据的预处理与特征工程。尤其是在面对数据中的离散变量时,合理地处理和转换这些变量可以提升模型的预测能力,也能帮助更好地理解数据背后的信息。......
  • 公钥加密系统与离散对数问题
    概念1单向函数和陷门信息单向函数是一种可逆函数,其正向计算容易,但反向计算却非常困难。安全的公钥加密系统(PublicKeyCryptosystem,简称PKC)基于具有陷门的单向函数。陷门是一种辅助信息,利用它可以轻松计算单向函数的反函数。“陷门”一词来源于物理或机械陷阱的概念:单......