AVL
树(得名于发明者G. M. Adelson-Velsky 和 E. M. Landis)本质上是一棵带有平衡条件的二叉搜索树。AVL
树具有以下2
个性质:
- 左子树和右子树的深度之差的绝对值不超过
1
; - 左子树和右子树全都是
AVL
树。
AVL
树(得名于发明者G. M. Adelson-Velsky 和 E. M. Landis)本质上是一棵带有平衡条件的二叉搜索树。AVL
树具有以下2
个性质:
1
;AVL
树。
树:树是一种非线性的数据结构,一棵树是n
(n>=0
)个节点的集合。
用来连接相邻节点之间的关系,我们叫做“父子关系”。
我们把没有父节点的节点叫做根节点,节点的上一层节点是其父节点,下一层节点是其子节点,拥有相同父节点的子节点之间互称为兄弟节点。
哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。
哈希算法最重要的特点就是:相同的输入一定得到相同的输出;不同的输入大概率得到不同的输出。
散列表(Hash Table
),也叫“哈希表”或者“Hash表”。是能够通过给定的关键字的值直接访问到具体对应的值的一个数据结构。
通常,我们把这个关键字称为 Key
,把对应的记录称为 Value
,所以也可以说是通过 Key
访问一个映射表来得到 Value
的地址。而这个映射表,也叫作散列函数或者哈希函数,存放记录的数组叫作散列表。
散列表用的是数组支持按照下标随机访问数据的特性,所以散列表其实就是数组的一种扩展,由数组演化而来。
跳表(Skip List)是一个动态数据结构(链表加多级索引),可以支持快速地插入、删除、查找操作的有序链表。
跳表在原有的有序链表上面增加了多级索引,通过索引来实现快速查找。
栈(Stack)和队列(Queue),严格意义上来说,也属于线性表,是一种操作受限的线性表数据结构。
使用栈结构存储数据,讲究“先进后出”,即最先进栈的数据,最后出栈;
使用队列存储数据,讲究“先进先出”,即最先进队列的数据,也最先出队列。
线性表(Linear List)。顾名思义,线性表就是数据排成像一条线一样的结构。每个线性表上的数据最多只有前和后两个方向。比如数组,链表、队列、栈等也是线性表结构。
而与它相对立的概念是非线性表,比如二叉树、堆、图等。之所以叫非线性,是因为,在非线性表中,数据之间并不是简单的前后关系。
数据结构与算法解决的是:如何让计算机更快时间、更省空间的解决问题。
因此需要从执行时间和占用空间两个维度来评估数据结构和算法的性能,二者统称为复杂度。
复杂度描述的是算法执行时间或占用系统空间与数据规模的增长关系。
实现按钮级别的权限控制,基于上一篇Spring Secuirty(六)前后端分离菜单权限控制-前端动态路由的扩展。
前端部分还是基于vue-element-admin模板来演示。
这里实现按钮级别的权限判断的逻辑:每个按钮对应一个权限标识
,后台根据用户角色计算出当前用户可访问的权限标识
列表,前端登录后得到权限标识
列表存入全局,通过单个按钮的权限标识
去匹配列表里的。来实现按钮级别的权限判断。
前端部分,这里基于vue-element-admin模板来演示,
vue-element-admin是一个后台前端解决方案,它基于vue和element-ui实现。