flydean程序那些事
懂程序更懂你!微信公众号:程序那些事 个人主页:www.flydean.com 最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在程序那些事!
展开
-
看动画学算法系列之:后缀数组suffix array
在之前的文章中,我们讲到了后缀树和它的一些特性。后缀树主要用来做模式匹配中,比如全文索引,寻找公共前缀等,非常的有用。同样的后缀数组和后缀树的作用非常类似,和后缀树相比,后缀数组更简单并且更加节省空间,今天我们将会详细介绍下后缀数组的特性和使用。原创 2021-04-16 10:59:56 · 4674 阅读 · 1 评论 -
看动画学算法系列之:后缀树suffix tree
模式匹配是一个在工作中经常会用到的场景,比如说给定一个字符串数组txt[0..n-1]和要匹配的模式pat[0..m-1],我们希望找出所有在txt中能够匹配模式字符串的次数。这就叫做模式匹配。要想完成字符串匹配的任务,我们其实有两种方式,第一种方式就是使用各种模式匹配的算法,比如KMP,Rabin Karp,Finite Automata based和Boyer Moore。 这些匹配算法最好的时间复杂度是O(n),其中n是字符串的长度 。还有一种方式是对要查询的字符串数组进行预处理,处理过后再进原创 2020-12-08 17:48:29 · 14643 阅读 · 2 评论 -
快乐学算法之:三分查找树ternary search tree
之前我们介绍了tire字典树,tire字典树的优点就是插入和查找比较快速,但是它的缺点就是占用的空间比较大。假如我们要存放一个英文字典(全都是小写字母),那么每个节点将会有26个子节点,用来保存所有可能字符。trie树既然这么占用空间,有没有比较好的办法来减少空间的占用或者提高空间的使用率呢?有的,这就是今天我们需要讲到的ternary search tree,中文叫做三分查找树。原创 2020-11-18 10:56:23 · 18139 阅读 · 2 评论 -
快乐学算法之:字典树Trie
字典树的英文名叫做Trie,取自retrieval,也就是检索的意思。它是一种特殊的树状结构,可以进行快速的字符插入和字符串搜索,特别适用于文本搜索和词频统计等应用方面。本文将会详细介绍字典树Trie的特性。原创 2020-11-09 09:58:22 · 8765 阅读 · 1 评论 -
看动画学算法之:递归和递归树
在之前我们介绍的很多数据结构和算法都用到了递归,递归非常容易理解,用途也很广泛,但是有一个缺点就是需要保存栈的状态,如果递归次数太多会造成栈溢出的问题。本文将会讲解常见的栈的应用,并使用递归树形象的展示其递归的过程。原创 2020-10-09 09:22:00 · 8511 阅读 · 4 评论 -
看动画学算法之:环检测算法-弗洛伊德的兔子和乌龟
环检测应该是一个非常常见的算法问题,怎么判断是否有环的问题呢?一个很简单的做法就是用HashSet来保存要遍历的数据,如果出现了重复就知道这个链表是有环的。但是这个方法需要保存遍历过的所有的元素,所以其空间复杂度是o(n)。有没有什么方法可以不用保存之前的元素也能够判断是否有环呢?来看看弗洛伊德的兔子和乌龟算法吧。原创 2020-09-23 10:01:52 · 20200 阅读 · 5 评论 -
看动画学算法之:树状数组-BIT-Fenwick Tree
Fenwick Tree也叫做树状数组,或者Binary Indexed Tree(BIT),是一个查询和修改复杂度都为log(n)的数据结构。主要给定区间,求最值,或者求和。接下来我们来具体讲解一下Fenwick Tree的概念。原创 2020-09-14 09:12:56 · 8743 阅读 · 6 评论 -
看动画学算法之:线段树-segmentTree
文章目录简介最小线段树线段树的构建线段树的搜索线段树的更新线段树的复杂度简介什么是线段树呢?线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。线段树的每个节点都表示一个区间,而根据线段树的不同特征,线段树的节点值可以表示这个区间里的最小值,最大值或者sum值等等。最小线段树下面我们以最小线段树为例来说明一下线段树的特性:如果原始数据是一个数组,我们也以数组来表示线段树。假设生成的线段树的起点index=1,并且对线段树中的每个非叶子节原创 2020-09-09 08:42:02 · 8319 阅读 · 5 评论 -
看动画学算法之:二叉堆Binary Heap
我们坐在高高的谷堆旁边,听妈妈讲那过去的事情。听到了堆,我就想起了这首歌。没错,今天我们要介绍一个堆,这个堆叫做二叉堆。二叉树我们之前讲过了,就是每个节点最多有两个子节点的树叫做二叉树。而二叉堆Binary Heap是一种特殊的二叉树。原创 2020-09-01 11:11:44 · 8743 阅读 · 4 评论 -
看动画学算法之:平衡二叉搜索树AVL Tree
平衡二叉搜索树是一种特殊的二叉搜索树。为什么会有平衡二叉搜索树呢?考虑一下二叉搜索树的特殊情况,如果一个二叉搜索树所有的节点都是右节点,那么这个二叉搜索树将会退化成为链表。从而导致搜索的时间复杂度变为O(n),其中n是二叉搜索树的节点个数。而平衡二叉搜索树正是为了解决这个问题而产生的,它通过限制树的高度,从而将时间复杂度降低为O(logn)。原创 2020-08-24 10:14:55 · 8370 阅读 · 6 评论 -
看动画学算法之:二叉搜索树BST
文章目录简介BST的基本性质BST的构建BST的搜索BST的插入BST的删除看动画学算法之:二叉搜索树BST简介树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的非线性的数据结构。树是由很多个节点组成的,每个节点可以指向很多个节点。如果一个树中的每个节点都只有0,1,2个子节点的话,这颗树就被称为二叉树,如果我们对二叉树进行一定的排序。比如,对于二叉树中的每个节点,如果左子树节点的元素都小于根节点,而右子树的节点的元素都大于根节点,那么这样的树被叫做二叉搜索树(Binary原创 2020-08-13 19:29:19 · 8475 阅读 · 6 评论 -
看动画学算法之:hashtable
文章目录简介散列表的关键概念数组和散列表数组的问题hash的问题线性探测二次探测双倍散列分离链接rehash简介java中和hash相关并且常用的有两个类hashTable和hashMap,两个类的底层存储都是数组,这个数组不是普通的数组,而是被称为散列表的东西。散列表是一种将键映射到值的数据结构。它用哈希函数来将键映射到小范围的指数(一般为[0…哈希表大小-1])。同时需要提供冲突和对冲突的解决方案。今天我们来学习一下散列表的特性和作用。文末有代码地址,欢迎下载。散列表的关键概念散列表中比较原创 2020-08-04 13:50:31 · 20495 阅读 · 3 评论 -
看动画学算法之:双向队列dequeue
文章目录简介双向队列的实现双向队列的数组实现双向队列的动态数组实现双向队列的链表实现双向链表的时间复杂度简介dequeue指的是双向队列,可以分别从队列的头部插入和获取数据,也可以从队列的尾部插入和获取数据。本文将会介绍一下怎么创建dequeue和dequeue的一些基本操作。双向队列的实现和普通队列项目,双向队列可以分别在头部和尾部进行插入和删除工作,所以一个dequeue需要实现这4个方法:insertFront(): 从dequeue头部插入数据insertLast(): 从deque原创 2020-07-30 15:04:15 · 21154 阅读 · 3 评论 -
看动画学算法之:队列queue
文章目录简介队列的实现队列的数组实现队列的动态数组实现队列的链表实现队列的时间复杂度简介队列Queue是一个非常常见的数据结构,所谓队列就是先进先出的序列结构。想象一下我们日常的排队买票,只能向队尾插入数据,然后从队头取数据。在大型项目中常用的消息中间件就是一个队列的非常好的实现。队列的实现一个队列需要一个enQueue入队列操作和一个DeQueue操作,当然还可以有一些辅助操作,比如isEmpty判断队列是否为空,isFull判断队列是否满员等等。为了实现在队列头和队列尾进行方便的操作,我们原创 2020-07-29 14:11:30 · 20862 阅读 · 3 评论 -
看动画学算法之:栈stack
文章目录简介栈的构成栈的实现使用数组来实现栈使用动态数组来实现栈使用链表来实现简介栈应该是一种非常简单并且非常有用的数据结构了。栈的特点就是先进后出FILO或者后进先出LIFO。实际上很多虚拟机的结构都是栈。因为栈在实现函数调用中非常的有效。今天我们一起来看学习一下栈的结构和用法。栈的构成栈一种有序的线性表,只能在一端进行插入或者删除操作。这一端就叫做top端。定义一个栈,我们需要实现两种功能,一种是push也就是入栈,一种是pop也就是出栈。当然我们也可以定义一些其他的辅助功能,比如top原创 2020-07-28 14:05:04 · 21163 阅读 · 10 评论 -
看动画学算法之:doublyLinkedList
文章目录简介doublyLinkedList的构建doublyLinkedList的操作头部插入尾部插入插入给定的位置删除指定位置的节点简介今天我们来学习一下复杂一点的LinkedList:doublyLinkedList。和LinkedList相比,doublyLinkedList中的节点除了next指向下一个节点之外,还有一个prev之前的一个节点。所以被称为doublyLinkedList。 doublyLinkedList是一个双向链表,我们可以向前或者向后遍历list。今天我们来学习一下d原创 2020-07-27 13:49:38 · 20481 阅读 · 1 评论 -
看动画学算法之:linkedList
文章目录简介linkedList的构建linkedList的操作头部插入尾部插入中间插入删除节点简介linkedList应该是一种非常非常简单的数据结构了。节点一个一个的连接起来,就成了linkedList。今天我们使用动画的方法一起来看看linkedList是怎么插入和删除的。linkedList的构建linkedList是由一个一个的节点构成的。而每个节点只需要存储要保存的数据和下一个节点的引用即可。linkedList本身需要一个head节点,所以我们的linkedList可以这样构建:原创 2020-07-26 11:47:16 · 21000 阅读 · 2 评论 -
看动画学算法之:排序-基数排序
之前的文章我们讲了count排序,但是count排序有个限制,因为count数组是有限的,如果数组中的元素范围过大,使用count排序是不现实的,其时间复杂度会膨胀。而解决大范围的元素排序的办法就是基数排序。原创 2020-07-25 13:07:35 · 20341 阅读 · 2 评论 -
看动画学算法之:排序-count排序
今天我们介绍一种不需要作比较就能排序的算法:count排序。count排序是一种空间换时间的算法,我们借助一个外部的count数组来统计各个元素出现的次数,从而最终完成排序。原创 2020-07-24 09:30:49 · 21226 阅读 · 2 评论 -
看动画学算法之:排序-快速排序
快速排序也采用的是分而制之的思想。那么快速排序和归并排序的区别在什么地方呢?归并排序是将所有的元素拆分成一个个排好序的数组,然后将这些数组再进行合并。而快速排序虽然也是拆分,但是拆分之后的操作是从数组中选出一个中间节点,然后将数组分成两部分。左边的部分小于中间节点,右边的部分大于中间节点。然后在分别处理左边的数组合右边的数组。原创 2020-07-22 18:31:38 · 22490 阅读 · 4 评论 -
看动画学算法之:排序-归并排序
文章目录简介归并排序的例子归并排序算法思想归并排序的java实现归并排序的时间复杂度简介归并排序简称Merge sort是一种递归思想的排序算法。这个算法的思路就是将要排序的数组分成很多小的部分,直到这些小的部分都是已排序的数组为止(只有一个元素的数组)。然后将这些排序过的数组两两合并起来,组成一个更大一点的数组。接着将这些大一点的合并过的数组再继续合并,直到排序完整个数组为止。归并排序的例子假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行归并排序呢?先看一个动画原创 2020-07-19 10:20:58 · 14839 阅读 · 3 评论 -
看动画学算法之:排序-选择排序
文章目录简介选择排序的例子选择排序的java代码实现选择排序的第二种java实现选择排序的时间复杂度简介选择排序就是从数组中选择出来最大或者最小的元素,然后将其和队首或者队尾的元素进行交互。因为首先做的是一个选择的过程,所以叫做选择排序。选择排序的例子假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行选择排序呢?先看一个动画:选择排序的原理如下:8个数字,我们需要进行7轮排序。以第一轮为例,我们对对所有的数据进行比较,找到其中最小的那个10,然后把10放在数原创 2020-07-18 20:04:25 · 12004 阅读 · 1 评论 -
看动画学算法之:排序-插入排序
文章目录简介插入排序的例子插入排序的java程序插入排序的时间复杂度简介插入排序就是将要排序的元素插入到已经排序的数组中,从而形成一个新的排好序的数组。这个算法就叫做插入排序。插入排序的例子同样的,假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行插入排序呢?先看一个插入排序的动画,对它有个直观的了解:我们来分析一下排序的流程。八个数字,我们分为7轮。第一轮,假设29是已经排好序的数组,从第二个元素开始,向排好序的数组插入新的元素。 也就是说向数组[29]插原创 2020-07-13 09:12:54 · 11865 阅读 · 2 评论 -
看动画学算法之:排序-冒泡排序
排序可能是所有的算法中最最基础和最最常用的了。排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序。排序算法有很多种,每个都有其自身的优点和局限性。今天我们来学习最最简单的冒泡排序算法。原创 2020-07-12 08:29:36 · 12247 阅读 · 3 评论