算法5-7:区间检索

间隔搜索问题给出了一系列的范围,而测试的时间间隔,寻找和测试间隔交叉间隔。

为了解决问题,须要专门编写一个类,这个类的接口例如以下:

public interface IntervalST<Key extends Comparable<Key>, Value> {
    void put(Key lo, Key hi, Value value);
    Value get(Key lo, Key hi)
    void delete(Key lo, Key hi)
    Iterable<Value> intersect(Key lo, Key hi);
}

每一个节点中有两个值。第一个值是区间的起点和终点,第二个值是该节点以及子节点中最大的区间终点。为了简化问题,将二叉树以区间起点作为keyword。

插入操作

插入区间的时候,依据普通二叉树的规则进行插入。在插入完毕之后须要更新全部父节点的最大右区间。

查找操作

查找操作须要运行一下步骤:

  • 假设当前节点与被搜索的区间有交集,返回当前节点
  • 假设左子节点是空的,向右側深入
  • 假设整个区间在当前节点的左側,向左側深入
  • 其余情况向右側深入

复杂度

全部操作的复杂学位logN。

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-14 10:40:11

算法5-7:区间检索的相关文章

算法5-7:区间搜索

区间搜索问题就是给定一系列区间,和一个待测区间,求与待测区间相交的区间. 为了解决这个问题,需要专门编写一个类,这个类的接口如下: public interface IntervalST<Key extends Comparable<Key>, Value> { void put(Key lo, Key hi, Value value); Value get(Key lo, Key hi) void delete(Key lo, Key hi) Iterable<Value&

【uva 1615】Highway(算法效率--贪心 区间选点问题)

题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我先空着.挖坑~

数据结构和算法-005 数组排序 二分法检索

二分法检索 二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中, 首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功: 否则,若key小,则在字典前半部分中继续进行二分法检索; 若key大,则在字典后半部分中继续进行二分法检索. 这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败. 偶数个取中间2个其中任何一个作为中间元素 二分法检索是一种效率较高的检索方法,

根据商品名称、价格区间检索商品的SQL语句

如果名称和价格为空会检索出所有的数据 1 1 select * from TblProduct 2 2 where (@proName='' or chvProName like '%'+@proName+'%') 3 3 and (@minPrice='' or mnyProPrice>=@minPrice) 4 4 and (@maxPrice='' or mnyProPrice<=@maxPrice); 5 5 6 6--下面将参数替换成字符串 7 7 --测试 8 8 select *

算法模板——splay区间反转 2

实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没有像一般二叉排序树那样子用一个参量进行排序,而是直接以中序遍历来构建了一个普通的二叉树(当然也可以把每个点的中序遍历排名视作参量),然后插入的时候就是指定位置插入(这个就比较像是文本插入了) 总之得到了较大的提升,代码优美程度也提高不少 1 var 2 i,j,k,l,m,n,head,tot,ll

算法模板——splay区间反转

实现的功能:将序列区间反转,并维护 详见BZOJ3223 1 var 2 i,j,k,l,m,n,head,a1,a2:longint; 3 s1:ansistring; 4 a,b,c,d,fat,lef,rig:array[0..200000] of longint; 5 procedure swap(var x,y:longint);inline; 6 var z:longint; 7 begin 8 z:=x;x:=y;y:=z; 9 end; 10 11 procedure ext(x

贪心算法选择不相交区间

Input 输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示.n=0表示输入结束,不做处理. Output 对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行. Sample Input 12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8

贪心算法设计 关于区间选择问题

/* 现在有n项工作,知道每一项工作的开始时间和结束时间,问最多可以选择多少工作 算法设计:贪心算法,不断选择不冲突的那些结束时间最短的工作 */ #include<iostream> #include<vector> #define max_n 100001 using namespace std; int N; //first is the start of the job,and the secone is the end time of the job typedef pa

ST算法(RMQ区间最值问题)

ST算法能在O(NlogN)时间内对数列a预处理,以O(1)的时间复杂度在线回答“数列a中下标在l~r之间的数的最大(小)值是多少预处理:f[i][j]表示数列a中下标在子区间[i,i+2^j-1]里的数的最大(小)值,即i开始的2^j个数的最大(小)值f[i][j]=max(f[i][j-1],f[i+2^j-1][j-1],即长度为2^j的子区间的最大值是左右两半长度为2^(j-1)的子区间的最大值中较大的一个 void ST_prework(){  for(int i=1;i<=n;i++