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

简介: 假定现有大量人员需要管理,给每个人分配一个n位数的id,现要求快速查找,于是我们建一颗10叉树来管理这批人的信息,这样查找结果为真时查询次数为n,时间复杂度为常数,可谓是最优解了 代码如下: 1 using System; 2 using System.
假定现有大量人员需要管理,给每个人分配一个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

黑夜给了我黑色的眼睛,我却用它寻找光明
目录
相关文章
|
存储 关系型数据库 物联网
|
2天前
|
云安全 数据采集 人工智能
古茗联名引爆全网,阿里云三层防护助力对抗黑产
阿里云三层校验+风险识别,为古茗每一杯奶茶保驾护航!
古茗联名引爆全网,阿里云三层防护助力对抗黑产
|
6天前
|
人工智能 中间件 API
AutoGen for .NET - 架构学习指南
《AutoGen for .NET 架构学习指南》系统解析微软多智能体框架,涵盖新旧双架构、核心设计、技术栈与实战路径,助你从入门到精通,构建分布式AI协同系统。
302 142
|
6天前
|
Kubernetes 算法 Go
Kubeflow-Katib-架构学习指南
本指南带你深入 Kubeflow 核心组件 Katib,一个 Kubernetes 原生的自动化机器学习系统。从架构解析、代码结构到技能清单与学习路径,助你由浅入深掌握超参数调优与神经架构搜索,实现从使用到贡献的进阶之旅。
281 139
|
2天前
|
存储 机器学习/深度学习 人工智能
大模型微调技术:LoRA原理与实践
本文深入解析大语言模型微调中的关键技术——低秩自适应(LoRA)。通过分析全参数微调的计算瓶颈,详细阐述LoRA的数学原理、实现机制和优势特点。文章包含完整的PyTorch实现代码、性能对比实验以及实际应用场景,为开发者提供高效微调大模型的实践指南。
362 0
|
3天前
|
传感器 人工智能 算法
数字孪生智慧水务系统,三维立体平台,沃思智能
智慧水务系统融合物联网、数字孪生与AI技术,实现供水全流程智能监测、预测性维护与动态优化。通过实时数据采集与三维建模,提升漏损控制、节能降耗与应急响应能力,推动水务管理从经验驱动迈向数据驱动,助力城市水资源精细化、可持续化管理。
264 142
|
1天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
191 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
|
17天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
2天前
|
机器学习/深度学习 人工智能 运维
智能照明稳压节能控制器,路灯节能稳压系统,沃思智能
智能照明调控柜集电力分配、远程控制与能耗管理于一体,支持自动调光、场景切换与云平台运维,广泛应用于市政、商业及工业领域,显著节能降耗,助力智慧城市建设。
180 137