公众号:编程驿站
1. 离散化
离散化是离散数学中的概念。离散化算法,指把无限空间中的离散数据映射到一个有限的存储空间中,并且对原数据进行有序索引化。主打压缩的都是精化。
离散化流程:
对离散化数列{235,897,458,7654,458,1234}
为例。数列中的数据涉及到的数轴区间从0
到7654
。诺大的区间中唯有6
个数据。相当于仰头看星空,繁星一点一点。遇到这种情况,可以对数列离散化操作。
-
对原数据排序。
int datas[6]={235,897,458,7654,458,1234}; //使用 sort 函数排序 sort(datas, datas+6);
-
对排序后的数据去重。对排序的数据去重最快的方案使用
unique
函数,此函数本质是将重复的元素移动到数组的末尾,最终尾迭代器指针指向最后一个重复数据,且返回尾迭代器。可以计算实际长度:
int size= unique(datas,datas+6) - datas;
。int size= unique(datas,datas+6) - datas; //输出数据 for(int i=0; i<size; i++) cout<<datas[i]<<"\t";
- 对原数据索引化(也称为离散化)后,原数据分别被映射为
{25,1}、{458,2}、{897,3}、{1234,4}、{7654,5}
原数据离散化后常用操作是查找离散数据的离散(索引)值是多少。如果在离散化过程中使用哈希表存储,查询时间复杂度为O(1)
。如果使用数组,最优方案是使用二分搜索算法。
// 二分求出 val 对应离散化的值
int search(int val) {
// 在、右指针
int lt = 0,rt = sizeof(datas)/4 - 1;
while(lt<rt) {
int mid = lt + rt >> 1;
if(datas[mid] >= val) rt = mid;
else lt = mid + 1;
}
return lt;
}
测试完整代码。
Tips: 注意
search
函数的返回值加1
。离散化后的值一般从1
开始。
int main() {
//使用 sort 函数排序
sort(datas, dat