trie树java_【数据结构】Trie树的应用:查询IP地址的ISP(Java实现)
查询IP地址的ISP
给定一个IP地址,如何查询其所属的ISP,如:中国移动(ChinaMobile),中国电信(ChinaTelecom),中国铁通(ChinaTietong)?
现在网上有ISP的IP地址区段可供下载,比如中国移动的IP地址段
103.20.112.0/22
103.21.176.0/22
111.0.0.0/10
112.0.0.0/10
117.128.0.0/10
120.192.0.0/10
183.192.0.0/10
211.103.0.0/17
211.136.0.0/14
211.140.0.0/15
211.142.0.0/17
211.142.128.0/17
211.143.0.0/16
218.200.0.0/14
218.204.0.0/15
218.206.0.0/15
221.130.0.0/15
221.176.0.0/13
223.112.0.0/14
223.116.0.0/15
223.120.0.0/13
223.64.0.0/11
223.96.0.0/12
36.128.0.0/10
39.128.0.0/10
上述网络地址是CIDR记法:IP地址/网络id位数,其中IP地址分为两部分
网络id
主机id
比如,192.168.23.35/21,其子网掩码为11111111 11111111 11111000 00000000即255.255.248.0,网络ID:192.168.00010111
ip地址103.20.112.168,发现与103.20.112.0/22前22位相匹配,则此IP地址属于中国移动
Trie树实现查询
Trie树使用公共前缀,降低查询时间,减小了存储空间。为了构建Trie树,将IP地址二进制化,这样Trie树变成了一棵二叉树,左孩子节点为0,右孩子节点为1。叶子节点存储IP地址所对应的ISP。
Trie树的Java实现
/*
* Trie树,用于存储、检索ip地址
* 叶子节点标记为ip地址对应的ISP
*/
public class TrieTree{
private Node root = null; //根节点
/*二叉树的节点*/
private static class Node{
String element; //非叶子节点为空 叶子节点标记为ISP
Node[] children; //左孩子节点为0 右孩子节点为1
public Node() {
element = "";
children = new Node[2];
for (int i = 0; i < children.length; i++) {
children[i] = null;
}
}
}
public TrieTree() {
root = new Node();
}
/*插入ip地址*/
public void insert(Node root, String ipAddress, String isp) {
if(ipAddress.length() > 32) {
System.out.println("ip地址处理错误");
} else {
Node crawl = root;
for(int i=0; i
int index = (int) ipAddress.charAt(i) - ‘0‘;
if(crawl.children[index] == null) {
crawl.children[index] = new Node();
}
crawl = crawl.children[index];
}
crawl.element = isp;
}
}
public void insert(String ipAddress, String isp) {
insert(root, ipAddress, isp);
}
/*
* 检索ip地址,返回其所对应的ISP
* 若不在Trie树中,则返回null
* */
public String search(String binaryIP) {
Node crawl = root;
for(int i = 0; crawl.element.length() == 0; i++) {
int index = (int) binaryIP.charAt(i) - ‘0‘;
if(crawl.children[index] == null) {
return null;
}
crawl = crawl.children[index];
}
return crawl.element;
}
}
IP地址格式化
下面的class给出两个方法,实现
将IP地址转变成二进制
从CIDR记法的IP地址中得到网络ID部分
/*
* IP地址CIDR记法:network.host/size
* 比如:103.20.112.0/22
* 功能:将IP地址转换成其network地址
*/
public class IPFormat{
/*将ip地址转换成32位的二进制*/
public static String toBinaryNumber(String ipAddress) {
String[] octetArray = ipAddress.split("\\.");
String binaryNumber = "";
for(String str: octetArray) {
int octet = Integer.parseInt(str, 10);
String binaryOctet = Integer.toBinaryString(octet);
int bolength = binaryOctet.length();
if(bolength < 8) {
for (int i = 0; i < 8 - bolength; i++) {
binaryOctet = ‘0‘ + binaryOctet; //补前导0
}
}
binaryNumber += (binaryOctet);
}
return binaryNumber;
}
/*获取network地址部分*/
public static String getNetworkAddress(String cidrAddress) {
String[] cidrArray = cidrAddress.split("/");
String binaryNumber = toBinaryNumber(cidrArray[0]);
int size = Integer.parseInt(cidrArray[1]);
return binaryNumber.substring(0, size);
}
/*main方法用于测试*/
public static void main(String[] args) {
String ip = "103.20.112.0/20";
String bn = getNetworkAddress(ip);
System.out.println(bn);
}
}
trie树java_【数据结构】Trie树的应用:查询IP地址的ISP(Java实现)相关推荐
- 心中有“树”:数据结构之树详解
文章目录 前言 (一)树的基础定义与表示 1 树的定义 2 树的图示 3 树的逻辑结构表示法 (二)二叉树 1 二叉树定义 2 二叉树示意图 3 程序实现 (1)节点定义 (2)二叉树的先序遍历 (3 ...
- python数据结构 树_Python数据结构——AVL树的实现
既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调 ...
- mysql树状数据结构_树状结构的数据表如何设计?
使用Modified Preorder Tree简直是必须的.网上可以搜一下modified preorder tree travesal找到相关资料.参考 http://www.sitepoint. ...
- 数据结构超市选址、最短路径查询、地址信息查询
设计河北师范大学的校园平面图,至少包括15个以上的地点,每两个地点间可以有不同的路,且路长可能不同.以图中顶点表示校内各地点,存放名称.代号.简介等信息:用边表示路径,存放路径长度等相关信息. 2.提 ...
- 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全
文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...
- trie树的数据结构_C / C ++中的Trie数据结构
trie树的数据结构 A Trie data structure acts as a container for a dynamic array. In this article, we shall ...
- mysql索引用trie树_数据结构与算法之美【完整版】
资源目录: ├─01-开篇词 (1讲) │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法"这道坎.html │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法&qu ...
- Trie 树(数据结构)
1.Trie树的概念 Trie树是数据结构比较简单的一种.Trie 树的基本用法是高效的存储和查找字符串集合的数据结构.Trie树也叫做字典树,它是一个树形结构.是一种专门处理字符串匹配的数据结构,用 ...
- 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机
目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...
最新文章
- 阿杜版主 我找您有事想请教下您!!
- Java内存管理:深入Java内存区域
- boost库 数组智能指针scoped_array
- webform 页面传值的方法总结
- CentOS Apache服务器配置https
- 航天信息服务器共享单元,防伪税控主机共享服务器
- ahk写入excel单元格_【进阶】Excel 自动化教程
- ps怎么对比原图快捷键_图片查看方式快捷键
- 4k纸是几厘米乘几厘米_4k纸多大(4k纸有几张a4纸大)
- 联想小新笔记本电脑显示很暗, 教你如何将将其亮度调到最高
- 马云退隐前,在年会上说了最重要的三件事
- python-gif图生成
- 做每个人的互联网中心
- 微信内分享链接防红防封技术系统的实现方案
- 什么样的人适合做项目经理
- DHTMLX JS框架,日程JS框架 功能强大 收藏!
- 微信小程序开发动态设置tabbar
- User-Agent是什么意思捏?
- 所有行业都适合推行6s管理吗?
- 快速对Oracle数据库的了解 ---2
热门文章
- python编程入门详解_python编程入门知识练习
- this.$modal.confirm 自定义按钮关闭_Excel迫使人类基因重命名?用VBA给科学家们支一招!—— 怎样快速定制工具栏按钮...
- python下载大文件mp4_Python代码打开本地.mp4格式文件的方法
- 计算机安装了打印驱动无法打印,安装打印机的时候为什么电脑无法正常识别打印机?...
- java sql参数_java-从SQL查询检索参数
- 计算机社区活动,计算机与信息学院“e修哥”党支部进社区开展志愿服务活动...
- 计算机技术+智能化水电站,水电工程BIM用太少?水电工程BIM案例全解读
- 数据分析如何入门,以及如何做职业规划?
- RUN++ | 对比学习加持,多轮对话改写新SOTA!
- 博士申请 | 香港中文大学(深圳)罗元教授招收计算机与信息工程全奖博士