我是靠谱客的博主 飞快爆米花,最近开发中收集的这篇文章主要介绍离散化 详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、简介

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

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

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

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

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

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

二、数据离散化

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

例如:
91054 91054 91054 52143 52143 52143的逆序对个数相同。
设有 4 4 4个数:
1234567 、 123456789 、 12345678 、 123456 1234567、123456789、12345678、123456 123456712345678912345678123456
排序: 123456 < 1234567 < 12345678 < 123456789 = > 1 < 2 < 3 < 4 123456<1234567<12345678<123456789=>1<2<3<4 123456<1234567<12345678<123456789=>1<2<3<4
那么这4个数可以表示成: 2 、 4 、 3 、 1 2、4、3、1 2431

三、离散化数组

得益于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();

最后

以上就是飞快爆米花为你收集整理的离散化 详解的全部内容,希望文章能够帮你解决离散化 详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部