首页 > 其他分享 >离散化 详解

离散化 详解

时间:2022-10-28 10:39:20浏览次数:42  
标签:std begin end 可以 离散 详解 数组


一、简介

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

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

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

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

为什么要进行离散化处理?

离散化是程序设计中一个常用的技巧,它可以有效的降低时间复杂度。其基本思想就是在众多可能的情况中,只考虑需要用的值。离散化可以改进一个低效的算法,甚至实现根本不可能实现的算法。要掌握这个思想,必须从大量的题目中理解此方法的特点。例如,在建造线段树空间不够的情况下,可以考虑离散化。

二、数据离散化

有些数据本身很大, 自身无法作为数组的下标保存对应的属性。如果这时只是需要这堆数据的相对属性, 那么可以对其进行离散化处理。当数据只与它们之间的相对大小有关,而与具体是多少无关时,可以进行离散化。

例如:
的逆序对个数相同。
设有个数:

排序:
那么这4个数可以表示成:

三、离散化数组

得益于C++的STL算法,我们可以直接对数组进行离散化:

// a[i] 为初始数组,下标范围为 [1, n]
// len 为离散化后数组的有效长度
std::sort(a + 1, a + 1 + n);
len = std::unique(a + 1, a + n + 1) - a - 1;
// 离散化整个数组的同时求出离散化后本质不同数的个数。

离散化完成后,可以使用​​std::lower_bound​​查询离散化前的编号:

std::lower_bound(a + 1, a + len + 1, x) - a;  // 查询 x 离散化后对应的编号

类似的:我们也可以对向量进行离散化:

// std::vector<int> a, b; // b 是 a 的一个副本
std::sort(a.begin(), a.end());
a.erase(std::unique(a.begin(), a.end()), a.end());
for (int i = 0; i < n; i++) b[i] = std::lower_bound(a.begin(), a.end(), b[i]) - a.begin();


标签:std,begin,end,可以,离散,详解,数组
From: https://blog.51cto.com/u_12372287/5803538

相关文章

  • 数据结构 线段树--权值线段树 详解
    ......
  • A*算法 详解与例题
    ......
  • 博弈论 详解
    ......
  • Trie 字典树 详解
    ......
  • 数据结构_树状数组 详解
    数据结构_树状数组详解......
  • SetWindowPos 函数详解
    //声明:SetWindowPos(hWnd:HWND;{窗口句柄}hWndInsertAfter:HWND;{窗口的Z顺序}X,Y:Integer;{位置}cx,cy:Integer;{大小}uFlags:UINT{选项}):BOOL;//hWndIn......
  • HTTP协议详解
    1.HTTP协议简介HTTP协议,俗称超文本传输协议,是一种用于分布式、协作式的超媒体信息系统的应用层协议,是万维网的数据通信的基础。目前存在着HTTP1.0、HTTP1.1和HTTP2.0......
  • (1028) 权限,chmod、chgrp、chown详解
    https://www.cnblogs.com/Berryxiong/p/6193866.html 例1:$ chgrp - Rbook /opt/local /book改变/opt/local/book/及其子目录下的所有文件的属组为book。 ......
  • Linux vmstat命令实战详解
    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix......
  • Docker详解
    Docker简介【1】Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker可更......