zoukankan      html  css  js  c++  java
  • 离散化

    关于离散化呢,之前一直是似懂非懂,搞求不懂的= =。

    其实这个东西是很好理解的。

    那么假如说我们有3个数:100、1、1000。

    如果我们在不会直接调用其值,而只处理之间的一个大致关系的时候看到这些数是不是有点不舒服,所以不如将其排序重组为2、1、3。这样是不是就舒服多了呢。

    当然,我这里只是稍微使用一下我好理解的方式提到。

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

    好,也就说,我们在面临一些随机分布的大型数据的时候,其本身肯定是无法完成被当作下标来使用的,但是呢我们可以由他们彼此之间的相对关系来给出一个数据量较小的连续序列来标榜这个关系,从而代替这些数据加以方便我们处理。

    所以平时在线段树中空间开不够而使用离散化的情况是较多的。

    具体的实现也是相当容易理解的。

    void discretize()
    {
        for(int i = 1; i <= n; i++) //首先我们是要将原数组所保存的数据放入一个处理的数组中去方便处理。 
        {
            disc[i] = A[i];
        }
        std::sort(disc + 1, disc + 1 + n); //排序是为了给出彼此关系 
        N = std::unique(disc + 1, disc + 1 + n) - (disc + 1); //去重。因为是利用关系再重新给出一个值替代,所以重复的我们应该不管他。
        //那么这里强调一下由于unique处理的时候是将重复数据放在数组的最后面所以我们应该得到的是一个处理之后的数组长度。 
        for(int i = 1; i <= n; i++) //最后我们再在处理数组中找到原数组值的位置,然后再赋给原数组。 
        {
            A[i] = std::lower_bound(disc + 1, disc + 1 + N, A[i]) - disc;
        }
    }
  • 相关阅读:
    转:Web Service介绍
    CodeIgniter网页缓存
    CodeIgniter管理你的应用程序
    CodeIgniter自动装载资源
    python feedparser 使用
    HTC文件的使用
    动态执行javascript代码
    jQuery获取文本节点之text()/val()/html() 方法区别
    style,runtimeStyle与currentStyle的定义及用法
    File,FileStream,byte[]3者互相转换总结(转)
  • 原文地址:https://www.cnblogs.com/sin-mo/p/7453386.html
Copyright © 2011-2022 走看看