码迷,mamicode.com
首页 > 其他好文 > 详细

离散化

时间:2018-08-25 22:17:10      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:二分查找   计算   uniq   htm   后序   第一个   span   family   插入   

离散化是程序设计中一个非常实用的技巧,可以有效的降低时间复杂度。基本思想就是在

众多可能的情况中“只考虑我需要用的值“。
这篇文章中主要是讨论了很多计算几何部分的离散化处理。
 
离散化处理的方式很多,比如使用STL算法进行离散化:
思路:先排序,然后删除重复元素。最后就是查找。
每一步都用到了一个STL算法。排序sort() 删除重复unique() 查找lower_bound()
unique():去除[l, r)中连续的重复元素。函数的返回值是修改后序列的最后一个元素。
lower_bound():函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的。
用一个例子说明:比如序列1 7 9 11 18 23 32 45 67 89。
int pos=lower_bound(a,a+10,32)-a;   pos =6
int pos=lower_bound(a,a+10,9)-a;      pos =2
int pos=lower_bound(a,a+10,89)-a;    pos =9
int pos=lower_bound(a,a+10,33)-a;   pos =7
int pos=lower_bound(a,a+10,65)-a;   pos =8
 
这里插入的位置开始下标是从0开始的,若要从1开始则可以使用upper_bound。 或者int pos=lower_bound(a,a+10,key)-a+1;
 
所以使用STL离散化的思路就是:排序->去重->查找
sort(sub_a,sub_a+n);
int size=unique(sub_a,sub_a+n)-sub_a;//size为离散化后元素个数
for(i=0;i<n;i++)    a[i]=lower_bound(sub_a,sub_a+size,a[i])-sub_a + 1;//k为b[i]经离散化后对应的值

离散化

标签:二分查找   计算   uniq   htm   后序   第一个   span   family   插入   

原文地址:https://www.cnblogs.com/zhgyki/p/9535521.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!