java 数据结构源码--线段树
线段树模板
package segmentTree;public class SegmentTree {private class Segment { int left; int right; int count; Segment leftChild; Segment rightChild; } private Segment root; public SegmentTree (int left, int right) { root = new Segment(); build(root, left, right); } public void insert(int left, int right) { insert(root, left, right); } public int caculateExistingTimes(int target) { return caculateExistingTimes(root, target); } //从根节点开始查找叶子结点[target, target],对经过的节点的count求和 private int caculateExistingTimes(Segment root, int target) { int result = 0; while( root.left != root.right) { int rootMid = root.left + (root.right - root.left) / 2; result += root.count; if (target <= rootMid) { root = root.leftChild; } else if (target > rootMid) { root = root.rightChild; } } return result; } private void build(Segment root, int left, int right) { root.left = left; root.right = right; if (left != right) { int mid = left + (right - left) / 2; root.leftChild = new Segment(); root.rightChild = new Segment(); build(root.leftChild, left, mid); build(root.rightChild, mid + 1, right); } } private void insert(Segment root, int left, int right) { int rootLeft = root.left; int rootRight = root.right; int rootMid = rootLeft + (rootRight - rootLeft) / 2; //匹配,出现次数加1 if (left == rootLeft && right == rootRight) { root.count++; return; } if (right <= rootMid) { insert(root.leftChild, left, right); } else if (left > rootMid){ insert(root.rightChild, left, right); } else { insert(root.leftChild, left, rootMid); insert(root.rightChild, rootMid + 1, right); } } }
测试源码 test.java
/** * 线段树入门 * 问题:已知线段[2,5] [4,6] [0,7];求点2,4,7分别出现了多少次 * 以下代码建立的线段树用链表来保存,且树的叶子结点类似[i,i] */ package segmentTree;
import segmentTree.SegmentTree;public class test {public static void main(String[] args) { SegmentTree tree = new SegmentTree(0, 7); int[][] segments = { {2, 5}, {4, 6}, {0, 7} }; int[] targets = {2, 4, 7}; for (int i = 0, len = segments.length; i < len; i++) { int[] segment = segments[i]; tree.insert(segment[0], segment[1]); } for(int target : targets) { System.out.println(target + ":" + tree.caculateExistingTimes(target)); } } }
java 数据结构源码--线段树相关推荐
- java 数据结构源码--Trie树
node package trieTree;public class TrieTreeNode {final int MAX_SIZE=26; int nCount;//记录该字符出现次数 char ...
- 数据结构源码笔记(C语言):Huffman树字符编码
#include <stdio.h> #include<string.h> #define N 10 /*待编码字符的个数,即树中叶结点的最大个数*/ #define M 2* ...
- 数据结构源码笔记(C语言):哈夫曼树
#include <stdio.h> #include <stdlib.h> #define MAXINT 2147483647 #define MAXNUM 50 #defi ...
- 数据结构源码笔记(C语言):B树的相关运算算法
//B树的相关运算算法#include<stdio.h> #include<malloc.h>#define MAXM 10//定义B树最大的阶数 typedef int Ke ...
- 数据结构源码笔记(C语言描述)汇总
数据结构源码笔记(C语言):英文单词按字典序排序的基数排序 数据结构源码笔记(C语言):直接插入排序 数据结构源码笔记(C语言):直接选择排序 数据结构源码笔记(C语言):置换-选择算法 数据结构源码 ...
- 数据结构源码笔记(C语言):英文单词按字典序排序的基数排序
//实现英文单词按字典序排序的基数排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#defin ...
- 数据结构源码笔记(C语言):索引文件建立和查找
//实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...
- 数据结构源码笔记(C语言):快速排序
//实现快速排序算法 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...
- 数据结构源码笔记(C语言):冒泡排序
//冒泡排序算法实现 #include<stdio.h> #include<malloc.h> #define MAXE 20typedef int KeyType; type ...
最新文章
- python学精通要多久-零基础零经验自学Python,到精通Python要多久啊?
- 【Linux】【服务器】 CentOS7下安装Redis详细过程步骤
- 【NOI1995】石子合并
- 21_Android中常见对话框,光传感器,通过重力感应器编写出指南针应用,帧动画,通过Jav代码的方式编写补间动画,通过XML的方式编写补间动画
- Oracle adviser,Oracle10g SQL tune adviser
- CSS每日学习笔记(3)
- 人工智障学习笔记——机器学习(1)特征工程
- Linux系统的启动引导过程(转)
- Python学习之路_day_25(面向对象之封装/多态/组合)
- 云计算技术前景怎么样?
- python串口数据分包_python TCP Socket的粘包和分包的处理详解
- rocketmq消息存储原理_RocketMQ到底快在哪里?深入探索RocketMQ消息存储和查询原理...
- ssm毕设项目自来水收费管理系统7yd5p(java+VUE+Mybatis+Maven+Mysql+sprnig)
- 二级考试内容之C和Python
- qemu毒液漏洞分析(2015.9)
- 动态图象专家组 MPEG-4
- SysTick系统滴答定时器
- Easyrecovery2022硬盘磁盘U盘免费数据恢复软件
- DSP视频教程第2期:系统介绍ARM DSP数字信号处理库以及超简单的移植方法分享(2022-01-27)
- Linux chmod命令用法
热门文章
- 【Java 网络编程】网络相关概念
- MySQL 搜索指定时间范围数据, 时间字段有索引但是还是很费时
- lunix下的redis数据库操作——hash(哈希)
- 关于使用data()获取自定义属性出现undefined的说明
- bzoj 2962 序列操作
- G面经prepare: Pattern Match
- C#获取邮件客户端保存的邮箱密码
- 双击打开excel时提示:向程序发送命令时出现问题
- 香港科技园公司“牵手”腾讯 共推香港金融科技发展
- 内排序及时间复杂度分析-插入排序选择排序交换排序归并排序分配和索引排序对比...