- 博客(53)
- 资源 (1)
- 问答 (1)
- 收藏
- 关注
原创 数据结构和算法-基础篇-红黑树(上)
1. 红黑树1.平衡二叉树二叉查找树是常用的一种二叉树,他支持快速插入,删除,查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)1. 平衡二叉查找树二叉树中任意一个节点的左右子树的高度相差不能大于1。所以完全二叉树,满二叉树都是平衡二叉树,非完全二叉树也有可能是平衡二叉树。平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。发明平衡二叉查找树这类数据结构的初衷是解决普通二叉查找树在频繁的插入,删除等动态更新的情况下,出现时间复杂度退化的问题。
2020-06-12 00:27:48
344
原创 数据结构与算法-基础算法篇-二叉树
1. 树1. 树的常用概念根节点、叶子节点、父节点、子节点、兄弟节点,还有节点的高度、深度以及层数,树的高度。2.概念解释节点:树中的每个元素称为节点父子关系:相邻两节点的连线,称为父子关系根节点:没有父节点的节点叶子节点:没有子节点的节点父节点:指向子节点的节点子节点:被父节点指向的节点兄弟节点:具有相同父节点的多个节点称为兄弟节点关系节点的高度:节点到叶子节点的最长路径所包含的边数节点的深度:根节点到节点的路径所包含的边数节点的层数:节点的深度+1(根节点的层数是1)树的高
2020-06-11 00:26:42
1562
原创 数据结构与算法-基础算法篇-哈希算法
1. 哈希算法如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗?在实际开发中,我们应该如何用哈希算法解决问题?1. 什么是哈希算法?1. 定义将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。2. 如何设计一个优秀的哈希算法?单向哈希:从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。篡改无效:对输入敏感,哪怕原始数据只修改一个Bit
2020-06-10 00:15:48
451
原创 数据结构与算法-基础算法篇-散列表(Hash Table)
1. 散列表1. 什么是散列表散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是数组支持按照下标随机访问元素的特性。需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列函数,散列函数的计算结果称为散列值。将数据存储在散列值对应的数组下标位置。散列表两个核心问题是散列函数设计和散列冲突解决。散列冲突有两种常用的解决方法,开放寻址法和链表法。散列函数设计的好坏决定了散列冲突的概率,也就决定散列表的性能。2. 如何设计散列函数?总结3点设计散列函数的基本要求:
2020-06-09 00:47:02
1129
原创 数据结构与算法-基础算法篇-跳表(skip list)
2. 跳表 (skip list)这里先提出一个问题:redis 为什么会选择用跳表来实现有序集合呢? 为什么不用红黑树呢参考:https://juejin.im/post/57fa935b0e3dd90057c50fbc1. 什么是跳表?为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。如下图所示,其中 down 表示 down 指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引
2020-06-06 23:24:25
519
原创 数据结构与算法-基础算法篇-二分查找
1. 二分查找1. 什么是二分查找?二分查找针对的是一个有序的数据集合,每次通过跟区间中间的元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间缩小为0。二、时间复杂度分析?2. 时间复杂度假设数据大小是n,每次查找后数据都会缩小为原来的一半,最坏的情况下,直到查找区间被缩小为空,才停止。所以,每次查找的数据大小是:n,n/2,n/4,…,n/(2k),…,这是一个等比数列。当n/(2k)=1时,k的值就是总共缩小的次数,也是查找的总次数。而每次缩小操作只涉及两个数据的大小比较
2020-06-06 01:20:50
1342
原创 数据结构与算法-基础算法篇-排序优化(如何实现一个通用的、高性能的排序函数?)
5. 排序优化:1. 如何选择合适的排序算法?排序算法一览表为什选择快速排序?线性排序时间复杂度很低但使用场景特殊,如果要写一个通用排序函数,不能选择线性排序。为了兼顾任意规模数据的排序,一般会首选时间复杂度为O(nlogn)的排序算法来实现排序函数。同为O(nlogn)的快排和归并排序相比,归并排序不是原地排序算法,所以最优的选择是快排。2. 如何优化快速排序?导致快排时间复杂度降为O(n)的原因是分区点选择不合理,最理想的分区点是:被分区点分开的两个分区中,数据的数量差不
2020-06-05 00:16:57
200
原创 数据结构与算法-基础算法篇-线性排序(桶排序、计数排序、基数排序)
4. 线性排序算法线性排序算法包括桶排序、计数排序、基数排序。线性排序算法的时间复杂度为O(n)。此3种排序算法都不涉及元素之间的比较操作,是非基于比较的排序算法。对排序数据的要求很苛刻,重点掌握此3种排序算法的适用场景。1. 桶排序(Bucket sort)1. 算法原理:将要排序的数据分到几个有序的桶里,每个桶里的数据再单独进行快速排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。2. 使用条件要排序的数据需要很容易就能划分成m个桶,并且桶与
2020-06-04 00:08:39
455
原创 数据结构与算法-基础算法篇-排序(归并排序、快速排序)
3. 归并排序、快速排序1. 分治思想分治,顾明思意,就是分而治之,将一个大问题分解成小的子问题来解决,小的子问题解决了,大问题也就解决了。分治与递归的区别:分治算法一般都用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。2. 归并排序算法原理先把数组从中间分成前后两部分,然后对前后两部分分别进行排序,再将排序好的两部分合并到一起,这样整个数组就有序了。这就是归并排序的核心思想。如何用递归实现归并排序呢?写递归代码的技巧就是分写得出递推公式,然后找到终止条件,最后将递推公
2020-06-03 00:02:01
246
原创 数据结构与算法-基础算法篇-排序(冒泡、插入、选择)
2. 排序1. 几种经典排序算法及其时间复杂度级别冒泡、插入、选择: O(n^2) 基于比较快排、归并 O(nlogn) 基于比较计数、基数、桶 O(n) 不基于比较2. 如何分析一个排序算法?学习排序算法的思路?明确原理、掌握实现以及分析性能。如何分析排序算法性能?从执行效率、内存消耗以及稳定性3个方面分析排序算法的性能。执行效率:从以下3个方面来衡量最好情况、最坏情况、平均情况时间复杂度时间复杂度的系数、常数、低阶:排序的数据量比较小时考虑比较次数和交换(或移
2020-06-02 00:20:38
333
原创 数据结构与算法-基础算法篇-递归
1. 递归:1. 什么是递归:递归是一种非常高效、简洁的编码技巧,一种应用非常广泛的算法,比如DFS深度优先搜索、前中后序二叉树遍历等都是使用递归。方法或函数调用自身的方式称为递归调用,调用称为递,返回称为归。基本上,所有的递归问题都可以用递推公式来表示,比如f(n) = f(n-1) + 1;f(n) = f(n-1) + f(n-2);f(n)=n*f(n-1);2. 为什么使用递归?递归的优缺点?优点:代码的表达力很强,写起来简洁。缺点:空间复杂度高、有堆栈溢出风险、存在重复
2020-06-01 23:32:49
255
原创 数据结构与算法-基础篇-队列
4. 队列1. 如何理解“队列”?队列是一种操作受限的线性表数据结构。队列最大的特点就是先进先出。最基本的操作:入队 enqueue(),放一个数据到队列尾部;出队 dequeue(),从队列头部取一个元素。2. 顺序队列和链式队列用数组实现的队列叫顺序队列,用链表实现的队列叫链式队列。队列需要两个指针:一个是 head 指针,指向队头;一个是 tail 指针,指向队尾。随着不停地进行入队、出队操作,head 和 tail 都会持续往后移动。当 tail 移动到最右边,即使数组中还有空
2020-06-01 00:03:42
232
原创 数据结构与算法-基础篇-栈
3. 栈1. 什么是栈?后进者先出,先进者后出,这就是典型的“栈”结构。从栈的操作特性来看,是一种“操作受限”的线性表,只允许在端插入和删除数据。2. 为什么需要栈?栈是一种操作受限的数据结构,其操作特性用数组和链表均可实现。但,任何数据结构都是对特定应用场景的抽象,数组和链表虽然使用起来更加灵活,但却暴露了几乎所有的操作,难免会引发错误操作的风险。所以,当某个数据集合只涉及在某端插入和删除数据,且满足后进者先出,先进者后出的操作特性时,我们应该首选栈这种数据结构。3. 数组实现(自动扩容)时间
2020-05-31 16:50:12
253
原创 数据结构与算法-基础篇-链表
2. 链表推荐一个课程:数据结构与算法之美(极客时间)什么是链表?和数组一样,链表也是一种线性表。从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。为什么使用链表?插入、删除数据效率高O(1)级别(只需更改指针指向即可),随机访问效率低O(n)级别(需要从链头至链尾进行遍历)。和数组相比,内存空间消耗更大,因为每个存储数
2020-05-31 02:21:48
308
原创 数据结构与算法-基础篇-数组
二、基础篇1. 数组1. 为什么很多编程语言的数组都是从0开始编号的?从数组存储的内存模型上来看,“下标”确切的说法就是一种“偏移”,相比从1开始编号,从0开始编号会少一次减法运算,数组作为非常基础的数组结构,通过下标随机访问元素又是非常基础的操作,效率的优化就要尽可能的做到极致。主要的原因是历史原因,C语言的设计者是从0开始计数数组下标的,之后的Java、JS等语言都进行了效仿,或者说是为了减少从C转向Java、JS等的学习成本。2. 什么是数组? 数组是一个线性数据结构,用一组连续的内
2020-05-31 01:43:49
257
原创 数据结构与算法-入门篇-复杂度分析
一、入门篇推荐一个课程:数据结构与算法之美(极客时间)1. 为什么学习数据结构和算法直接好处是能够有写出性能更优的代码。算法,是一种解决问题的思路和方法,有机会应用到生活和事业的其他方面。长期来看,大脑思考能力是个人最重要的核心竞争力,而算法是为数不多的能够有效训练大脑思考能力的途径之一。2. 学习的重点在什么地方 数据结构和算法解决的是如何更省、更快地存储和处理数据的问题,因此,我们就需要一个考量效率和资源消耗的方法,这就是复杂度分析方法。在学习数据结构和算法的过程中,要学习它的「来
2020-05-31 01:08:59
347
原创 reduce和collect 自定义返回值
reduce 方法自定义约简需要三个参数:原值累积器组合器//计算字符串流的总长度 Stream<String>int result = words.reduce(0, (total, word)->total+world.length(), (total1, total2)->total1+tatal2);collect 方法,自定义返回集合需要三个...
2019-05-12 16:12:28
646
原创 java8 Map中新增的方法介绍
相信大家都有看到,在 java8 后,大量的方法都包含两个单词,ifAbsent 和 ifPresent。absent 表示缺席,理解为当前不存在 即 ifAbsent 在map中主要意思就是 如果 get(key) == null 执行present 表示当下,理解为当下有值, 即 ifPresent 在map中主要的意思就是 如果 get(key) != null 执行这里介绍常用的一...
2019-05-07 18:25:55
2180
原创 泛型之通配符-上界下界
在泛型中,通配符 ? 是比较难理解的一部分,这里,我们介绍下 上界和下界。直接给代码,在代码中看注释比较清晰。首先我们先准备一些类:public class Pair<T> { private T first; private T second; public Pair(T first, T second) { this.first = ...
2019-05-05 18:15:06
749
原创 内部类和lamdba 引用最终变量(final)做更新操作
我们知道内部类使用外部变量时,需要的是一个不可变的量(final),但有时因为 final 限制显得并不太方便,如:我们想要在一个封闭作用域中设计一个计时器,如我们想要计算排序过程中的调用 compareTo的次数,那该怎么解决,一般我们是这么写: public static void main(String[] args) { int counter = 0; ...
2019-05-04 15:43:47
233
原创 shiro学习2-登录认证流程分析
2.3 使用 ini 完成认证2.3.1 初始化操作:创建一个maven项目,添加依赖:<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <...
2019-04-30 15:41:22
507
原创 shiro学习1-权限管理和Shiro介绍
本博客 Shiro系别 的学习,是根据 《跟我学Shiro》一书和 叩丁狼Shiro视频教学 写下来的笔记1. 什么是权限管理实现用户访问系统的控制,按照安全规则或者安全策略限制用户操作,只允许用户访问被授权的资源。权限管理包括用户身份认证和授权两部分。简称认证授权。1.1 身份认证: 判断用户是否为合法用户的处理过程,最常用的身份认证就是通过用户名和口令,看其是否与系统中存储的用...
2019-04-30 11:30:17
284
原创 JAVA8学习11-stream 流水线原理
看看大佬们写的把,我也还不是很清楚,等明白了,再补充。https://www.cnblogs.com/Dorae/p/7779246.html
2019-04-25 17:02:20
226
原创 JAVA8学习10-spliterator 接口分析
1. spliterator 分割迭代器 spliterator 是一个可分割迭代器(splitable iterator),可以和 iterator 顺序遍历迭代器一起看。jdk1.8发布后,对于并行处理的能力大大增强,Spliterator 就是为了并行遍历元素而设计的一个迭代器,jdk1.8中的集合框架中的数据结构都默认实现了 spliterator 分割迭代器主要是用来对源...
2019-04-24 10:01:57
452
原创 JAVA8学习9-Collectors 类分析
9.2 Collectors 类分析 对应 Collectors 静态工厂类来说,其实共分为两种情况:通过 CollectorImpl 内部类来实现通过 reducing 方法来实现,reducing 方法本身又是通过 CollectorImpl 来实现的其实上面自定义的会了之外,看 Collectors 类的实现,都会感到很亲切的。这里不说了。介绍几个上面没用过的方法:9.2.1...
2019-04-23 09:01:26
638
原创 JAVA8学习9-自定义收集器(Characteristics 使用说明)
9 自定义收集器 在自定义收集器前,我们再确定下 Collector 接口函数接收参数和该实现的方法。public interface Collector<T, A, R> { // A 结果类型,T 中间操作类型,R 最终返回类型,一般情况下,A=R Supplier<A> supplier(); // 源数据对象类型(中间操作对象类型) BiC...
2019-04-19 15:34:52
2073
原创 JAVA8学习8-Comparator 比较器详解
8 comparator 比较器详解 int compare(T o1, T o2) o1 比 o2 返回负数,o1 比 o2 小,返回 0 相等,返回整数 01 比 02 大。 在java8之后,comparator 是一个函数式接口,对接口进行了增强(增加了相当多的默认方法)。reversed 倒叙comparing 比较器(comparingInt 、 comparingLon...
2019-04-19 11:03:49
5429
原创 JAVA8学习7-Collector接口详解以及实现类
7 Collector 接口详解(collect 收集器、Collectors)*****************collect: 收集器Collector 作为 collect 方法的参数Collector 本身是一个接口,它是一个可变的汇聚操作,作用是将输入元素累积到一个可变的结果容器中(如ArrayList 是一个可变容器);(可选操作)它会在所有元素都处理完毕后,将累积的...
2019-04-19 09:01:22
1663
原创 JAVA8学习6-流(3)
6.8 并行流 parallelStream parallelStream 会充分利用我们计算机多线程,使程序执行更快,耗时更短。用法上与 stream 没有区别。实例代码:package cn.zxhysy.jdk8.steam;import java.util.ArrayList;import java.util.List;import java.util.UUID;impo...
2019-04-18 12:03:24
154
原创 JAVA8学习6-流(2)
6.6 Stream 流的常用操作方法介绍流的操作前,先给出个问题:1, 3, 5,7, 9,11找出该流中大于2的元素,然后将每个元素乘以2,然后忽略掉流中的前两个元素,然后再去流中的前两个元素,最后求出流中元素的总和Stream<Integer> stream = Stream.iterate(1, item -> item + 2).limit(6);int su...
2019-04-17 08:26:03
361
原创 JAVA8学习6-流(1)
6 流Collection 提供了心的 stream() 方法流不存储值,通过管道的方式获取值本质是函数式的,对流的操作会生成一个结果,不过并不会修改底层的数据源,集合可以作为流的底层数据源延迟查找,很多炉操作(过滤、映射、排序等)都可以延迟实现。6.1 流由3部分构成:源零个或者多个中间操作(惰性求值)终止操作(及早求值)6.2 流操作的分类:惰性求值及早求值...
2019-04-16 15:38:00
141
原创 springboot&微信小程序实战_项目展示
这是我自己通过网上查询相关资料,编写的小程序商城,这里缺少快递信息、支付功能,其他的基本上都简简单单的设计到一些。本项目是基于springboot2.0框架 与微信小程序技术 开发的商城系统,只有前台展示没有后台管理,可能有时间的话,就会把后台管理也开发出来,完善一下小程序。这里就给大家看下我的作品,也许你会觉得很眼熟,没错,我是照着别人的界面敲出来的。大致上就是这样了需要代码的话,请到g...
2019-04-15 15:56:11
3688
原创 JAVA8学习5-接口默认方法(default)
5 接口默认方法 在 java8 之后,我们可以在接口中写默认实现方法。使用关键字 default 定义默认接口实现 现在对接口默认方法的几种情况进行说明。5.1 一个类实现一个默认实现方法的接口 首先我们定义一个接口package cn.zxhysy.jdk8.dufaultmethod;public interface MyInterface { default ...
2019-04-15 15:24:11
3223
原创 JAVA8学习4-方法引用(Method reference)
4. 方法引用(Method reference)方法引用其实就是 Lambda 表达式的语法糖 方法引用本质上就是一个【函数指针】function pointer注意: 方法调用和方法引用没有半毛钱关系,如果学过 JavaScript 就类似于使用函数变量地址值的传递。方法引用分4类: 我们先建个类,用于对象排序。package cn.zxhysy.jdk8.methodref...
2019-04-13 17:36:25
595
原创 JAVA8学习3-Optional类
3 Optional 类 java.util 包下解决空指针异常的类, java8之前,我们通过手动判断对否了空,但往往我们都会忘记判断,导致 NPE。Optional 是一个 value-base Class,最好不要在上面操作比较如 equals。不建议用做参数类型或成员变量,因为 optional 没有序列化。optional 通常作为方法的返回值。 Optional 本质就是一个容...
2019-04-13 15:06:20
224
原创 JAVA8学习2-函数式接口
2 函数式接口2.1 主要信息:Note that instances of functional interfaces can be created with lambda expressions, method references, or constructor references.(重点)an interface declares an abstract method overr...
2019-04-13 15:03:58
278
原创 JAVA8学习1-Lambda 表达式
JAVA8学习1.Lambda 表达式在java8之前,我们无法将行数作为参数传递给一个方法,也无法声明返回一个函数的方法在JavaScript中,函数参数是一个函数,返回值是另一个函数的情况非常常见;JavaScript是一门非常典型的函数式语言;JavaScript回调函数写法a.execute(callback(event){ event...... })...
2019-04-13 15:01:43
306
原创 JavaScript 编程精解-学习1
JavaScript 编程精解-学习1最近,时间比较充足,看了下 JavaScript 编程精解这本书,感觉还不错,就做了下笔记。第一章 值、类型和运算符1.1 值 javaScript 中包含6中基本数据类型:数字(number)、字符串(string)、布尔值(boolean)、对象(Object)、函数(function)和未定义类型(undefined)。1.2 数字 ja...
2019-04-13 12:00:30
243
原创 springboot&微信小程序实战_开发说明
springboot&微信小程序实战_开发说明本项目采用的是springboot2.0与微信小程序实现前后端分离。前台使用微信小程序与es6相关语法后台使用 mysql数据库、druid连接池、mybatis ORM框架、redis 缓存、Nginx-fastDFS 文件服务器、fastjson 序列化工具、pagehelper和通用mapper 插件,以及 httpClient H...
2019-04-04 11:24:50
2302
我现在已经最短了两点之间的最短距离矩阵的强连通图,我想求最短回路径,从1出发最后会1
2017-09-16
TA创建的收藏夹 TA关注的收藏夹
TA关注的人