几种树形结构的总结

数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

数据结构包含三方面的内容:逻辑结构、存储结构和数据的运算。数据的逻辑结构与存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的的存储结构。逻辑结构(线性结构与非线性结构)存储结构(顺序存储、链式存储、索引存储、散列存储)

线性结构

数据元素之间存在一对一的关系

 

线性表 栈、队列、数组、串

线性表是具有相同数据类型的n个数据元素的有序序列

 

顺序表:物理顺序(内存的分配顺序)逻辑顺序(元素占用内存的顺序)一致

 

如图 通过首地址和元素序号可以在O(1)时间内找到指定元素

但也因为俩顺序一致所以插入和删除的话都得往后移动元素

顺序表用数组实现 顺序表的特点即是数组的特点

 

链表 不要求物理顺序(内存的分配顺序)逻辑顺序(元素占用内存的顺序)一致 对链表的操作只要修改指针即可 。

由于链表的元素是离散的分布在存储空间中,不能直接找到表中的某个特定的结点,查找某个特点的结点时,需要从表头开始遍历,依次查找

以下是双链表的插入操作   LinkedList 采用双链表

 

单链表与双链表各自特点

非线性结构(数据元素之间是一对多或者多对多的关系)

、图等

 

关于树的查找算法比较

 

 

 

 

 

 

 

二叉排序树

左节点的数据值小于根节点  右节点的数值大于根节点

平均查找长度是O(n)

 平衡因子左右子树之差<=1

 

 

平衡二叉树 (特殊的二叉排序树)

平均查找长度是 因为他的平衡二叉树的高度小

平衡二叉树查询的时间复杂度是,查找速度最快和比较次数最少,既然性能已经如此优秀,但为什么实现索引是使用B-Tree而不是二叉查找树,关键因素是查询磁盘IO的次数。

 

数据库索引是存储在磁盘上,当表中的数据量比较大时,索引的大小也跟着增长,达到几个G甚至更多。当我们利用索引进行查询的时候,不可能把索引全部加载到内存中,只能逐一加载每个磁盘页,这里的磁盘页就对应索引树的节点。每个结点加载一次磁盘io,减少磁盘IO的次数就必须要压缩树的高度,让瘦高的树尽量变成矮胖的树,所以B-Tree就在这样伟大的时代背景下诞生了

http://m.elecfans.com/article/662237.html  解释

 

 

B树 又称多路平衡查找树

一棵m叉树

  1. 树中每个结点至多有m棵子树
  2. 若根节点不是终端结点,则至少有两颗子树
  3. 除根结点外所有叶结点至少有m/2棵子树

 

B树图示

 

每个结点的关键字个数1<=n<=m-1

 

B+树图示

 

关键字 1<=n<=m

每个关键字不保存数据,只用来索引  就是说 5 28 65  可以通过P1 P2 P3  在子节点中找到 P1 P2 P3的地址就是5 28 65在子节点中的位置

 

 

 B+树与B-tree树比较

1、B+树中间节点没有卫星数据(索引元素所指向的数据记录),只有索引,而B树每个结点中的每个关键字都有卫星数据;这就意味着同样的大小的磁盘页可以容纳更多节点元素,在相同的数据量下,B+树更加“矮胖”,IO操作更少

2、因为卫星数据的不同,导致查询过程也不同;B树的查找只需找到匹配元素即可,最好情况下查找到根节点,最坏情况下查找到叶子结点,所说性能很不稳定,而B+树每次必须查找到叶子结点,性能稳定

 

 

哈希表存在一种函数映射关系

 

 

解决哈希冲突的方法 1:开放定址法 2 拉链法(hashmap采用)等

红黑树是一种弱平衡二叉树,平衡二叉树采用严格的旋转算法保证平衡,在修改删除元素的时候性能要略低,适用于读取数据频繁而修改较少的场景,红黑树适用于修改较多的场景,Hashmap被认为是修改操作要远多于查询操作的数据结构,因此使用的是红黑树

红黑树的形象介绍 https://blog.csdn.net/qq_36610462/article/details/83277524

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
$(function(){ $.fn.extend({ SimpleTree:function(options){ //初始化参数 var option = $.extend({ click:function(a){ } },options); option.tree=this; /* 在参数对象中添加对当前菜单树的引用,以便在对象中使用该菜单树 */ option._init=function(){ /* * 初始化菜单展开状态,以及分叉节点的样式 */ this.tree.find("ul ul").hide(); /* 隐藏所有子级菜单 */ this.tree.find("ul ul").prev("li").removeClass("open"); /* 移除所有子级菜单父节点的 open 样式 */ this.tree.find("ul ul[show='true']").show(); /* 显示 show 属性为 true 的子级菜单 */ this.tree.find("ul ul[show='true']").prev("li").addClass("open"); /* 添加 show 属性为 true 的子级菜单父节点的 open 样式 */ }/* option._init() End */ /* 设置所有超链接不响应单击事件 */ this.find("a").click(function(){ $(this).parent("li").click(); return false; }); /* 菜单项 接受单击 */ this.find("li").click(function(){ /* * 当单击菜单项 * 1.触发用户自定义的单击事件,将该 标签中的第一个超链接做为参数传递过去 * 2.修改当前菜单项所属的子菜单的显示状态(如果等于 true 将其设置为 false,否则将其设置为 true) * 3.重新初始化菜单 */ option.click($(this).find("a")[0]); /* 触发单击 */ /* * 如果当前节点下面包含子菜单,并且其 show 属性的值为 true,则修改其 show 属性为 false * 否则修改其 show 属性为 true */ /* if($(this).next("ul").attr("show")=="true"){ $(this).next("ul").attr("show","false"); }else{ $(this).next("ul").attr("show","true"); }*/ /* 初始化菜单 */ option._init(); }); /* 设置所有父节点样式 */ this.find("ul").prev("li").addClass("folder"); /* 设置节点“是否包含子节点”属性 */ this.find("li").find("a").attr("hasChild",false); this.find("ul").prev("li").find("a").attr("hasChild",true); /* 初始化菜单 */ option._init(); }/* SimpleTree Function End */ }); });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值