数据结构与算法
不论是在面试中,还是我们在做平台产品的优化,有一个良好的数据结构的架构思路和算法的优化都可以让我们的设计更加出色,通过此专栏,将会用白话解释和方便大家理解内涵,更好的去学习数据结构和算法。
2NaCl
主攻Java后端开发与云计算Paas平台、离线大数据平台相关
展开
-
借助BM算法思想来理解KMP算法思想
上一章节我们说了BM算法,可以说,BM算法是一种很复杂的算法,高性能的同时也带有着很麻烦的处理,需要考虑到诸多因素,用代码来实现也是很复杂的。不过BM算法似乎也不是被我们所常用的算法,很多时候,我们提到字符串匹配,最先想到的就是KMP算法。尽管在实际的开发中,我们不太可能亲手去实现KMP算法。但是,学习这个算法的思想,作为让你开拓眼界、锻炼下逻辑思维,也是极好的,所以我觉得有必要说一说,但也很难...原创 2019-10-12 11:15:13 · 264 阅读 · 0 评论 -
动态规划(DP)理论
上一篇专栏主要用几个程序来解释了回溯和动态规划之前的区别,但是没有说出动态规划本质的特色,就像贪心算法的三个步骤一样,直抒胸臆,于是这篇专栏便会主要围绕着解题思路来讲,目的就是让大家明白什么样的问题可以使用动态规划算法,解决动态规划问题的思路是什么样的,贪心,分治,回溯,动态规划这四种算法的思想又有什么区别和联系?...原创 2019-08-10 15:13:54 · 551 阅读 · 0 评论 -
动态规划(DP)算法初识
先用大白话来说一下几种经典算法大概的意思:贪心算法:我就一次机会,为了达到目的,其他的我啥也不考虑回溯算法:我有无数次机会,还能怕我有达不到目的的时候?动态规划算法:我能随意在任何时候进行存档读档,用最华丽的方法走到终点。接下来的几篇文章可能都会围绕dp来说,从白话和较多篇幅去解释dp算法的内在简述动态规划求解出最优策略的原理是因为显著的降低了时间复杂度,提高了代码的运行效率,但动...原创 2019-08-09 17:06:49 · 8240 阅读 · 1 评论 -
递归算法
大家应该都知道推荐注册返还佣金的功能,很多app都有这个功能,比如用户a推荐用户b注册,用户b又推荐用户c注册。推荐人往往都会得到报酬,而这个推荐关系在数据库中可以这样显示,假设actor_id表示用户id,referrer_id表示推荐人id。那么,如果我们想要找到最终推荐人的话,要怎么书写算法呢?于是,我们就可以考虑使用递归了。如何理解递归算法看过之前几篇文章的人就应该知道,在回溯算...原创 2019-08-08 18:05:46 · 457 阅读 · 0 评论 -
回溯算法
按理来讲,回溯算法和动态规划算法是面试中笔试相对考的比较多的两个算法,区别在于一个可以重头再来一个可以无限读档,反正都是很bug的,所以就从这篇文章来看看回溯算法是怎么做到无限重来的吧。先说一下常见的回溯算法考的体型有:数独,八皇后,0-1背包,图的着色,旅行商问题和全排列等等。下面就来介绍一下回溯算法如何理解回溯算法我们之前所介绍的这些贪心分治算法无非都是让策略最优,贪心算法可以让我们每...原创 2019-08-07 16:28:28 · 251 阅读 · 0 评论 -
分治算法
之前我们介绍过了MapReduce框架,而MapReduce框架的本质就是分治算法,附上链接MapReduce如何让数据完成一次旅行如何理解分治算法分治算法的核心就是,分而治之,也就是将原问题划分成为n个规模比较小,并且和原问题相似的子问题,递归的解决这些子问题,然后再合并结果,得到原问题的解。当然,分治算法和昨天说的贪心算法的本质也是差不多的,都是一种处理问题的思想,而不是编程的框架。从...原创 2019-08-06 16:39:27 · 895 阅读 · 0 评论 -
贪心算法
贪心算法是一种一条路走到黑,不论如何也要达到目的的算法思想,有很多应用都是通过贪心算法来实现的,比如Huffman Coding,Prim,Kruskal和最小生成树算法。首先,我们要如何才能理解贪心算法?先看一个经典的背包问题。假设我们有一个可以容纳100kg物品的背包,可以装各种物品。我们有以下5种豆子,每种豆子的总量和总 价值都各不相同。为了让背包中所装物品的总价值最大,我们如何选择在...原创 2019-08-05 18:56:33 · 363 阅读 · 0 评论 -
Mysql数据库索引的实现——B more tree
身为一名java开发工程师,拥有对于数据库的牢靠掌握是十分重要的,尤其是对于索引的掌握,更为重要,那么索引的底层是如何实现的呢,就来看看这篇违章的Mysql索引底层讲解吧。此篇文章我们要解决两个问题,第一是数据库索引是如何实现的?第二是底层使用的是什么数据结构和算法?算法解析1. 解决问题的前提是定义清除问题该如何定义清除问题所在?除了对于问题有详细的调研,还有一个办法,那就是通过对于一些...原创 2019-09-03 00:13:15 · 177 阅读 · 0 评论 -
字符串匹配算法之BM算法理论知识图解
这一节,主要会讲BM算法和KMP算法,在说之前,我们先想象一种场景,文本编辑器里面的查找替换功能,应该都知道吧,比如,我们在word中把一个单词替换成另一个,用的就是这个功能。你有没有想过,这是怎么实现的呢?当然,用上次专栏说的BF暴力法和RK哈希匹配,也可以实现这个功能,但是BM性能差,RK计算哈希比较复杂,所以实现这项功能又并不是那么简单的。对于工业级的软件开发来讲,我们希望算法那可以尽可...原创 2019-10-10 15:32:47 · 679 阅读 · 0 评论 -
字符串匹配算法之BF暴力匹配算法与RK哈希匹配算法
下面几篇数据结构理论方面的文章,将会从字符串匹配算法开始说,因为刷leetcode被很多字符串的题难到了,就来学习极客时间的文章了。我们使用的字符串查找函数,比如java中的indexOf(),python中的find()函数等,他们底层就是依赖接下来要讲的字符串匹配算法。字符串匹配算法有很多,会分成四节来说。今天会讲两种比较简单的,好理解的,分别是:BF算法和RK算法。还有后面会介绍到的比较...原创 2019-10-09 00:03:27 · 533 阅读 · 0 评论 -
java 实现二分插入排序
我们都知道二分插入排序,是jdk中Arrays.sort()在length小于48时候的默认排序方法,也可得知,这种排序十分重要,且比直接插入排序的性能更加提高了。这次就来说一下java的二分插入排序算法。首先说一下二分插入排序的思想:将数组从下标为1的元素开始遍历,并且我们的目的是让这个元素左边为排序之后的状态,右边为待排序的状态,然后每遍历一位就把一位扔到左边。然后都遍历完了,就排序结束了...原创 2019-10-08 21:50:35 · 508 阅读 · 0 评论 -
BFS讲解及JAVA实现
打算将BFS和DFS分开来说,这样可以说的详细点,并且将会在分别介绍这两种搜索算法的时候主要去实践,然后理论方面打算单独发出一篇文章将异同点和应用的知识,都会在文章末尾贴出链接的。BFSBFS:也就是广度优先搜索。首先也是举一个图例其主要思想是从S开始,用队列的形式标记访问过的节点,并且这些节点在访问过之后将不会被访问,规范好队列的总容量,并且对经历过的节点进行距离的统计,由于连通图的每...原创 2019-10-03 11:09:14 · 2454 阅读 · 0 评论 -
DFS讲解及JAVA实现
从白话的角度去说DFS的思想,大约也就是从最开始的状态开始一条路走到底,如果不能寻找到最优解,就从上一个点,再走到底,直到找到最优解。BFS讲解及Java实现:所以我们可以诠释一个dfs适用的题型范围:给定一个初始状态和一个目标状态,要求判断这个初始状态到目标状态是否有解。接下来通过一个经典案例来对于DFS进行一下解释。DFS深度优先搜索(Depth-First-Search),简称DF...原创 2019-10-03 11:08:05 · 10172 阅读 · 4 评论 -
C语言数据结构——链表的创建
文章目录概论概论什么是链表?链表是一种常见的重要的数据结构,是动态的能进行存储分配的一种结构链表的组成:头指针:存放一个地址,该地址指向第一个元素结点:用户需要的实际数据和链接结点的的元素...原创 2019-02-18 22:09:49 · 411 阅读 · 0 评论 -
C语言数据结构——线性表的顺序存储结构
文章目录线性表的基本概念<1>定义<2>性质线性表的顺序存储结构1.基本概念2.设计与实现线性表的基本概念<1>定义线性表是0个或者多个数据元素的集合线性表中的数据元素之间是有序的线性表中的数据元素个数是有限的线性表中的数据元素类型必须相同&原创 2019-02-20 19:55:48 · 659 阅读 · 0 评论 -
C语言数据结构——线性表的链式存储结构
文章目录线性表的链式存储结构1.基本概念2.设计与实现3.优点和缺点线性表的链式存储结构1.基本概念链式存储定义:为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息之外,还需要存储指示其直接后继的信息。n个结点连接成一个链表,即为线性表(a1 a2 a3…an)的链式存储结构,因此此链表的每个结点中包含一个指针域,所以叫做单链表。单链表正是通过每个结点的指针域...原创 2019-02-21 17:08:11 · 1629 阅读 · 2 评论 -
C语言数据结构——循环链表
文章目录一、基本概念二、设计与实现三、优点和缺点一、基本概念循环链表的定义:将单链表中的最后一个元素next指针指向第一个元素和我们上面所写的链表除了已经具备的基本功能以外,还要新增一个功能:游标的定义在循环链表中可以定义一个“当前”指针,这个指针通常被称为游标,可以通过这个游标来遍历链表中的所有元素。新增功能:(1)将游标重置指向链表中的第一个数据元素(2)获取当前游标指向的数...原创 2019-02-22 13:51:24 · 757 阅读 · 0 评论 -
C语言数据结构——栈的顺序存储
文章目录一、栈的基本概念二、栈的顺序存储1.基本概念2.设计方法<1>先在头文件内声明我们想实现的方法<2>在main.c中将声明的方法带入实现<3>将SeqList的header.h与SeqStack的header.h进行整合<4>将SeqList的SeqList.c与原创 2019-02-25 21:11:35 · 954 阅读 · 3 评论 -
lru
打算从基础开始复习数据结构了,这篇文章就首先来说说链表(Linked List)这个数据结构。学习链表的作用与应用场景?首先我们应该都知道啥叫链表了,查找慢,插入快,现在我们主要说一种链表的常用场景,也就是LRU缓存淘汰算法。缓存是一种提高数据读取性能的技术,在硬件设计、软件开发中经常会用到,最让我们熟悉的其实就是Redis了。Redis在之前的文章中也已经介绍过了,有想去稍微看看的可以去点击...原创 2020-04-08 14:01:43 · 457 阅读 · 0 评论 -
二叉树基础(上):什么样的二叉树适合用数组来存储?
其实这段时间一直在刷lc,但是还是感觉树图写的不太行,就重新来学习总结了。首先提出疑问:二叉树有哪几种存储方式?什么样的二叉树适合用数组来存储?待着问题,然后来学习今天的内容树我们首先来看,什么是树?再完备的定义,都没有图直观。所以请看下图的树,都有什么特征。里面的每个实心圆点被我们称之为节点,用来连线相邻节点之间的关系,我们叫做“父子关系”。比如下面这张图,A就是B的父亲,B就是A...原创 2019-09-20 01:13:01 · 1045 阅读 · 0 评论 -
java数据结构 Queue(LinkedList)类总结
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。以下实例演示了队列(Queue)的用法:然后根据以上的api写一个demo:public class QueueDemo { public static void main(String[] args...原创 2019-10-02 16:54:26 · 2146 阅读 · 3 评论 -
java数据结构 Vector类总结
我们可以看见在左下角的Vector类,首先知道,它也是集合属性的一种,从继承AbstractList而来,并且同样拥有List内的接口方法。然后来列举一下其能实现的功能,Vector相关的理论知识之前有写过,可对照看一下https://blog.csdn.net/qq_41936805/article/details/94230463想主要说的是其子类Stack,因为经常用。...原创 2019-10-02 01:43:50 · 555 阅读 · 0 评论 -
java数据结构 Stack类总结
栈Stack是Vector的一个子类,它实现了一个标准的后进先出的栈。堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。接下来介绍几种常用的使用的方法:...原创 2019-10-02 01:42:38 · 238 阅读 · 0 评论 -
红黑树(上):为什么工程中都用红黑树这种二叉树?
之前,讲了二叉树,二叉查找树。二叉查找树是最常用的一种二叉树,支持快速插入、删除、查找等操作。各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是O(logn)。不过,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于logn的情况...原创 2019-09-22 15:16:25 · 282 阅读 · 0 评论 -
二叉树基础(下):有了如此高效的散列表,为什么还需要二叉树?
上一篇专栏,我们介绍了二叉树的基本知识,接下来,就来学习一种特殊的二叉树,名为二叉查找树。二叉查找树最大的特点就是:支持动态数据集合的快速插入、删除、查找操作。我们知道,散列表也都是支持这些操作的,而且散列表kv查找必然更快,时间复杂度还是O(1),那我们为何还用二叉查找树呢?带着这个问题就来学习今天的内容,二叉查找树!二叉查找树(B树)...原创 2019-09-20 22:31:58 · 445 阅读 · 0 评论 -
LinkedList(极客时间)
上次说了链表相关的基础知识。这次总结一些写链表代码的技巧,如果能熟练掌握这些技巧,就可以应对大多数链表的问题。技巧一:理解引用的含义事实上,看懂链表的结构并不是很难,但是一旦把它和面向对象的概念套在一起,就有挑战性了,但事实上,意思都是一样的,下面会用java的代码举例子。我们可以把一个java代码实例化的时候,将实例理解为指针,指向创建的对象的地址。Student s = new Stu...原创 2020-04-08 17:03:01 · 221 阅读 · 0 评论