![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
Raphaelkxy
只要有人的地方就有恩怨,有恩怨就会有江湖,人就是江湖。
展开
-
数据结构与算法的关系
数据结构与算法的关系数据结构和算法的重要性算法是程序的灵魂,优秀的程序可以在海量数据计算是,依然保持高速计算一般来讲,程序会使用内存计算框架(比如spark)和缓存技术(比如redis等)来优化程序。那实际工作经历来说,在unix下开发服务器程序,功能时要支持上千万人同时在线,在上线前,做内测,一切就绪后,服务器撑不住了,公司的cto对代码进行优化,再次上线,坚如磐石,这是优化的重点...原创 2019-07-02 09:35:31 · 4050 阅读 · 0 评论 -
选择排序
选择排序选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后,达到排序的目的。选择排序的思想第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]中选取最小值。...原创 2019-08-04 15:25:17 · 133 阅读 · 0 评论 -
插入排序
插入排序插入式排序属于内部排序法,是对欲排序的元素以插入的方式来寻找该元素的适当位置,以达到排序的目的。插入排序的基本思想:把n个待排序的元素看成一个有序表和无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出一个元素,把她的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。插入排序举例需...原创 2019-08-04 19:08:17 · 209 阅读 · 0 评论 -
递归应用场景和调用机制
递归应用场景和调用机制典型应用场景迷宫问题:由起点,找到迷宫的出口。概念递归就是自己调用自己,每次调用时,传入不同的变量,递归有助于解决编程者解决复杂的问题,同时让代码变得简洁。用两个小案例来理解递归机制打印问题public class RecursionTest { public static void main(String[] args) {...原创 2019-07-22 23:05:56 · 369 阅读 · 0 评论 -
递归能解决的问题和规则
递归能解决的问题和规则递归能解决什么问题各种数学问题,如8皇后问题,汉诺塔,阶乘问题,迷宫问题,球和篮子问题(google编程大赛)各种算法也会使用到递归,比如快排,归并排序,二分查找,分治算法等。将用栈解决的问题->递归代码比较简洁递归需要遵守的重要规则执行一个方法时,就创建一个新的受保护的独立空间(栈空间)方法的局部变量是独立的,不会相互影响,比如之前n...原创 2019-07-22 23:06:52 · 2109 阅读 · 0 评论 -
迷宫回溯问题分析与实现
迷宫回溯问题分析与实现迷宫实现github小球得到的路径,和程序员设置的找路策略有关,即找路的上下左右的顺序有关。再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变测试回溯现象github使用递归求最短路径...原创 2019-07-22 23:28:44 · 375 阅读 · 0 评论 -
排序算法
排序算法算法简介排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程。(算法建立在数据结构之上,有些问题一个数据结构就能搞定,比如存储一组数。有些问题,需要算法,比如排序,不仅要存储数,而且要把数按顺序存储)分类内部排序(考试、面试重点)(使用内存)指需要将处理的所有数据都加载到内部处理器中进行排序。内部排序种类插入排序直接插入排序希尔排序选择排序...原创 2019-07-27 00:28:59 · 107 阅读 · 0 评论 -
希尔排序剖析
希尔排序剖析简单插入排序存在的问题当需要插入的数是较小的数时,后移的次数明显增多,对效率有影响。介绍希尔排序是希尔于1959年提出的一种算法,希尔排序也是一种插入排序,它是简单插入排序经过修改后的一个更高效的版本,也称为缩小增量排序。希尔排序法基本思想希尔排序是把记录按下标的一定增量进行分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量...原创 2019-08-05 12:14:13 · 193 阅读 · 0 评论 -
快速排序
快速排序简介快速排序是对冒泡排序的一种改进。基本思想是:通过一趟排序,将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分数据的所有数据都要小,然后在按此方法对这两部分分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序示例基准有程序员定,可以是每组第一位,最后一位等等其他位。快速排序法代码实现快速排序执行速度...原创 2019-08-05 16:04:58 · 121 阅读 · 0 评论 -
归并排序
归并排序简介归并排序是利用归并的思想实现排序的方法,该算法采用经典的分治策略。归并思想排序的示意图可以看到,整个排序过程分为分和治两个过程,治的次数为n-1次治的思路描述治的阶段,需要将两个已经有序的子序列合并成一个有序序列,比如将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8]思路:将指针i,j分被指...原创 2019-08-06 11:32:42 · 127 阅读 · 0 评论 -
算法的时间复杂度
算法的时间复杂度基本介绍时间频度:一个算法花费时间与算法中语句的执行次数成正比,哪个算法语句执行次数多,他花费的时间就多。一个算法语句执行次数成为语句频度或时间频度T(n)。int total =0;//计算1加到100的值int end = 100;for(int i=1;i<=end;i++){ total+=i;//1}//T(n)=n+1;//1号语句执行...原创 2019-08-02 00:54:42 · 300 阅读 · 0 评论 -
冒泡排序
冒泡排序基本介绍冒泡排序的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,以从小到大为例,使值较大的元素逐渐从前向后移,就像水底下的气泡一样逐渐向上冒。因为排序过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换,从而减少不必要的比较。...原创 2019-08-07 09:19:33 · 257 阅读 · 0 评论 -
基数排序
基数排序介绍1887年赫尔曼喝了礼发明的基数排序是桶排序的扩展实现思路将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成了一个有序序列。应用实例初始状态:53,3,542,748,14,214,使用基数排序,进行反序排序。根据0-9,对应10个桶...原创 2019-08-07 09:52:40 · 299 阅读 · 0 评论 -
归并排序
归并排序简介归并排序是利用归并的思想实现排序的方法,该算法采用经典的分治策略。归并思想排序的示意图可以看到,整个排序过程分为分和治两个过程,治的次数为n-1次治的思路描述治的阶段,需要将两个已经有序的子序列合并成一个有序序列,比如将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8]思路:将指针i,j分被指...原创 2019-08-07 09:58:30 · 233 阅读 · 0 评论 -
排序算法总结
排序算法总结稳定:如果a原本在b前面,而a=b,排序之后,仍然在b的前面不稳定:如果a原本在b前面,而a=b,排序之后,a可能会出现在b的后面。内排序:所有排序操作都在内存中完成外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行时间复杂度:一个算法执行所要耗费的时间冒泡、选择、插入是平方阶,平均、最坏希尔、归并、快速、堆是线性对数...原创 2019-08-07 10:58:27 · 232 阅读 · 0 评论 -
中缀表达式转后缀表达式
中缀表达式转后缀表达式问题我们可以看到,后缀表达式适合计算式进行运算,但是人却不太容易写出来,尤其是表达式很长的情况下,因此在开发中,我们需要将中缀表达式转成后缀表达式。中缀表达式转后缀表达式思路分析小括号并不是运算符这思路是由相关计算机领域专家提供的,自己设计一套有相同效果的算法,是一件较为复杂的事,相关领域老师也不定能想出来个人认为,算法分为两个境界,第一个境界,理解算...原创 2019-07-20 19:00:39 · 135 阅读 · 0 评论 -
逆波兰计算器
逆波兰计算器需求分析输入一个逆波兰表达式,使用栈(Stack),计算其结果支持小括号和多位数整数,因为这里目的是搞懂数据结构,而不是写计算器,所以,这里对计算器进行简化,只支持对整数的计算。思路分析从左至右扫描,将3和4压入堆栈遇到+运算符,因此弹出4和3(4为栈顶元素,3位次顶元素),计算出3+4的值,的7,再将7入栈。将5入栈接下来是×运算符,因此弹出5和7,...原创 2019-07-20 16:34:23 · 369 阅读 · 0 评论 -
实际编程常遇到的算法问题
实际编程常遇到的算法问题字符串替换问题(raplaceAll算法)单链表五子棋问题存档:将棋盘映射成二维数组,转成稀疏数组,写入文件,存档功能。接上局:读取文件,读取稀疏数组,二维数组,棋盘,接上局功能。约瑟夫问题(丢手帕问题)不带头结点的单向环形循环链表修路问题最小生成树,可以用普利姆算法+树结构最短路径问题弗洛伊德算法+图结构汉诺塔分...原创 2019-07-02 09:35:59 · 277 阅读 · 0 评论 -
线性结构和非线性结构
线性结构和非线性结构线性结构线性结构是最常用的数据结构,其特点是数据元素之间的存在一对一关系。比如a[10]=30线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构,顺序存储的线性表为顺序表,顺序表中的存储结构是连续的。分配的内存地址是连续的。链式存储的线性表是链表,链表的存储元素内存不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。内存不连续的好处...原创 2019-07-02 09:36:36 · 4068 阅读 · 0 评论 -
稀疏数组
稀疏数组引入题意:编写一个五子棋程序,有存盘退出和续上盘的功能。棋盘是11×11格局。思路:使用二维数组记录棋盘,默认数组为0,1代表黑色棋子。2代表蓝色棋子。思路问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,可以用稀疏数组进行压缩。稀疏数组介绍:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。...原创 2019-07-03 11:09:15 · 690 阅读 · 0 评论 -
队列的应用场景和介绍
队列的应用场景和介绍特点:先进先出英文:Queue应用场景举例银行排队:四个业务员,为排队的人的服务,每有一个业务员服务完成后,这时下一位被服务者从下面的队列中产生。队列介绍队列是一个有序列表,可以用数组和链表实现。数组顺序存储,链表链式存储。遵循先入先出的原则,即先存入队列的数据,要先取出,后存入的要后取出。用数组模拟示意图:rear代表尾部,f...原创 2019-07-09 20:36:17 · 12852 阅读 · 2 评论 -
数据模拟环形队列
数据模拟环形队列问题分析并优化目前数组使用一次就不能用,没有达到复用的效果。将这个数组使用算法,改进成一个环形队列 取模:%使用数组模拟环形队列的思路分析(通过取模实现)front变量的含义做一个调整:front就指向队列的第一个元素(原来指向队列第一个元素的前一个位置)front的初始值默认为0rear变量的含义做一个调整:rear指向队列的最后一个元素的后一...原创 2019-07-09 22:46:40 · 215 阅读 · 0 评论 -
双向链表增删改查分析
双向链表增删改查分析单向链表的缺点单向链表查找方向只能是一个方向,而双向链表可以向前或者向后查找。单向链表不能自我删除,需要靠辅助节点,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到temp,temp是待删除节点的前一个节点。(利用next机制)示意图可以帮助理解删除示意图分析双向链表的遍历,添加,修改,删除的操作思路遍历的方式和单链表...原创 2019-07-14 10:52:47 · 2869 阅读 · 0 评论 -
单向环形链表应用场景
单向环形链表应用场景约瑟夫问题(约瑟夫环)设编号为1,2…,n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。采用一个单项环形链表来处理(可以带表头也可以不带表头),具体使用头结点还是不...原创 2019-07-14 10:56:43 · 665 阅读 · 0 评论 -
栈
栈栈的一个实际需求描述,如下图,输入一个表达式,[7*2*2-5+1-5+3-3]请问计算机底层是如何运算得到结果的?注意这不是简单的把算式列出来运算,因为我们看到这个算式7*2*2-5,但是计算机怎么理解这个算式的(对计算机而言,它接收到的就是一个字符串)?实际上,他底层使用了栈这种数据结构。简介英文:stack栈是一个先入后出的有序列表栈是限制线性表,插...原创 2019-07-15 20:12:14 · 106 阅读 · 0 评论 -
栈的思路分析和代码实现
栈的思路分析和代码实现数组模拟栈的思路分析图思路分析使用数组来模拟战定义一个变量top来表示栈顶,初始化为-1;入栈操作,当有数据加入到栈时,top++;stack[top]=data;出栈操作,int value = stack[top];top–;return value1;代码实现github...原创 2019-07-15 21:19:49 · 173 阅读 · 0 评论 -
链表
链表介绍LinkedList特点虽然是有序列表,但是其内存存储不是连续的,而是随机分配。是由一个个节点组成,,每个元素是以节点的方式来存储,每个节点由data域和next域,data存储节点数据值,next存储下一节点的地址。链表是有序列表,分为带头节点和不头结点,根据实际需求来确定。案例客户端和server服务器,每隔一定时间,把某个人的好友信息(比...原创 2019-07-11 22:44:30 · 114 阅读 · 0 评论 -
单链表创建和遍历的分析实现
单链表创建和遍历的分析实现需求总体描述:使用带head头的单向链表实现水浒英雄排行榜管理具体描述:完成对英雄人物的增删改查操作,注:删除和修改,查找可以考虑学员独立完成,也可带学员完成。第一种情形在添加英雄时,直接添加到链表的尾部。第二种情形在添加英雄时,根据排名将英雄插入到指定位置。(如果有这个排名,则添加失败,并给出提示)第一种添加对链表的分析示意图...原创 2019-07-11 22:46:47 · 510 阅读 · 0 评论 -
单链表的修改与删除
单链表的修改与删除需求一:修改节点的信息,根据no编号来修改,即no编号不能改。代码实现 单链表修改需求二示意图思路先找到需要删除节点的前一个节点temptemp.next = temp.next.next;被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收。代码实现单链表删除...原创 2019-07-11 23:07:07 · 810 阅读 · 0 评论 -
栈实现综合计算器
栈实现综合计算器需求使用栈完成计算一个表达式的结果表达式为:7*2*2-5+1-5+3-4=?分析图示思路分析通过一个index值(索引),来遍历我们的表达式。如果我们发现是一个数字,就直接入栈如果我们发现扫描到是一个符号,就分如下情况如果发现当前的符号栈为空,就直接入栈。如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于...原创 2019-07-16 23:05:24 · 194 阅读 · 0 评论 -
前缀、中缀、后缀表达式(逆波兰表达式)
前缀、中缀、后缀表达式(逆波兰表达式)前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。(3+4)×5-6对应的前缀表达式就是-×+3 4 5 6写法:按优先级依次将各对数的符号写前面,数字按自然顺序写求值方法:从右至左扫描表达式,遇到数字式,将数字压入栈,遇到运算符时,弹出栈顶的两个数,用运算符对他们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程,直到表...原创 2019-07-20 16:33:44 · 365 阅读 · 0 评论 -
查找算法
查找算法java中,常用的查找算法:顺序查找(线性查找)二分查找/折半查找插值查找斐波那契查找线形查找算法举例:数列{1,8,10,89,1000,1234},判断数列中是否包含此名称,如果找到了,就是提示找到,并给出下标值。代码实现线性查找二分查找对一个有序数组进行查找{1,8,10,89,1000,1234},对一个一个无序数组,则不能使用...原创 2019-08-09 11:44:16 · 259 阅读 · 0 评论