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

离散化

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

基本模板

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

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

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

区间合并

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

离散化 ,区间合并的个人理解_第1张图片

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

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

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

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

模板的话用y总的

void merge(vector &segs)
{
    vector 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;
}

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

你可能感兴趣的:(哈希算法,算法)