离散化 ,区间合并的个人理解

本文介绍了离散化和哈希的区别,离散化是将大量稀疏数据映射到有序区间,并保持原有顺序,通常使用二分查找实现。区间合并部分讲解了如何通过贪心思想对区间进行有效合并,提供了具体的模板代码。离散化和区间合并在解决数据处理问题中具有重要作用。
摘要由CSDN通过智能技术生成

离散化

最先开始接触离散化感觉和哈希一样但是再看的时候又有区别,首先离散化也和哈希一样是 再数轴上很多的点(这个是相对来说的,由于一般离散化题目给的区间一般都到 -1e9 ~ 1e9),所以看起来很多的点都会很稀疏,方法也和哈希算法一样都是将一些稀疏的距离很远的点映射到某一段区间内,但是一般的哈希算法 常用的有两种 一种是  开放寻址法 , 第二种就是 拉链法,开放寻址法一般就是 通过一种哈希函数找到一个地方 如果没有数,就占据这个地方,拉链法就是数组的每个元素开一个单链表如果映射到该数组元素这就增加一个节点, 但是 一般的离散化就没有这样 ,离散化的就是将每个点按照从小到大的(数组元素下标)映射到(1 ~ n)内,但是离散化的过程中下标一般都是用二分查找映射的, 最关键的一点就是 离散化是保序的。

基本模板

 sort(alls.begin(), alls.end());  // 排序

 alls.erase(unique(alls.begin(), alls.end()), alls.end());  // 去重  

排序则是按照每个点的下标来排序,去重的原因是可能输入的时候会输入许多的重复的数据。

区间合并

区间合并这里就要用到一点点贪心的思想,先按照左端点排序,排序后遍历到每个区间之后,后面区间的左端点都会再这个遍历区间右边,所以 一共就有三种合并的方式

 当第一种情况的时候,我们直接将该区间合并就可以了。

当第二种情况的时候,我们则需要将该区间的右端点修改成下一个区间的右端点。

当第三种情况,下一个区间的左端点与这个区间的右端点重合的时候,我们也只需要将该区间的右端点修改成下一个区间的右端点。

当第四种情况的时候,该区间的右端点与下一个区间的左端点相隔一段距离之后则只需要将该区间的左右端点更新成下一个区间的左右端点,然后区间的个数加1。

模板的话用y总的

void merge(vector<PII> &segs)
{
    vector<PII> res;

    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first)
        {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);

    if (st != -2e9) res.push_back({st, ed});

    segs = res;
}

以上就是全部见解咯,以后慢慢加油......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值