C++ 离散化算法设计原则:压缩的都是精华

公众号:编程驿站

1. 离散化

离散化是离散数学中的概念。离散化算法,指把无限空间中的离散数据映射到一个有限的存储空间中,并且对原数据进行有序索引化。主打压缩的都是精化。

离散化流程:

对离散化数列{235,897,458,7654,458,1234}为例。数列中的数据涉及到的数轴区间从07654。诺大的区间中唯有6个数据。相当于仰头看星空,繁星一点一点。遇到这种情况,可以对数列离散化操作。

  • 对原数据排序。

    int datas[6]={235,897,458,7654,458,1234};
    //使用 sort 函数排序
    sort(datas, datas+6); 
    

1.png

  • 对排序后的数据去重。对排序的数据去重最快的方案使用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";
    

4.png

2.png

  • 对原数据索引化(也称为离散化)后,原数据分别被映射为{25,1}、{458,2}、{897,3}、{1234,4}、{7654,5}

3.png

原数据离散化后常用操作是查找离散数据的离散(索引)值是多少。如果在离散化过程中使用哈希表存储,查询时间复杂度为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
  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚大果壳

码文不易,晚上熬夜需要点咖啡钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值