算法与数据结构
需要解释吗?
jeff.sheng
一只没有梦想的咸鱼
展开
-
拓扑排序来输出图的依赖关系
拓扑排序,解决局部依赖输出顺序问题。原创 2019-10-22 15:53:59 · 2358 阅读 · 0 评论 -
Edit Distance编辑距离与动态规划
编辑距离是指将一个字符串转化为另外一个字符串,需要的最少的编辑操作次数原创 2019-10-21 22:01:24 · 728 阅读 · 0 评论 -
动态规划的理论分析
动态规划适合解决什么问题?动态规划是一个很成熟的思想,很多人都对这些思想做了总结,可以用一句话概括就是:一个模型三个特征。原创 2019-10-17 20:43:54 · 704 阅读 · 3 评论 -
初识动态规划-Dynamic Program
利用0-1背包问题简单理解下动态规划的思路原创 2019-10-16 20:49:24 · 841 阅读 · 0 评论 -
递归树-分析时间复杂度
递归的思想就是把一个大问题分解为小问题,再把小问题继续分解下去,一直到无法再分为止。所以递归的核心思路就是找到递归公式和终止条件。那么什么是递归树?简单来说,这颗树是由递归的子问题组成树,树的节点就是递归的子问题。比如斐波那契数列的递归树就是这个样子:一个节点的求解可以分解为两个左右子节点的求解过程,就这样递归下去形成了斐波那契数列的递归树。归并排序的时间复杂度分析归并排序就是...原创 2019-09-03 10:52:01 · 2272 阅读 · 0 评论 -
二叉搜索树-BSTree
二叉搜索树,即Binary Search Tree.二叉搜索树又叫二叉查找树,或者二叉排序树。二叉搜索树要求,对于树中每一个节点,都要求左子树每个节点的值都小于当前节点值,右子树的每个节点值都大于当前节点的值。二叉查找树的查找操作我们从根节点开始查找,如果当前节点等于我们要查找的数据,那就返回。如果查找的数据比根节点的数据小,那就从左子树中递归查找。如果要查找的数据比根节点的...原创 2019-09-02 17:44:05 · 376 阅读 · 0 评论 -
树与二叉树
树的概念为了解释树的概念,我们用一幅图来说明:父节点:A节点就是B节点的父节点。子节点:B节点就是A节点的子节点。兄弟节点:B、C、D三个节点的父节点是同一个节点A,所以它们之间就是互为兄弟节点。根节点:没有父节点的节点,比如E就是根节点。叶子节点:又叫叶节点,没有子节点的节点就是叶子节点或叶节点,比如G、H、I、J、K、L都是叶子节点。节点高度:就是节点到叶...原创 2019-08-30 16:19:06 · 244 阅读 · 0 评论 -
Hash算法及其应用
Hash算法其实hash和散列表示的一个意思,所以hash表就是散列表,hash算法就是散列算法,hash函数就是散列函数。这说的hash算法,什么是hash算法?有一句很easy的总结:将任意长度的二进制串映射为固定长度的二进制串,这个映射规则就是hash算法。通过映射之后得到固定长度的二进制串值就是hash值。工业界的hash算法有很多比如md5、sha等。ps:hash算法无...原创 2019-08-30 14:43:40 · 517 阅读 · 0 评论 -
散列表-LRU缓存淘汰算法
LRU缓存淘汰算法,也就是最近最少使用缓存淘汰策略实现的算法。这里我们使用散列表和链表实现提高操作的时间复杂中度,达到O(1)原创 2019-08-30 14:07:32 · 349 阅读 · 0 评论 -
一趟开往散列表的旅程
散列表的英文名字HashTable,其实散列表就是哈希表、hash表,我们平时就是这么叫的。原创 2019-08-29 17:55:53 · 306 阅读 · 1 评论 -
查找算法-跳跃表(SkipList)入门及复杂度分析
什么是跳表对于单链表这种数据结构,如果我们想查找一个结点需要从头到尾遍历所有结点,时间复杂度为O(n)效率非常低效。如果我们想办法在单链表的一些结点上加索引呢?如图图中原始链表每隔2个节点就抽出一个结点作为索引,抽出的这一层我们称之为“索引层”,第一层索引层我们称之为第一层索引。就比如我们想此时要查找10这个节点,我们需要遍历6个节点就可以找到。如果再抽取一个索引层...原创 2019-08-28 17:37:57 · 3632 阅读 · 0 评论 -
查找算法-二分查找的几种变体
唐纳德·克努特(Donald E.Knuth)在《计算机程序设计艺术》第三卷中说:“尽管第一个二分查找算法出现于1946年,然而第一个完全正确的二分查找算法直到1962年才出现。”原创 2019-08-28 11:17:57 · 307 阅读 · 1 评论 -
查找算法-有序数组的二分查找
二分查找的思想二分查找,在一个数组有序(比如从小到大)的情况下,如果想查找某个数值是否存在于数组中,这个时候就可以使用二分查找了。具体做法就是找出数组的中间下标的元素,然后拿查找值与其比较,如果查找值小于中间元素值,则缩小查找范围在小于中间元素的范围查找;否则,在大于中间元素值得范围查找。一直到找到查找值,或者区间缩小为0.图解:代码可以使用循环来实现,也可以使用递归。...原创 2019-08-27 16:37:26 · 3033 阅读 · 0 评论 -
堆及堆排序
本文主要整理关于堆及堆排序的相关内容。原创 2019-09-29 16:29:01 · 342 阅读 · 0 评论 -
堆的应用
本文主要整理关于堆的应用场景:优先级队列、TopK问题、利用堆求中位数原创 2019-09-29 23:22:56 · 486 阅读 · 0 评论 -
回溯算法
递归算法切记不要使用debug的方式层层深入进去,这样会把自己绕进去,而且问题也得不到解决。还是要理解递归的思想,从思想的角度去理解代码。原创 2019-10-04 22:26:15 · 400 阅读 · 0 评论 -
分治算法
分治算法的核心思想 分治算法的核心思想就是四个字,分而治之,也就是将原来的问题划分成n个规模较小,并且结构与原问题相似的子问题,递归地解决这些子问题,然后再合并其结果,就得到原问题的解. 看起来有点像递归,不过要知道分治算法是一种处理问题的思想,递归是一种编程技巧.看起来像是因为分治算法一般都比较适合用递归去实现分治算法递归实现步骤① 分解:将原问题分解问一系列的子问题;② 解决:递...原创 2019-10-04 18:15:56 · 2236 阅读 · 2 评论 -
贪心算法
背包装豆子问题 假设有一个可以容纳100Kg物品的背包,可以装各种物品,我们有以下五种豆子,每种豆子的总量和总价值都不同.为了让背包中装总价值最大的物品,我们需要如何选择放入背包中的豆子呢?每种豆子应该装多少? 这个问题的思路是:算出每种豆子的单价,即单位重量的价值。将单价最大的先放入背包中,就好比放入同样重量时金子和铁块,当然选择金子了。可以算出来由单价从高到低放入的是:20Kg给都、...原创 2019-10-04 15:22:00 · 513 阅读 · 0 评论 -
你了解Trie树吗
Trie树,也叫字典树,所以自然也是一个树形结构.Trie树是一种专门用来处理字符串匹配的数据结构,用来在一组字符串集合中快速查找某个字符串原创 2019-10-03 12:42:24 · 699 阅读 · 0 评论 -
TMD ,KMP!
以为搞清楚了BM算法的思想,就容易理解KMP了,shit!还是很难理解关于KMP算法中next数组是如何高效获得的,既然如此暂时不追究了,不过已然不妨碍把代码搞清楚!跟BM算法类似,KMP算法中主串和模式串的比对也有类似的东西如:坏字符和好前缀。没错,就是好前缀,BM算法中是好后缀,KMP算法中是好前缀!当遇到坏字符的时候,模式串依然是需要往后移动,对于KMP算法来说依然是设法一次滑动多个...原创 2019-10-01 23:07:44 · 374 阅读 · 0 评论 -
字符串匹配之BF和RK算法
单模式串匹配算法:BF+RK原创 2019-09-30 21:55:36 · 604 阅读 · 0 评论 -
图的搜索-BFS和DFS
图的搜索算法最直接的理解就是在图中的一个顶点出发,到达另一个顶点的路径。图的搜索算法中,广度优先搜索BFS和深度优先搜索DFS就是最简单最粗暴的算法,因为也没什么优化空间,也叫暴力搜索算法。图的存储有两种方式:一种邻接矩阵,一种邻接表。本文主要使用邻接表来存储图。BFS和DFS都可以用在有向图或者无向图中。本文主要使用的是无向图。这两种搜索算法都只能适用于图不大的搜索。广度优先搜索算法...原创 2019-09-30 15:55:42 · 501 阅读 · 0 评论 -
图的基本概念及存储方式
图的基本概念图(Graph)是一种非线性数据结构。顶点:树中的元素我们叫做节点;图中的元素我们叫做顶点(vertex)。边:图中的一个顶点可以与任意其他顶点建立关系,我们把这种建立的关系叫做边(edge)。度:以微信为例,我们可以把每个用户看成一个顶点,如果两个用户之间互加好友,那就在两者之间建立一条边。所以整个微信的好友关系就可以用一张图来表示。其中每个用户有多少个好友,对应到图中就是...原创 2019-09-30 10:51:01 · 503 阅读 · 0 评论 -
栈-判断括号串是否合法
使用栈来判断一串括号是否是合法的。原创 2019-08-27 13:54:48 · 470 阅读 · 0 评论 -
递归的应用
递归实现斐波那契数列、阶乘、全排列数组原创 2019-08-27 10:18:13 · 222 阅读 · 0 评论 -
排序算法-基数排序的时间复杂度分析
基数排序的思想基数排序,基数排序的思想是把位数相同的一组数组依次从后往前比较其每一位上的大小,经过几轮比较使得数据达到有序的做法。比较的次数跟数据的位数有关系。比如要比较一组手机号码从小到大排列,可以比较手机号每一位大小,然后比较11次,手机号达到有序。注意:基数排序每次位的比较可以使用线性排序的方式,比如桶排序或者计数排序,因为它们的时间复杂度为O(n),而且每轮的比较需要保证每次比较数...原创 2019-08-26 16:46:06 · 10842 阅读 · 0 评论 -
数据结构和算法中的"递归"---爬楼梯
递归,也就是层层递进再回归。这里讲解一个爬楼梯问题。原创 2019-08-20 20:01:49 · 362 阅读 · 0 评论 -
图解-环形队列的实现及阻塞队列
如果我们使用数组来实现队列,当队列尾部没有空闲空间时,即便整个队列有空闲空间,新数据也将无法入队。除非采用“数据搬移”的方法,将队尾的数据全部搬移到队列头部,这样队列尾巴才有空间可以进行入队操作。那么,有没有别的办法呢?这里就用到了环形队列。原创 2019-08-20 17:01:12 · 1442 阅读 · 0 评论 -
图解-队列的数组和链式实现
队列是一种先进先出的数据结构。在队尾插入数据,在队头出队。原创 2019-08-20 11:29:11 · 341 阅读 · 0 评论 -
排序算法-快速排序的时间复杂度分析
快速排序的思想是在数组[p,r]中选择一个分区点q,将数组一分为2,同时将小于分区点的数值的放到分区点左侧[p,q-1],大于分区点的数值的放到分区点右侧[q+1,r],重复这个过程。快速排序也是用到了分治思想和递归实现方式,这一点跟归并排序是一样的,但是快速排序的实现跟归并是完全不一样的。归并排序是先分解再合并,从下到上解决问题。快速排序是从上到下进行分区实现排序。俯视这个过程像是层...原创 2019-08-23 23:36:45 · 8342 阅读 · 0 评论 -
判断单链表存储的字符串是否为“回文串”
难度:二星回文串是啥?我想不用解释了,如果不懂什么是回文串可以自己百度一下。这里讲解的是当使用单链表来存储一个字符串的时候,如何通过单链表这种存储结构,判断这个字符串是不是回文串。先说下思想:我们使用快慢两个指针,初始状态下快指针和慢指针都指向单链表的头结点。快指针每次走两步,慢指针每次走一步,一直到快指针走到单链表的最后一个结点位置。此时慢指针恰巧会走到字符串的中间位置。如果我们...原创 2019-08-14 21:50:38 · 2000 阅读 · 0 评论 -
图解栈的实现和应用
栈是一种先进后出的数据结构,实现栈的方式有数组和链表。原创 2019-08-19 18:38:53 · 502 阅读 · 0 评论 -
合并两个有序单链表
首先了解下合并有序的链表的思想* 思想:两个有序的链表进行合并,使用两个指针分别指向链表的头结点,* 比较两个节点的最小值,作为新链表的头结点,然后移动找到最小值的那个链表的指针向后移一位。继续比较取得最小值,将最小值插入到新链表的后边,继续移动找到最小值的那个链表的指针,向后移动一位。直到其中一个链表指针指向为空。将另外一个非空链表直接插入到新链表的后边。这里贴一下思路,画图其实是...原创 2019-08-19 15:29:21 · 636 阅读 · 0 评论 -
判断一个单链表中是否含有“环”
判断单链表是否有环的问题,其实也可以使用快慢指针来解决,思想也是非常简单。不知道你发现没有,其实快慢指针就是解决问题的思路,你能否想到这个思路呢?到底思路从哪里来?我觉得这是一个值得思考的问题,比如我们处理过类似问题可以获得思路,我们脑海中突发灵感可以获得思路。除了这里提到的经验、灵感,你还能从哪里获得思路呢?说下这个问题的解法:判断一个单链表中是否含有环:思想:使用快和慢两...原创 2019-08-19 11:32:12 · 204 阅读 · 0 评论 -
一文让你彻底搞懂:计算机如何做减法?
好多人工作了几年,都不明白什么是补码,原码,反码.在开篇我们先介绍一下二进制的一些知识,毕竟在计算机的运算中全部都是使用的二进制。二进制分为有符号数和无符号数。有符号数,用来在计算机中表示正数和负数,最高位是符号位,0表示正数,1表示负数。比如1010 0010就表示一个负数。无符号数,最高位不是符号位,而是二进制数字的一部分。比如10100010就表示一个正数162.Java...原创 2019-07-09 22:43:38 · 4891 阅读 · 0 评论 -
DFA算法实现敏感词过滤
DFA,即Deterministic Finite Automaton,也就是确定有穷自动机。读音: [dɪˌtɜːmɪˈnɪstɪk][ˈfaɪˌnaɪt][ɔˈtɑmətən, -ˌtɑn]具体可以参考:http://www.mamicode.com/info-detail-965728.html比如我们有爱恋、哈哈、感动、静静、发呆、太多、...原创 2018-03-15 18:41:26 · 5615 阅读 · 0 评论 -
在O(n)的时间复杂度内查找第K大的元素
这道题目其实是快速排序算法的一个延伸,如何做到在O(n)的时间复杂度内查找数组内第K大的元素?学习过快速排序就知道,快排每次分区会把数据分为三个部分,a[0,p-1],a[p]以及a[p+1,n-1]三个区间。每次分区我们都将大于分区点元素放置在分区元素左边,小于分区元素的统一放到分区元素右边,那么这样一来,我们就可以利用快速排序实现从大到小的数组排序了。但是,这里说这个不是为了排序,而是想说...原创 2019-08-24 23:58:51 · 602 阅读 · 0 评论 -
使用单链表逆置字符串
难度:二星如何逆置一个单链表存储起来的 字符串?实现的方法有很多,这里我描述的是一个通过迭代和指针向后移动,翻转当前指针指向的方式来 实现的。看完这句话,我相信你也一定么有看懂,我一直觉得学数据结构和算法这门课,想通过文字来明白其中的原理是非常困难的。因为毕竟数据结构还是有很强的空间感的,尤其是指针指来指去的很可能就绕进去了,所以画图递进步骤是我觉得的一个好办法。这里其实我是先写出了代码并...原创 2019-08-16 14:51:08 · 551 阅读 · 0 评论 -
数组-动态扩容+增删改查操作+合并有序数组
这一篇我们来主要演示数组相关的练习,这里主要涉及数组的动态扩容、数组的增删改查操作以及合并两个原本有序的数组为一个新数组。数组动态扩容需求:支持数组的尾部插入、按照index位置插入,当数组容量满后将数组扩容为原来的两倍,并迁移原来的数组数据到新的数组中。这里我将数组的增删查改操作和数组的扩容放到一个代码中。package com.study.algorithm.array;/*...原创 2019-08-21 16:36:50 · 451 阅读 · 0 评论 -
排序算法-计数排序的时间复杂度分析
计数排序的思想计数排序,当数据范围max不大的时候,可以使用一个长度为max+1,即[0,max]的数组用以存储数据出现的次数。根据这个数据出现的次数,通过一定的计算,就可以知道这个数据之前到底有多少个数据,那么自然就很容易知道这个数据在总体数据中的位置了。利用这个思想,我们就可以对一个范围不大的数组进行计数排序。计数排序的时间复杂度计数排序的时间复杂度是O(n),当然这个前提是数据范...原创 2019-08-26 15:45:58 · 3509 阅读 · 0 评论