【好记性不如烂笔头】创建一颗用于快速查找数据的多叉树

假定现有大量人员需要管理,给每个人分配一个n位数的id,现要求快速查找,于是我们建一颗10叉树来管理这批人的信息,这样查找结果为真时查询次数为n,时间复杂度为常数,可谓是最优解了

代码如下:
  1 using System;
  2 using System.Collections.Generic;
  3 using System.Diagnostics;
  4 using System.Linq;
  5 using System.Text;
  6 using System.Threading.Tasks;
  7
  8 namespace MultiTrees
  9 {
 10     class Program
 11     {
 12         static void Main(string[] args)
 13         {
 14
 15             Stopwatch watch = new Stopwatch();
 16
 17             /*创建多叉树并存入大量数据并监视插入用时*/
 18             MulTree tree = new MulTree();
 19             watch.Start();
 20             for (long i = 3013101000; i < 3023101171; i++)
 21                 tree.Insert(i+"");
 22             watch.Stop();
 23             Console.WriteLine("添加用时:" + watch.Elapsed.TotalMilliseconds + "ms");
 24
 25             /*查询,并记录查询用时*/
 26             watch = new System.Diagnostics.Stopwatch();
 27             watch.Start();
 28             Node result = tree.SearchSingleNode("3013203182");
 29             watch.Stop();
 30
 31             Console.WriteLine("查询用时:"+watch.Elapsed.TotalMilliseconds+"ms");
 32             Console.WriteLine("查询到数据学号为:"+result.Data);
 33             Console.ReadKey();
 34
 35         }
 36     }
 37     /*多叉树类*/
 38     class MulTree
 39     {
 40         public int Deepth = 10;/*树的深度,存学号就是学号的长度*/
 41         public Node Root { get; set; }/*根节点*/
 42         public MulTree()
 43         {
 44             Root = new Node();
 45         }
 46         /*插入*/
 47         public bool Insert(string str)
 48         {
 49             /*先检测插入字符串是否有效*/
 50             int[] array = new int[Deepth];
 51             bool flag=DetectionString(str, ref array);
 52             if (!flag)
 53             {
 54                 return false;
 55             }
 56             /*开始插入,将字符串写入最后节点的data里面*/
 57             Node temp = Root;
 58             for (int i = 0; i < array.Length; i++)
 59             {
 60                 if (temp == null) temp = new Node();
 61                 if (temp.Childs[array[i]]==null)
 62                     temp.Childs[array[i]] = new Node();
 63                 temp = temp.Childs[array[i]];
 64             }
 65             temp.Data = str;
 66
 67             return true;
 68         }
 69         /*检测字符串是否有效*/
 70         public bool DetectionString(string str, ref int[] array)
 71         {
 72             if (str.Length != Deepth) return false;
 73             char[] strArray = str.ToArray<char>();
 74             int[] intArray = new int[Deepth];
 75             for (int i = 0; i < strArray.Length; i++)
 76             {
 77                 bool flag = int.TryParse(strArray[i] + "", out intArray[i]);
 78                 if (!flag) return false;
 79             }
 80             array = intArray;
 81             return true;
 82         }
 83         /*查找,返回查找到的节点*/
 84         public Node SearchSingleNode(string str)
 85         {
 86             /*检测字符串是否是有效的学号*/
 87             int[] array = new int[Deepth];
 88             bool flag = DetectionString(str, ref array);
 89             if (!flag)
 90             {
 91                 return null;
 92             }
 93
 94             /*开始查询*/
 95             Node result = Root;
 96             for (int i = 0; i < array.Length; i++)
 97             {
 98                 if (result.Childs[array[i]] == null)
 99                     return null;
100                 result = result.Childs[array[i]];
101             }
102             return result;
103         }
104     }
105     /*节点类*/
106     class Node
107     {
108         public Node[] Childs;
109         public string Data{get;set;}
110         public Node()
111         {
112             Childs = new Node[10];
113             for (int i = 0; i < Childs.Length; i++)
114                 Childs[i] = null;
115         }
116     }
117 }

可以看到一千万的数据查询也不过用时0.2毫秒,速度非常快……

这样可以快速获取想要获取的数据是否存在,即使是我国16亿人民的18位身份证号,也只需要18次的比对就可以得出结果,当然这样会消耗大量的内存……这个,就暂时不是我关心的了。

  

2016-10-08 16:02:08

时间: 2024-10-28 11:25:12

【好记性不如烂笔头】创建一颗用于快速查找数据的多叉树的相关文章

好记性不如烂笔头32-java通过过滤器加载常用数据(4)

有很多的数据,更新的频率很低,比如中国行政区划,为避免每次都要从数据库查询,因此可把这些数据放在中,提高系统响应速度. 这种功能可以在很多的地方实现,也可以在过滤器中完成. 我们在上一节说了敏感词过滤器,每一次数据都要读取文件,好像效率稍微低了点,我们把这个加到缓存中吧. 1.JAVA实现利用过滤器实现敏感信息过滤 过滤器的JAVA代码: package com.filter; import java.io.BufferedReader; import java.io.IOException;

好记性不如烂笔头24-JAVA处理数据库事务(2) - 脏数据

读"脏"数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被除撤消,而此时T1把已修改过的数据又恢复原值,T2读到的数据与数据库的数据不一致,则T2读到的数据就为"脏"数据,即不正确的数据. 脏数据在比较复杂的交互式系统中,非常常见. 1.用JAVA处理数据库事务的准备 要有一个能够访问数据库的应用.下面的示例都基于ORACLE进行. create table ffm_account( id int primary key , n

好记性不如烂笔头89-spring3学习(10)-spring3常用schema(持续整理)

Spring3有很多的schema,这些schema对应很多不同的功能.使用这些常用的schema,能让我们避免重复发明轮子,提高我们的开发效率. 我以为这是一个很常见的信息,到网上随便整理下就能完成,可能用的关键词不对,怎么找也没有找到相对比较全面的. 正所谓,好记性不如烂笔头,自己动手把自己能收集到的整理下来,以后需要找资料也能方便点. spring-beans-3.0.xsd 用途:spring3最主要的schema,用于配置bean 命名空间: http://www.springfram

从“好记性不如烂笔头”“记问之学不足为人师”到“一事不知是我之耻”

“好记性不如烂笔头”错在一笔记容易丢失,二考验随时发生而笔记常不随身.因此记到大脑里最可靠. “记问之学不足为人师”错在低估记忆力的作用而盲目推崇推理逻辑,这像不打地基盖楼,要不不牢靠要不会垮. “一事不知是我之耻”这是一种认真积极的态度,这样才能应付随时出现的挑战. 2017年3月12日00:34:22

Python学习中的随笔,好记性不如烂笔头

本文 为博主看了 vamei 的blog 写下的随笔 . 致敬Vamei 1.type()   可以显示参数的类型 如 : a=12   type(a) 为 int 2.python的基本类型 为 int float bool string   如 int :  i=1   ,   float :  f=12.5  ,  bool : b= True  or  Flase , string :  s='Hello , word !' 使用前无需声明类型  即 动态类型 3.1序列有 tuple

好记性不如烂笔头

今天再次深刻领悟这个技能.tm竟然忘记博客园的用户名了.... 好记性不如烂笔头,布布扣,bubuko.com

开篇记(好记性不如烂笔头)

入园两年零三个月,我居然没有一点东西记载下来实在是不应该. 爷爷曾经告诉过我,好记性不如烂笔头.他告诉了我最鲜明的例子.爷爷的脑子一直很好用,记性也是比常人好上一些,当然这也直接导致了爷爷的性格很是高傲.爷爷年轻的时候喜欢舞文弄墨什么的,所以呢每逢人家红白喜事的时候都会去人家及里面瞅上一眼,看看人家送上的喜联或者挽联.有此爱好的还有我的一个另一个宋爷爷,他们经常约好一起的.爷爷老是自信于强悍的记忆能力,每次都是记在脑子中,而宋爷爷却每次都将那些很好的对联记载一个小本子上面.如今爷爷年纪越来越大,

好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)

Java中自带的动态代理的类必须要实现一个接口,而且据说使用反射的效率也并不是很高.于是CGLIB就诞生了. 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生成框架,使用字节码技术生成代理类,理论上比使用Java反射效率要高. 那么我们测试下,这个运行的效率如何. 1. 测试的准备情况 准备1:好记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1) http://blog.csdn.net/ffm83/article/details/

博客开通啦,好记性不如烂笔头

好记性不如烂笔头,勤能补拙.2016年,我即将步入工作,结束十多年的学生生活.如果说,人生每一个阶段都是一个新的开始,那么,今年又是我新生的一年. 新年新希望, 第一:希望自己能够工作顺利,在自己的岗位上做一个称职又出色的员工 第二:希望自己能够每天都开开心心的 第三:努力变美,努力减肥.多读书,多看报,少吃零食多运动- 第四:努力学习.学习才能使自己更上一层楼,才能让自己实现自己的愿望,学无止境,自制,坚持,总结,记录. 第五:希望家人和朋友们都开开心心的,心想事成万事如意. 第六:希望,我和