假定现有大量人员需要管理,给每个人分配一个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
黑夜给了我黑色的眼睛,我却用它寻找光明