算法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);
}

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

插入操作

插入区间的时候,根据普通二叉树的规则进行插入,在插入完成之后需要更新所有父节点的最大右区间。

查找操作

查找操作需要执行一下步骤:

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

复杂度

所有操作的复杂度均为logN。

算法5-7:区间搜索

时间: 2024-10-10 17:18:13

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

算法7-3:深度优先搜索

深度优先搜索最初是因为迷宫游戏而诞生的.在一个迷宫中,有一个入口和一个出口,其中只有一条路径能从入口到达出口.在走迷宫的时候,每次将走过的地方进行标记,遇到死胡同的时候可以沿着进来的路线后退,找到新的没走过的拐角再尝试新的路线.这种方法的效率很高,因为每个地方只需要走过一次即可.其实,这就是深度优先搜索. 深度优先搜索的目标就是系统化地遍历整个图,让算法的效率更高. 应用 深度优先搜索有几个非常典型的应用: 找出源顶点能到达的所有顶点 找出两个顶点之间的路径 判断两个顶点是否连通 基本思想 深度

编程算法 - 背包问题(记忆化搜索) 代码(C)

背包问题(记忆化搜索) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目参考: http://blog.csdn.net/caroline_wendy/article/details/37912949 使用记忆化搜索, 需要存储每组的值, 下次不需要进行继续迭代, 可以降低至时间复杂度O(nW). 代码: /* * main.cpp * * Created on: 2014.7.17 * Author: spike */ /*eclipse c

CSS+JS的拖动滑块实现价格区间搜索效果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

算法图解之广度优先搜索

广度优先搜索的应用场景,如下:(1)编写国际跳棋AI,计算最少走多少步就可获胜;(2)编写拼写检查器,计算最少编辑多个地方就可将错拼的单词改为正确的单词,如将READED改为READER需要编辑一个地方;(3)根据你的人际关系网络找到关系最近的医生; 图简介 假设你居住在旧金山,要从双子峰前往金门大桥.你想乘公交车前往,并希望换乘最少.可乘坐的公交车如下: 由图可知,换乘最少的路线是:步行->44路公交车->28路公交车(一共三步,这种问题也被称作为最短路径问题,解决最短路径问题的算法,又称广

算法dfs——二叉搜索树中最接近的值 II

901. 二叉搜索树中最接近的值 II 中文 English 给定一棵非空二叉搜索树以及一个target值,找到 BST 中最接近给定值的 k 个数. 样例 样例 1: 输入: {1} 0.000000 1 输出: [1] 解释: 二叉树 {1},表示如下的树结构: 1 样例 2: 输入: {3,1,4,#,2} 0.275000 2 输出: [1,2] 解释: 二叉树 {3,1,4,#,2},表示如下的树结构: 3 / 1 4 2 挑战 假设是一棵平衡二叉搜索树,你可以用时间复杂度低于O(n)

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

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

算法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

【算法】字符串近似搜索(转)

来源:.Net.NewLife.    需求:假设在某系统存储了许多地址,例如:“北京市海淀区中关村大街1号海龙大厦”.用户输入“北京 海龙大厦”即可查询到这条结果.另外还需要有容错设计,例如输入“广西 京岛风景区”能够搜索到"广西壮族自治区京岛风景名胜区".最终的需求是:可以根据用户输入,匹配若干条近似结果共用户选择.    目的:避免用户输入类似地址导致数据出现重复项.例如,已经存在“北京市中关村”,就不应该再允许存在“北京中关村”. 举例: 此类技术在搜索引擎中早已广泛使用,例如

《github一天一道算法题》:搜索二叉树接口实现大合集

读书.思考.写代码! 说明: (1)这里实现了搜索二叉树的全部常用操作 (2)限于时间和精力,实现的较为粗糙,内存泄露.成员变量访问控制.返回类型.异常安全等没有照顾的到 (3)一切实现的手段都是贴近底层操作,关注原理.以后可能对推倒重来,实现一个完备的接口系统. /********************************************* * [email protected] * 题目:二叉树接口实现大合集 * 具体:二叉树的创建.插入.最大值.最小值.前中后序递归遍历与非递