数据结构&算法
文章平均质量分 88
数据结构和算法,带的账永远是要还的
it_lihongmin
不要觉得自己怎么样,现实就是比你厉害的人,比你更努力!
当才华撑不起自己野心的时候,老老实实地踏实学习吧!
展开
-
二分查找算法
package lihongmin;public class BinarySearch { /** * 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难(一般直接插入头或尾部即可,但是现在需要按顺序进行插入)。 * 因此,折半查找方法适用于不经常变动而查找频繁的有序列表。 * 二分查找一般有两种方式,递归或者循环中执行原创 2017-06-29 14:14:45 · 295 阅读 · 0 评论 -
数据结构 - 索引怎么选择合适的数据结构?
什么是索引? 类比我们要查询一本很厚的书时,怎么快速定位到需要的部分(或者快速缩小查询范围),索引就类似于书中的目录。业务的抽象落地就是数据是怎么存储【数据结构】,怎么根据存储的数据结构获取想要的数据【算法】。可能(反正我是)刚开始理解索引的时候是从数据库索引开始的,其实只要像Mysql数据库内部那样可以通过B+树快速定位、查询想要的数据就是索引。Redis中不论使用哪种数据节点,都需要使用key快速定位,全局的索引就是散列表的数据结构。 如果我们想自己设计一个业务系统的索引时?怎么...原创 2021-03-11 21:03:37 · 1184 阅读 · 0 评论 -
数据结构 - B+树(B树)
目录1、B+树2、B+树 VS B树3、Mysql为什么选择B+树? 理解B+树的数据结构一定在理解了树、平衡二叉搜索树的基础上。再梳理一下,平衡二叉树是为了让树本身更加的”丰满“,近似于满二叉树(或者完全二叉树),降低树的层高【查询效率与树的层高有关】,防止极端情况树退化成时间复杂度为O(N)的链表。二叉查找树是当每个节点做一次判断,就可以选择左子或右子树进行查询,每次讲数据查询范围缩小为原来的一半。 基于平衡二叉查找树,整个树的读写的时间复杂度近似O(logN),效率是非常高的,之..原创 2021-03-11 11:46:13 · 2750 阅读 · 0 评论 -
数据结构 - 图(邻接矩阵、邻接表)
目录1、图的概念2、图的表示方式1)、邻接矩阵2)、邻接表 图是除了树之外的另一大类非线性表数据结构,应对到现实生活中有大量的应用,比如微博、微信、QQ等怎么表示其好友关系,关注、被关注(粉丝),亲密度等;地图出行,怎么查询到一个地方的最近距离,这些问题抽象算法都依赖底层的数据结构图。现在除了非关系型数据库、关系型数据库,还有图数据库抽象存储更复杂的现实模型。上面都没有图来的直接,先上图吧.1、图的概念 树种的节点类比到图中叫顶点(Vertex),如上图中的A;顶...原创 2021-03-09 22:20:33 · 4127 阅读 · 3 评论 -
数据结构 - 堆的应用场景
目录1、优先级队列的使用场景 1)、定时任务轮训问题 2)、合并有序小文件2、求Top K值问题【使用一个堆解决】3、求中位数、百分位数【使用一个大顶堆一个小顶堆解决】4、大数据量日志统计搜索排行榜【散列表+堆】 堆作为数据结构其特殊的结构完全二叉树,作为数据特点堆顶元素大于等于(或者小于等于)索引叶子节点。前面篇博客分析了,堆排序也算是堆的一个应用场景,并且分析了堆排序的第一步建堆,允许在时间复杂度O(N)内就获取到了最大或者最小的元素。Java中的Prior...原创 2021-03-08 17:35:57 · 3745 阅读 · 0 评论 -
排序算法 - 堆排序
堆排序也是时间复杂度为O(N*logN)的排序算法,排序包括堆化和排序两个过程。前一篇博客我们分析了堆的两个重要操作,也分析了Java PriorityQueue的源码。新增元素时会进行从下往上的堆化过程,而移除堆顶元素时将叶子节点的最后一个元素顶替堆顶元素,然后执行从上下到的堆化操作。而堆排序中的建堆操作就是将元素挨个添加到堆中,即从上到下的堆化操作。前面分析了同样的数据,满足堆的条件可以有多种情况,可以认为排好序后的是堆的唯一一种情况。如下图(中间的情况就是排序好的堆): 堆...原创 2021-03-07 23:16:28 · 385 阅读 · 0 评论 -
数据结构 - 堆(PriorityQueue源码分析)
目录1、堆的特点2、堆的操作3、Java中的堆(PriorityQueue、PriorityBlockingQueue) 堆的定义: 1、堆是一个完全二叉树 2、堆的每个节点都大于等于(或者小于等于)左右子节点,即大于等于左子树和右子树。节点大于等于所有子节点叫做大顶堆,小于等于所有子节点叫做小顶堆。1、堆的特点 首先堆是一个完全二叉树,再回顾一下完全二叉树的特点,下面的操作都会基于这些特点。堆一般也是使用数组进行表示,我们一般会将数组下标为0的位置空着,...原创 2021-03-07 21:06:59 · 483 阅读 · 2 评论 -
数据结构 - 二叉树的前序、中序、后续遍历
二叉树的前序、中序、后续遍历是面试的高频,需要完全的理解,并且多加练习。前序遍历就是先打印自己,再递归左指针,再递归右指针;中序遍历就是先递归左指针,再打印自己,最后递归右指针;后序遍历先递归左指针,再递归右指针,最后打印自己。 无论是前序遍历、中序遍历、还是后序遍历都需要将所有的节点全部访问一遍,所以时间复杂度都的 O(N)。 整体过程如下图: 代码实现如下:/** * 二叉树的遍历 * A * / \ * ...原创 2021-03-06 23:22:32 · 965 阅读 · 3 评论 -
数据结构 - 树、常用树分类
目录1、树的一些基本概念2、常用树的分类1)、完全二叉树2)、满二叉树3)、堆(大顶堆、小顶堆)4)、二叉搜索树5)、平衡二叉树6)、平衡二叉搜索树7)、AVL树(自平衡二叉搜索树)8)、红黑树 数组和链表都是常用的数据结构,并且前面博客分析了队列、栈等都可以基于数组和链表实现,树也不例外。大部分情况下树都会基于链表进行实现称为链式存储法,只有在特点的情况下才会基于数组进行实现称为顺序存储法。那么什么是树呢?什么情况下树会基于顺序存储法进行存储?一种数据结构...原创 2021-03-06 23:00:07 · 3848 阅读 · 0 评论 -
数据结构 - 跳表(ConcurrentSkipListMap的数据结构)
目录跳表的数据结构和复杂度跳表的索引ConcurrentSkipListMap数据结构 前面分析过二分查找的时间复杂度是O(logN),但是只能作用于数组的数据结构之上,并且有序。那么基于链表是否可以实现添加、删除、查询的时间复杂度都是O(logN)呢?跳表。跳表的思想就是链表每【几个】数据就往上抽取一层索引,如果链表本身比较长那么可以再在一级索引的基础上再隔几个索引就往上抽取一层索引。跳表的数据结构和复杂度 跳表的数据结构如上图,索引中有两个指针,向右指针...原创 2021-03-05 15:33:31 · 908 阅读 · 4 评论 -
算法 - 二分查找(可能我们理解错了应用场景)
目录二分查找的使用场景二分查找"近似"二分查找1、查找第一个X值出现的位置2、查询最后一个X值出现的位置3、查询第一个大于等于X值的位置4、查询最后一个小于等于X值的位置 二分查询也叫折半查找,即在一个有序的数组中,利用数组随机下标访问的时间复杂度是O(1)的特点,每轮查找可以折半计算数组中间的下标位置,每次将查找的范围缩小为原来的一半,这个比较好理解。只是对于二分查找的前提条件比较严苛,才能达到查询的时间复杂度为O(logN)。而红黑树、B+树、跳表都是可以执行快速读...原创 2021-03-04 18:37:05 · 1101 阅读 · 2 评论 -
排序算法 - Collections.sort涉及的排序算法源码分析
前面涉及到了那么多时间复杂度分类的排序算法,冒泡排序、插入排序、选择排序;归并排序、快速排序; 桶排序、计数排序、基数排序,可能常用的排序可能还有堆排序等。了解了每种排序算法的最好最坏平均时间复杂度,空间复杂度(是否原地排序),是否稳定排序等,这些可以理解为都是理论,当我们真正落地使用时会使用哪些排序,现在分析一下Java中涉及的排序算法,进行源码分析。...原创 2021-03-03 17:19:12 · 1370 阅读 · 3 评论 -
排序算法 - 桶排序、计数排序、基数排序(线性排序算法)
目录1、桶排序(Bucket Sort)2、计数排序(Counting Sort)3、基数排序(Radix Sort) 醒目一点: 桶排序、计数排序、基数排序可以看作是线性排序算法,从时间复杂度看远高于归并、快排等,但是这些排序算法对数据的要求非常高,并不能作为常规的排序算法。即特别是类似开发一个排序工具类,需要适应所以特征的数据的排序,显然是不行的。 1、桶排序(Bucket Sort)2、计数排序(Counting Sort)3、基...原创 2021-03-03 13:45:54 · 415 阅读 · 0 评论 -
排序算法 - 时间复杂度O(N*logN)的归并、快速排序算法
归并排序、快速排序都使用了分治的思想,时间复杂度都是O(N*logN)。由于其时间复杂度低,所以被广泛的应用,比如Java Collection.sort; Mysql数据库中的排序;Tim排序等。原创 2021-03-03 00:47:39 · 1288 阅读 · 0 评论 -
排序算法 - 二分插入排序、希尔排序(插入排序的优化)
目录1、二分插入排序2、希尔排序 上一篇博客分析了时间复杂度为O(N²)的三种排序方式,并且基于稳定特性的插入排序和冒泡排序做了性能对比,当数据量级比较小的使用经常会选择插入排序。然而插入排序本身还可以进行优化,让其性能进一步提升,二分插入排序和希尔排序都是在普通插入排序的基础上进一步优化。1、二分插入排序 插入排序本身就是往后遍历,每次轮训都会把前N个元素排好序,然后再将N+1个元素插入已经排好序的“子数组”里面。直接插入排序判断往哪个下标位置插入时,是遍历了整个子数组,在...原创 2021-03-02 15:30:09 · 1151 阅读 · 0 评论 -
排序算法 - 时间复杂度O(N²)的冒泡、插入、选择排序
目录1、冒泡排序2、插入排序3、选择排序4、为什么很多排序工具使用插入排序而非冒泡排序? 排序是算法中比较常用的一大块,很多的场景都需要进行排序操作,而排序选择不当可能造成千、万被的性能差距。所以按照时间复杂度将排序算法进行分类,只是排序时间复杂度只是衡量数据规模趋势与耗时的关系,如果只是基于时间复杂度进行考虑那么时间复杂度高的基本就不会使用了。大O时间复杂度分析忽略了常数、系数、低阶等,然而在数据量比较小的情况下,可能常数等的值比较大,耗时完全超过了递增的趋势值,所以一个优秀的排..原创 2021-03-02 10:29:15 · 1010 阅读 · 0 评论 -
数据结构 - 散列表(Hash表)
散列表的时间复杂度和由来 在开始散列表数据结构之前先熟悉一下数组和链表的时间复杂度,如下。那么有没有一种数据结构可以满足新增和修改的时间复杂度都小于O(n)呢?那就是散列表,并且散列表在Java中随处可见;K-V数据库redis中的全局key查询value也使用了散列表的思想。 散列表也叫Hash表,新增和修改的时间复杂度近似O(1)。其思想利用了数组根据下标进行查询时,时间复杂度为 O(1),具体根据下标计算对应内存地址的过程可以参考。其数据结构特点就是K-...原创 2021-03-01 23:26:54 · 545 阅读 · 0 评论 -
数据结构 - 队列
队列也是线性表的一种,其特点就是先进先出(FIFO),即从线性表的一端进从另一端出,所以也是一种操作受限的线性表。与 栈 的数据结构一样,队列可以基于数组进行实现,称为顺序队列,也可以基于链表实现,称为链式队列。先进先出特点鲜明到就是在作排队等待,所以经常用于各种资源受限的情况下排队等待(比如线程池)。个人理解受限的数据结构和方法,限制本身也觉得了其特色的使用场景,根据队列的不同形态有 队列、双端队列和环形队列。按照实现分为:顺序队列、链式队列按照结构分为:普通队列、双端队列、环形队列...原创 2021-02-26 15:03:32 · 307 阅读 · 1 评论 -
数据结构 - 栈
1、栈 栈的数据特点是先进后出(FILO),数据特定非常明显当然解决的问题特定也非常明显,一般需要提供 peek(查看)、push(压栈)、pop(出栈)方法。可以认为栈就是受限的线性表,栈可以基于数组实现称为顺序栈,也可以基于链表实现称为链式栈。 2、队列...原创 2021-02-25 16:02:26 · 395 阅读 · 2 评论 -
数据结构 - 数组、链表
目录1、数组2、链表 最简单是数据结构就是线性表,包括数组、链表、栈和队列。线性表就是数据像线一样连城一条线,线上的每个节点都只有前后两个方向。其他的就是非线性结构,包括树(一个节点可以链接到多个节点)、图(节点可能成环),或者散列表、跳表等。用一个对比图展示:1、数组 数组的特点: 1)、属于线性表 2)、数组创建时会申请一片连续的内存空间,并且存储每个位置上的数据类型相同(即创建完成后,内存空间已定,不能再扩展)。 ...原创 2021-02-24 23:36:52 · 1184 阅读 · 0 评论 -
大O复杂度表示法
目录复杂度和大O表示法时间复杂度1、只关注代码中执行次数最多的部分2、加法法则:整体时间复杂度等于量级最大的一段的复杂度3、乘法法则:嵌套循环的复杂度等于嵌套内外复杂度的乘积空间复杂度复杂度分析方法(最好、最坏、平均、均摊 时间复杂度)复杂度和大O表示法 数据结构和算法本身解决的问题就是,怎么让程序在执行尽量快的情况下,尽量的节省占用的空间,也就是研究程序执行的时间【快】复杂度、空间【省】复杂度。很多时候当我们写程序的时候,在特定的场景下已知数据规模的范围,但是更多..原创 2021-02-23 16:21:35 · 528 阅读 · 0 评论 -
常用数据结构和算法总览
对于数据结构和算法、计算机操作系统等底层的知识,首先想说一句话,代的账迟早是要还的【除非自己不想往更高的方向走】。对于为什么要学习数据结构和算法,自己的觉得还是走了很多的弯路。怎样建立自己的知识体系【自己】,现在对于工作年限的增加,行业对于人才需求是什么【环境】,总不是随着年限的增加仅仅是写不完的项目经验,永远停留在基础的重复的劳动(无脑)上。如果用武功来形容整个知识体系的话,上层的体现就是招式并且招式变化特别快【如果mq,前几年流行rabbitmq现在流行kafka并且层出不穷;比如数据库持...原创 2021-02-23 10:51:13 · 419 阅读 · 0 评论