前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考。

一、什么地方会用到树形结构

刚开始一看到这种结构的时候,最先是想到了家谱。家谱就是一种树形结构,那是一种对我来说最为直观的一种理解。然后,在程序开发中,发现,树形结构的应用,更多的是出现在一些后台管理系统。而其具体应用,则是作为类似于windows文件夹的一个菜单导航作用。

而,最近在做的一个项目中,在加载某一产品的类别时,也用到了树形结构。比如说:

生活类

--------A

--------------a

--------B

办公类

--------A

--------B

但就其主要的应用场景,在我目前接触到的项目中,还是后台管理系统统居多。一般,作为后台的管理系统来说,对于性能的要求相对来说没有web端高。其次,一个比较合理的程序设计,一棵树的设计,不会超过太多的分支,比如说,生活类下面,不能超过10个。总体来说,整个菜单项,控制在50—100个左右,是比较多的。而一个类别的深度,也最多是在4-5度左右。个人感觉,如果超过了4-5度,这个程序的设计必须再靠机会考究。(PS:4-5度,已经是我个人的极限了)

二、加载树形结构的几种方式

1,使用递归一次性全部加载

2,使用循环一次性全部加载

3,按需加载(使用到那个,再加载哪个。有些目录,它可能是用不到的,加载出来干嘛。但是,这样的话,无疑又增加了数据库的IO操作)

分析:

前提:用户很少说一次会把每个节点目录的东西都点一遍,它只会挑选为数不多的几个菜单项进行操作。而根据遗传算法的基本思想(用户上次选择了哪些菜单项,她下次还有可能会选择哪些菜单项,靠,我感觉说是程序的局部性原理会更切合实际一点。勿喷,个人联想),或者说是CPU 如果说数据比较少的话,那么使用第二种方法,我认为还是比较合理的。但如果数据多的话,或许使用第三种才是更合适的。

附:科普程序的局部性原理(往简单了说,内存的高速缓存区据说就是根据这个原理来的)

空间局部性;

如果一个用户在本次访问了2号区域数据,比如说上图的生活类 A,那么挨着这个2号区域的周边数据,很有可能会被这个用户下次访问。

时间局部性:

如果一个程序,这次执行了指令,比如说执行了查询用户的select语句,那么,这条语句,很有可能在不久后,再次被使用执行。

三、个人总结

其实,我个人感觉,在程序开发中,局部性原理还是存在的。比如说一些大型的网站利用爬虫爬到的数据,分析一个用户的消费偏好等,这不就是这个用户总是买生活用品,他下次还有可能买生活用品的东东嘛。所以,或许可以做缓存,或者说,静态树形结构(对于一些比较稳定的,我感觉是绝对可以的,而对于一些有先后关系的数据,那么之前的几种,也可以考虑做一下缓存)

还有,在实际的应用中,我们通常会将整个树形结构的节点数据保存起来,但通常,用户真正要获得的数据,只是在最后一层,才是相对来说真正有意义的。那么,或许我们可以直接将大体上的菜单项写进缓存,或者写进程序(因为它没有实际意义,通常很稳定)比如说:

用户管理

----------A

---------------a

----------B

报表控制

---------A报表

---------B报表

【java基础 5】树形结构数据加载的思考的更多相关文章

  1. 【Tree 3】树形结构数据加载的思考

    前面两篇文章,分别介绍了使用递归和非递归算法加载树形结构数据的方式,本篇文章,则是自己闲下来的时候,进行的一点小思考. 一.什么地方会用到树形结构 刚开始一看到这种结构的时候,最先是想到了家谱.家谱就 ...

  2. 【Java基础】通过getResourceAsStream() 加载资源文件

    Class.getResourceAsStream(String path) path不以"/"开头时,默认是从当前类所在的包下面获取资源 path以"/"开头 ...

  3. Java基础_类的加载机制和反射

    类的使用分为三个步骤: 类的加载->类的连接->类的初始化 一.类的加载 当程序运行的时候,系统会首先把我们要使用的Java类加载到内存中.这里加载的是编译后的.class文件 每个类加载 ...

  4. java基础—多态(动态加载)

    一.面向对象最核心的机制——动态绑定,也叫多态

  5. Java类加载机制及自定义加载器

    转载:https://www.cnblogs.com/gdpuzxs/p/7044963.html Java类加载机制及自定义加载器 一:ClassLoader类加载器,主要的作用是将class文件加 ...

  6. Java程序设计19——类的加载和反射-Part-A

    1 本文概要 本章介绍Java类的加载.连接和初始化的深入知识,并重点介绍Java反射相关的内容.本章知识偏底层点,这些运行原理有助于我们更好的把我java程序的运行.而且Java类加载器除了根加载器 ...

  7. java调用phantomjs采集ajax加载生成的网页

    java调用phantomjs采集ajax加载生成的网页 日前有采集需求,当我把所有的对应页面的链接都拿到手,准备开始根据链接去采集(写爬虫爬取)对应的终端页的时候,发觉用程序获取到的数据根本没有对应 ...

  8. java类到底是如何加载并初始化的?

    Java虚拟机如何把编译好的.class文件加载到虚拟机里面?加载之后如何初始化类?静态类变量和实例类变量的初始化过程是否相同,分别是如何初始化的呢?这篇文章就 是解决上面3个问题的. 若有不正之处, ...

  9. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

随机推荐

  1. MVC ef 连接数据库

    1.创建数据库 2.创建表 <pre name="code" class="sql">CREATE TABLE [dbo].[Student]( [ ...

  2. 杂谈 什么是伪共享(false sharing)?

    问题 (1)什么是 CPU 缓存行? (2)什么是内存屏障? (3)什么是伪共享? (4)如何避免伪共享? CPU缓存架构 CPU 是计算机的心脏,所有运算和程序最终都要由它来执行. 主内存(RAM) ...

  3. 【转】HashMap 和 HashTable 到底哪不同 ?

    2017/05/29 | 分类: 基础技术 | 2 条评论 | 标签: HASHMAP, HASHTABLE 分享到: 原文出处: 程序员赵鑫 HashMap和HashTable有什么不同?在面试和被 ...

  4. Android 仿微信朋友圈发表图片拖拽和删除功能

    朋友圈实现原理 我们使用 Android Device Monitor 来分析朋友圈发布图片的界面实现原理.如果需要分析其他应用的界面实现也是采用这种方法哦. 打开 Android Device Mo ...

  5. Microsoft Sql server2005的安装步骤和常见问题解决方案

    一:安装sql server 2005过程中出现 如下问题:“选择的功能中没有任何功能可以安装或升级”: 解决方案:Microsoft SQL Server 2005→配置工具→SQL配置管理器→SQ ...

  6. 访问修饰符(C# 参考)

    第一篇 就抄写了一下下MSDN上面的东西练练手吧!!! 访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性.             本节介绍四个访问修饰符: public protected ...

  7. mysql利用binlog恢复数据详细例子

    模拟数据恢复的案例 有些时候脑瓜就会短路,难免会出错 场景:在生产环境中,我们搭建了mysql主从,备份操作都是在从备份数据库上 前提:有最近一天或者最近的全备 或者最近一天相关数据库的备份 最重要的 ...

  8. 2006: C语言实验——拍皮球

    2006: C语言实验——拍皮球 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 231  Solved: 162[Submit][Status][Web ...

  9. soapui测试https双向验证p12项目

    1.准备好p12 和jsk秘钥文件 2.配置soapui ssl 其中: 1:jks就是放在trustStore那里,密码填写为 106075 2:p12放到keystore,密码填写:180000 ...

  10. Mysql,SqlServer,Oracle主键自动增长的设置

    在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: CREATE TABLE google(id INT AUTO_INCREMENT PRIMARY ...