数据算法研究
文章平均质量分 71
~~~~~~~~~~~~
webor2006
码农一个,记录个人成长的点滴~~
展开
-
树的应用
在之前已经对二叉树进行了详细的学习,这次会升级二叉树,就比之前学习的二叉树要更加的复杂麻烦了,涉及到左悬右悬的概念了。Haffman树:概念:Haffman树主要是用在压缩技术上,来看一张图:压缩之后的大小相比原文件要小了很多,其它的压缩思想下面简单简述一下:先看一下代码:这种代码在平常中会经常见到,那如果有一个班上的成绩占比图:假设有100个人,那么根据上面的占比可以得到:...原创 2019-09-29 21:05:00 · 95 阅读 · 0 评论 -
树与栈的结合-启发式寻路
启发式寻路算法:思路:啥是启发式寻路算法呢?下面先来看一下咱们要去实现的一个效果,先来直观的感受一下:也就是说根据起点和终点找到一个最佳能到达的路线,与咱们实际场景相关的第一时间可能就想到了用地图进行导航了,或者游戏中的寻路,所以这个算法是比较实现的,那下面从0开始剖析该算法的整个运作原理,下面先用画图的方式来阐述其实现思路,了解了思想之后再开始撸码,如下:如我们在地图中输入地点和...原创 2019-09-28 09:26:00 · 184 阅读 · 0 评论 -
二叉排序树(查找树、搜索树)
在上一次https://www.cnblogs.com/webor2006/p/11530008.html中对二叉树进行了简单的入门,对于上节涉及到的树实用性倒不是太大,但是从今天开始接触的二叉树都是比较有实用价值的,像在JDK8之后很多的结构也都使用到了树,所以学好树是非常有必要的。二叉排序树开端:先来看一张二叉排序树的图:它或者是一颗空树,或者是一颗具有如下性质的树:1)若左子树不...原创 2019-09-23 21:54:00 · 335 阅读 · 0 评论 -
二叉树遍历的应用之分治法
在上一次https://www.cnblogs.com/webor2006/p/11517957.html中对二叉树进行了入门,这次来学一学分治法,啥叫分治法呢?而它属于五大常用算法之一,而五大常用算法为:分治、动态规划、贪心、回溯、分支界定。下面来看一下具体相关的算法。查找技术:首先是查找相关的算法,其中分为顺序查找和二分查找,下面分别来看一下。顺序查找:如果线性表为无序表,即表...原创 2019-09-16 21:07:00 · 346 阅读 · 0 评论 -
哈希表与树的入门
哈希表:特点:数组(顺序表):寻址容易 链表:插入与删除容易 哈希表:寻址容易,插入删除也容易的数据结构,也就是综合了上述两种数据结构的优点于一身。Hash table:定义:哈希表(Hash table,也叫散列表) 是根据关键码值(Key value)而直接进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。关键码值(Key va...原创 2019-09-13 23:27:00 · 113 阅读 · 0 评论 -
栈与栈的应用
栈:栈是限定仅在表尾进行插入和删除操作的线性表【注意它也是属于之前我们学习的线性表的一类】,允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出的线性表,下面用示例图来瞅一下它:栈的实现:顺序方式:先来看一下它的示意图:而它的实际应用在JDK中有一个现成的Stack类,如下:而关于啥是Vector,下面可以看一...原创 2019-09-07 23:40:00 · 103 阅读 · 0 评论 -
线性表的链式存储结构
查看ArrayList的源码回忆顺序存储结构:其中核心的成员变量就是标准的顺序存储结构:其中我们经常构造它是都会采用默认的构造方法,所以瞅一眼它:其中:对于它里面的方法经常使用的是往里面添加元数,如下:另外这块考虑到了数组的扩容:也就是用当前的总数组的长度再增加一个来进行扩容的处理,下面看一下该扩容的具体细节:另外我们还可以在某个位置上添加数据,所以看一下它的实现...原创 2019-08-31 16:24:00 · 129 阅读 · 0 评论 -
数据结构与算法入门
在17年的时候曾经专门对数据结构跟算法进行了学习,不过,没有系统学完就半途而废了,当时我记得是学到了图相关的东东,转眼到19年过去两年了,对于这块的东东决定还是重拾起来从0开始系统完整的把它学完,不管是为了跳槽还是说为了工作,不能给自己技术树上留下遗憾。数据结构与算法概念:对于这些概念其实在大学都已经学过了,不过为了完整性还是得要大概对它们进行一个复习。数据结构研究的内容:定义:数据结构...原创 2019-08-25 15:41:00 · 108 阅读 · 0 评论 -
图的表达与遍历 - DFS和BFS遍历
test...原创 2017-12-27 15:04:00 · 81 阅读 · 0 评论 -
图的表达与遍历--邻接矩阵和邻接表
今天开始准备学习一个新的数据结构---图,貌似听着挺复杂的,当然实际也不容易啦,所以先从理论上对图有个大概的认识,其实之前咱们学的二叉树就是一种特殊的图,怎么个特殊法呢?因为它没有环,但是图是可以,它没有祖先,子孙的关系,如下:如果任意两个结点都有一条边,如下:此时就叫"完成图"。那如果有一个单向的关系,如下:此时就叫"有向图"。那如果有一个双向的关系,如下:那此时就叫"双向...原创 2017-11-20 16:00:00 · 105 阅读 · 0 评论 -
合并K个sorted list
合并k个已经排好序的数列是面试中也比较容易被问到的一个算法,有很多种解决,其中第一时间比较容易想到的解法如下:对于这三组从小到大的数列:如此循环,最终就将三个已经排序的数列的数字按从小到大的顺序排序到最终结果集了,那先来看一下这种算法的时间复杂度:如果总共有k个排序好的数列,而几个数列中的总数字为n个,每拿一个数都要进行k次的循环比较,很明显其时间复杂度T(n) = O(...原创 2017-10-31 17:19:00 · 79 阅读 · 0 评论 -
寻找一组数中最大的K个数
对于"从一组数中挑出最大的K个数"这个在面试中经常会遇到,所以这次好好的去解析它,而当拿到这个问题时第一时间能想到解法就是:先对数据进行排序,然后再取最大的K个元素,当然这思路没毛病,但是对于数据量非常大(如:一万个数)的情况是不是先对它进行排序的代价太高了,有木有比较优的解法呢?当然有,那就是采用上篇学习到的利用二叉堆排序去解决。定义二叉堆结构:首先是需要用代码去实现一个堆这样的数据结构,...原创 2017-10-18 14:20:00 · 104 阅读 · 0 评论 -
使用数组表达完全二叉树----二叉堆【理论】
这次学习一个新的非常重要的概念:"堆",先不急着编码,先用理论对它进行一个详细的阐述,所以这篇是纯理论的东东,在学习"堆"概念之前,先要解决一个问题:怎么将一个二叉树放到一个数组里面呢?之前是用链表来存放二叉树的,用数组怎么表达这种连接的关系呢?完全二叉树:这里用一个简单的二叉树为例---完全二叉树,因为完全二叉树是非常适合存放在数组当中的,所以这里又得去学习一下什么是完全二叉树,百度百科一...原创 2017-10-18 09:49:00 · 323 阅读 · 0 评论 -
表达式求值
好一阵子木有学习数据结构相关的东东,大脑得生锈啦~~赶紧再来练练大脑,这次学习一下如何用二叉树和栈来实现表达式的求值,这里只以简单的四则运算表达式来实现。思考:对于表达式如何在电脑中进行表式,其优先级怎么解决?在正式篇码之前,先思考一下,对于这样一个表达式"(4 + 5) * 9",在计算机中如何来表达它呢?其实可以用一颗二叉树来表达,将其数字做为树的叶子结点,而运算符做为树的父结点,表示如...原创 2017-09-09 15:59:00 · 88 阅读 · 0 评论 -
遍历二叉树 - 基于队列的BFS
之前学过利用递归实现BFS二叉树搜索(http://www.cnblogs.com/webor2006/p/7262773.html),这次学习利用队列(Queue)来实现,关于什么时BFS这里不多说了,先贴张图来直观回忆下:实现一个队列【采用数组实现】:这时同样采用模版技术可以往队列中去放任何类型的数据,而这个队列同样是声明在头文件中,以便在需要用到队列的地方去随时包含它,下面先来定个初...原创 2017-08-28 15:51:00 · 87 阅读 · 0 评论 -
遍历二叉树 - 基于栈的DFS
之前已经学过二叉树的DFS的遍历算法【http://www.cnblogs.com/webor2006/p/7244499.html】,当时是基于递归来实现的,这次利用栈不用递归也来实现DFS的遍历,这里先只学习如何用它进行二叉树的前序遍历,具体何为前序遍历这里不多解释,可以参考之前写的博客有详细的说明,下面开始实现。实现一个栈:为了能让栈里面可以放任何类型的数据,则使用C++的模板来实现,...原创 2017-08-19 22:14:00 · 115 阅读 · 0 评论 -
栈和队列的概念
栈和队列是非常重要的数据结构,后面要学习的很多算法都依赖于这俩数据结构,只要是学过编程的人应该都对这两个东东有所耳闻,这里还是对其进行复习一下,进一步认识它们的概念,虽然纯理论,但是有个了解之后有助于之后的使用。其实栈和队列可以理解成是对之前学过的数组和链表的一种限制,下面具体来了解一下:栈【Stack】:先来看一下来自维基百科上对它的定义:而为啥栈是后进先出的呢?下面看一下存数据与取...原创 2017-08-07 15:31:00 · 72 阅读 · 0 评论 -
基于递归的BFS(Level-order)
上篇中学习了二叉树的DFS深度优先搜索算法,这次学习另外一种二叉树的搜索算法:BFS,下面看一下它的概念:有些抽象是不?下面看下整个的遍历过程的动画演示就晓得是咋回事啦:了解其概念之后,下面看下如何实现它?在正式实现逐层遍历之前,需要解决一个问题,那就是:得知道该树有多少层,也就是树的深度如何计算,下面来解决这个问题:还是基于上篇的搜索二叉树的代码进行实现:public class...原创 2017-07-31 13:55:00 · 159 阅读 · 0 评论 -
遍历二叉树 - 基于递归的DFS(前序,中序,后序)
上节中已经学会了如何构建一个二叉搜索数,这次来学习下树的打印-基于递归的DFS,那什么是DFS呢?有个概念就行,而它又分为前序、中序、后序三种遍历方式,这个也是在面试中经常会被问到的,下面来具体学习下,用三种遍历方法来遍历上节中的二叉数:前序遍历:那对于上面的二叉数用前序遍历,遍历过程如下:1、先遍历根节点【5】2、再遍历左子树:需要注意的是:遍历左右子树时仍然采用前序遍历...原创 2017-07-27 13:59:00 · 112 阅读 · 0 评论 -
Binary Search-使用二叉搜索树
终于到二叉树了,每次面试时最担心面试官问题这块的算法问题,所以接下来就要好好攻克它~关于二叉树的定义网上一大堆,这篇做为二叉树的开端,先了解一下基本概念,直接从网上抄袭:先了解下树的概念,balabala~~:更通俗的定义:而二叉树就是树结构的一个经典树,也是要讨论的主题,下面再来看下二叉树的定义:而用二叉树主要是用来干嘛呢?上次不是学习过了一个利用递归实现折半查找的算法(h...原创 2017-07-25 11:12:00 · 72 阅读 · 0 评论 -
2sum问题求解
什么是2sum问题呢?举个例子就明白了:对于数列:【0、1、2、3、4、5、6、7、8、9】,求两数相加=9的所有两数的组合,所以结果为:【0、9】,【1、8】,【2、7】,【3、6】,【4、5】。所以就是要在一组数据中将结果全部输出出来,说到两个数相加等于某一个数,那也有可能是三个数、四个数相加呀,所以说其实这个问题可以归纳为ksum问题,只不过咱们先从2sum最基础的开始接触。如何实现呢?...原创 2017-07-24 14:02:00 · 138 阅读 · 0 评论 -
字符串搜索(strStr)--- C++版
上篇中是用JAVA实现的字符串搜索算法, 这次改用C++来实现,当然在C++就没有像JAVA那样方便的API可以很简便的实现了,其思想跟上篇类似,直接上具体实现代码:编译运行:下面分析下流程:还是以这个用例进行分析:其中参数str1="abcde",str2="cde":①、,条件为假,继续执行②;②、,条件为假,像这种case实际就是会走这个条件:③、,p = str =...原创 2017-07-21 17:29:00 · 158 阅读 · 0 评论 -
字符串搜索(strStr)--- java版
这里来学习一下从一个源字符串中搜索指定的字符串,有些啰嗦,直接看最终的效果:实际上JAVA SDK中相当于String.indexOf()方法,上面的用例改用JAVA SDK来实现看一下:编译运行:结果一模一样~而首先先用JAVA语言去实现这个算法,如何实现呢,下面先来捋一下思路:如果想从上图中搜"cde"这个字符串的位置如何搞呢?假设source代表源字符串、target代表待...原创 2017-07-19 15:55:00 · 83 阅读 · 0 评论 -
求最大公约数
神马是最大公约数呢,反正我这学渣是已经忘着差不多了,借此来复习一下:上面文字看完是不是还一脸抽象,下面看个图立马就能秒懂:也就是最大公约数就是相同的商之间相乘得到的数,而最大公约数的英文表示(greatest common divisor,简写为gcd),而求公约数有很多方法,这里学习“辗转相除法”、“更相减损法”、“二进制求解法”这三种解法,下面燥起来吧!辗转相除法:先来看一下它的...原创 2017-07-17 16:48:00 · 135 阅读 · 0 评论 -
折半搜索法 - 迭代
在正式进入主题之前,对于上一次用递归实现的折半搜索法,这里分析一下它的空间复杂度,在面试做笔记题的时候也是经常会被问到,先贴出上次的实现:我们知道总的递归产生的时间复杂度是O(log n),而这么多次递归中每次都会有一个middle,也就是有log n个middle,所以说它的空间复杂度S(n) = O(log n),也就是随着N的不断增加,相应的空间也会增加。那么有木有不需要middle...原创 2017-07-16 14:20:00 · 145 阅读 · 0 评论 -
折半搜索法 - 递归
今天开始准备学习搜索相关的算法,首先从折半搜索【也叫二分搜索binary search】开始,这个也是比较简单比较容易理解的,先来看下它的定义:光文字有些抽象,下面用图来表示整个折半查找的全过程:对于这样一组数列,比如要查询7这个元素,它的过程如下:于是乎数据就变成了:从这一步是不是就能体现出折半搜索的效率,顺意就将数据砍掉剩一半了,也就是数据范围一下就缩小了,所以查找效率就高了。下...原创 2017-07-15 15:07:00 · 107 阅读 · 0 评论 -
快速排序
上篇中归并排序开启了排序篇章,这次继续学习另外一种非常经典的排序-----快速排序【之所有叫快速排序肯定它的效率慢不了】,另外上篇对于归并排序只有实现,木有分析它的时间复杂度,由于它的复杂度跟快速排序的是一模一样的,所以学习快速排序之后直接针对它来计算一下既可,下面正式开启学习之旅:先来上一张网络上的图有个直观的认识,接下来会来论证它,就跟学习归并排序一下:解释一下上图的具体过程,对于一...原创 2017-07-13 10:22:00 · 72 阅读 · 0 评论 -
归并排序
这次终于要开始学习跟生活昔昔相关的算法了,首先映入眼帘的是归并排序,对于什么是归并排序网上文章一大堆,这里再来明确一下,先来看一张原理图【下面会用程序来论证整个如图所示的递归合并过程】:而看一下归并排序的文字描述,理论跟实践相结合:对思路清楚之后,下面则具体实现一下,实现方法有两种:递归、非递归。具体如下:递归方式实现归并排序[自顶向下]:先编写基础框架:上面先贴出具体实现,然后...原创 2017-07-07 10:15:00 · 86 阅读 · 0 评论 -
合并两个排好序的链表
接下来要学习跟排序相关的算法了,在正式之前先来个小热身,将两个“已排好序”的链表进行merge操作,先编写一个代码框架,这个比较简单不过多解释:#include <iostream>struct node{ int payload; node* next; node(int payload) { this->payload = p...原创 2017-07-02 13:51:00 · 117 阅读 · 0 评论 -
用数组实现约瑟夫环问题
在上一篇中已经介绍了用链表实现约瑟夫环的问题,博文:http://www.cnblogs.com/webor2006/p/7102568.html其实它还有一种更加简便更加容易理解的实现方式,那就是用数组,当然这两种实现方式的时间复杂度一样,其实现思路跟用链表的基本上类似,下面整理一下:首先用数组表达一个环,这就没有链表那么麻烦了,还是用四个人围着一个桌子在做淘汰游戏为例:具体生成的伪...原创 2017-07-02 09:21:00 · 123 阅读 · 0 评论 -
用循环链表实现约瑟夫环问题
什么是约瑟夫环问题?而这实际上就是一个经典的数学问题:而用一个更生活化的例子来阐述:几个人围坐在一张圆桌上,然后开始数数,数到指定数则淘汰,然后再重1开始数,直到还剩最后一个人则为胜利者。而具体代码如何来实现呢?首先还是基于上次的那个链表进行扩展:接着构造一个循环链表,为了使代码更加的清晰,这里采用面向对象的方法来进行封装接下来就是去实现这个add方法,如何在这个方法中实现一...原创 2017-07-01 15:46:00 · 165 阅读 · 0 评论 -
Reverse链表
之前学习了关于reverse数组相关的东东(http://www.cnblogs.com/webor2006/p/6727419.html),这次再来对链表进行reverse一下,在面试中也很容易被问到,而对于reverse链表有两种实现方式:递归方式和非递归方式,下面具体来实现下。递归方式:首先先来挼一下实现思路,假如有个链表如下:实现思路就是永远都是取出头结点的第二个结点将它的nex...原创 2017-04-26 14:23:00 · 99 阅读 · 0 评论 -
斐波那契数列的递归实现
说到递归算法,应该无人不知,那怎么算递归算法的时间复杂度,我想应该不一定每个人都知道了,所以下面来学习学习。对于递归算法举例,最经典的就是斐波那契数列了,而它的定义也贴一下:下面用代码来实现它:不多解释,因为比较容易,下面来看下输出结果:那该递归算法的时间复杂度是多少呢?应该时间耗得不多吧,看下面这个实验,把运行次数由10改到50,直观来感受一下:运行结果:仔细的观察一下...原创 2017-04-21 14:48:00 · 129 阅读 · 0 评论 -
Reverse数组以及大O表达式
这篇主要是对数组实现一个倒排序(比如数组1、2、3,最后输出3、2、1),当然实现这个功能是非常easy的事,但是这里需要引入另外一个很重要的概念-----如何计算一个算法的时间复杂度并学会用大O表达式。我记得之前有次面试,面试官让我写一个查找算法题,经过细心苦想后最终我简单的把它写出来了,然后面试官问我你这样实现那你的时间复杂度是O几呢?当时我一脸懵逼的问:“O几什么意思?时间复杂度我不太会算...原创 2017-04-18 13:52:00 · 77 阅读 · 0 评论 -
数组与链表
对于面试来说,数据结构与算法一直是被问,可对于实际项目开发中把它们都抛得很远,所以就有这样一个现象:在一家公司呆久了突然某些原因不得不面临找工作了(可能是自身为了更高的发展,也有可能是面临公司裁员等一些情况),突然发现有点不知所措,因为面试跟公司开发完全是不一样的侧点重,而其中最头疼的就是关于数据结构与算法相关的一些面试准备,临时抱佛脚这会让自己非常的焦虑,毕境涉及到这块的面试题不是像概念一下背...原创 2017-04-02 16:07:00 · 84 阅读 · 0 评论