查询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. 心中有“树”:数据结构之树详解

    文章目录 前言 (一)树的基础定义与表示 1 树的定义 2 树的图示 3 树的逻辑结构表示法 (二)二叉树 1 二叉树定义 2 二叉树示意图 3 程序实现 (1)节点定义 (2)二叉树的先序遍历 (3 ...

  2. python数据结构 树_Python数据结构——AVL树的实现

    既然,我们已经证明,保持 AVL 树的平衡将会使性能得到很大的提升,那我们看看如何在程序中向树插入一个新的键值.因为所有的新键是作为叶节点插入树的,而新叶子的平衡因子为零,所以我们对新插入的节点不作调 ...

  3. mysql树状数据结构_树状结构的数据表如何设计?

    使用Modified Preorder Tree简直是必须的.网上可以搜一下modified preorder tree travesal找到相关资料.参考 http://www.sitepoint. ...

  4. 数据结构超市选址、最短路径查询、地址信息查询

    设计河北师范大学的校园平面图,至少包括15个以上的地点,每两个地点间可以有不同的路,且路长可能不同.以图中顶点表示校内各地点,存放名称.代号.简介等信息:用边表示路径,存放路径长度等相关信息. 2.提 ...

  5. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  6. trie树的数据结构_C / C ++中的Trie数据结构

    trie树的数据结构 A Trie data structure acts as a container for a dynamic array. In this article, we shall ...

  7. mysql索引用trie树_数据结构与算法之美【完整版】

    资源目录: ├─01-开篇词 (1讲) │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法"这道坎.html │ ├─00丨开篇词丨从今天起,跨过"数据结构与算法&qu ...

  8. Trie 树(数据结构)

    1.Trie树的概念 Trie树是数据结构比较简单的一种.Trie 树的基本用法是高效的存储和查找字符串集合的数据结构.Trie树也叫做字典树,它是一个树形结构.是一种专门处理字符串匹配的数据结构,用 ...

  9. 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机

    目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...

最新文章

  1. 阿杜版主 我找您有事想请教下您!!
  2. Java内存管理:深入Java内存区域
  3. boost库 数组智能指针scoped_array
  4. webform 页面传值的方法总结
  5. CentOS Apache服务器配置https
  6. 航天信息服务器共享单元,防伪税控主机共享服务器
  7. ahk写入excel单元格_【进阶】Excel 自动化教程
  8. ps怎么对比原图快捷键_图片查看方式快捷键
  9. 4k纸是几厘米乘几厘米_4k纸多大(4k纸有几张a4纸大)
  10. 联想小新笔记本电脑显示很暗, 教你如何将将其亮度调到最高
  11. 马云退隐前,在年会上说了最重要的三件事
  12. python-gif图生成
  13. 做每个人的互联网中心
  14. 微信内分享链接防红防封技术系统的实现方案
  15. 什么样的人适合做项目经理
  16. DHTMLX JS框架,日程JS框架 功能强大 收藏!
  17. 微信小程序开发动态设置tabbar
  18. User-Agent是什么意思捏?
  19. 所有行业都适合推行6s管理吗?
  20. 快速对Oracle数据库的了解 ---2

热门文章

  1. python编程入门详解_python编程入门知识练习
  2. this.$modal.confirm 自定义按钮关闭_Excel迫使人类基因重命名?用VBA给科学家们支一招!—— 怎样快速定制工具栏按钮...
  3. python下载大文件mp4_Python代码打开本地.mp4格式文件的方法
  4. 计算机安装了打印驱动无法打印,安装打印机的时候为什么电脑无法正常识别打印机?...
  5. java sql参数_java-从SQL查询检索参数
  6. 计算机社区活动,计算机与信息学院“e修哥”党支部进社区开展志愿服务活动...
  7. 计算机技术+智能化水电站,水电工程BIM用太少?水电工程BIM案例全解读
  8. 数据分析如何入门,以及如何做职业规划?
  9. RUN++ | 对比学习加持,多轮对话改写新SOTA!
  10. 博士申请 | 香港中文大学(深圳)罗元教授招收计算机与信息工程全奖博士