
数据结构与算法
数据结构和算法相当于程序员的内功,面试题中也会经常出现,希望大家都能掌握好。
Gebo
经历的都是过往,现在的才是未来。
展开
-
【Java易懂版】二分查找算法及常见算法题套路总结
二分查找介绍二分查找又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。二分查找的递归实现与非递归实现二分查找的的递归实现我之前已经有写过,想看的可以点击跳转,这里就不再讲递归实现了,我们来看二分查找...原创 2020-04-03 13:19:38 · 509 阅读 · 0 评论 -
【Java算法】分治算法
1.什么是分治算法?分治法(Divide-and-Conquer)是一种很重要的算法。分治就是“分而治之”的意思,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),以及汉诺塔等等。2.分治法的步骤分治算法用递归来实现,而 在每一层...原创 2020-03-28 13:16:42 · 1678 阅读 · 0 评论 -
写给新手看的dfs和bfs
图的介绍图(graph)是一种数据结构,它表明了物件与物件之间的“多对多”的一种复杂关系。其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边(edge)。 结点也可以称为顶点(vertex)。图分为无向图和有向图,以及带权图,如下图:无向图: 顶点之间的连接没有方向,比如A-B,即可以是 A-> B 也可以 B->A .有向图: 顶点之间的连接有方向,比如A-B,只...原创 2020-03-26 11:23:17 · 410 阅读 · 0 评论 -
关于B树、B+树、B*树的总结
背景:二叉树需要加载到内存的,如果二叉树的节点少,二叉树的操作效率就较高,但是当二叉树的节点有很多的时候, 就存在如下问题:①在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响;②节点海量,也会造成二叉树的高度很大,会降低操作速度。于是多叉树登场了。多叉树在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点可以有更多的数...原创 2020-03-25 12:41:07 · 431 阅读 · 0 评论 -
图解平衡二叉树(AVL树)
二叉搜索树(BST)存在的问题我们先把{1,2,3,4,5,6}这颗二叉搜索树创建出来,结果如下图:可以看出这颗而擦搜索树的左子树全部为空,看起来更像一个单链表.此时它的插入速度没有影响,但查询速度明显降低(因为需要依次比较,所以时间复杂度变为O(n)), 不能发挥BST的优势,而且因为每次还需要比较左子树,其查询速度比单链表还慢。为了解决以上问题于是主角登场了------平衡二叉树(A...原创 2020-03-23 14:18:07 · 1204 阅读 · 0 评论 -
二叉搜索树(二叉排序树)的创建与删除
二叉排序树概述:二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。(如果有相同的值,可以将该节点放在左子节点或右子节点)如针对数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:二叉排序树创建和遍历(以中序遍历为例)public clas...原创 2020-03-22 17:23:33 · 363 阅读 · 0 评论 -
图解堆排序
在学习堆排序前,我们需要知道顺序存储二叉树和堆的知识点。一、顺序存储二叉树1.概念:顺序存储二叉树即用数组的方式存储二叉树的节点2.顺序存储二叉树的特点:①顺序二叉树通常只考虑完全二叉树②第n个元素的左子节点为 2 * n + 1③第n个元素的右子节点为 2 * n + 2④第n个元素的父节点为 (n-1) / 2(n : 表示二叉树中的第几个元素(按0开始编号如图所示)...原创 2020-03-20 21:18:36 · 1149 阅读 · 1 评论 -
二叉树的遍历与查找
树的相关概念二叉树的概念1)树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2)二叉树的子节点分为左节点和右节点。3)如果该二叉树的所有叶子节点都在最后一层,并且结点总数= 2^n -1 , n 为层数,则我们称为满二叉树。4)如果该二叉树的所有叶子节点都在最后一层或倒数第二层,且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树。二叉树...原创 2020-03-18 16:06:29 · 575 阅读 · 0 评论 -
【Java版】图解哈希表
哈希表的基本介绍哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。构造散列函数的方式有多种,如数字分析法,随机数法等,本篇用的是取模法。以下图为例,图中左边是一个长度为16的数组,数组里每一个元素是一个链表,这里是...原创 2020-03-17 11:26:31 · 718 阅读 · 0 评论 -
【Java版】二分查找法
二分查找法介绍二分查找又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。二分查找的思路分析首先确定该数组的中间的下标 mid = (left + right) / 2然后让需要查找的数 fin...原创 2020-03-16 16:29:00 · 298 阅读 · 0 评论 -
图解基数排序法
基数排序介绍基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用基数排序法是属于稳定性的排序,基数排序法是效率高的稳定性排序法。基数排序(Radix Sort)是桶排序的扩展,它是这样实现的:将整数按位数切割成不同的数字,...原创 2020-03-15 14:07:00 · 4596 阅读 · 1 评论 -
图解归并排序法
归并排序介绍:归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。归并排序中的分治思想“分”阶段可以理解为就是递归拆分子序列的过程。“治”阶段,我们需要将两个已经有序的子序...原创 2020-03-14 12:04:11 · 521 阅读 · 0 评论 -
图解快速排序法
快速排序法介绍:快速排序(Quicksort)是对冒泡排序的一种改进。快速排序法基本思想通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,从而让整个数据变成有序序列。快速排序法示意图:代码演示:public class QuickSort { public ...原创 2020-03-13 11:35:44 · 410 阅读 · 0 评论 -
图解希尔排序法
插入排序存在的问题上一篇我们讲了插入排序,我们通过下面的例子来简单的看插入排序可能存在的问题。数组 arr = {2,3,4,5,6,1} 这时需要插入的数 1(最小), 这样的过程是:{2,3,4,5,6,6}{2,3,4,5,5,6}{2,3,4,4,5,6}{2,3,3,4,5,6}{2,2,3,4,5,6}{1,2,3,4,5,6}结论: 当需要插入的数是较小的数时,后移...原创 2020-03-12 11:09:27 · 738 阅读 · 0 评论 -
图解插入排序法
插入排序法插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为...原创 2020-03-11 11:03:48 · 766 阅读 · 0 评论 -
选择排序法
选择排序选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从arr[0]~ arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[1]~ arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]~ arr[n-1]中选取最小值...原创 2020-03-10 11:37:39 · 250 阅读 · 0 评论 -
图解冒泡排序法
冒泡排序冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序(即跟我们要的顺序相反)则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。接下来我们通过一个实例讲解来学冒泡排序:原始数组:3, 9, -1, 10, 20下图是对冒泡排序过程的一个纤细描述:从上图的过程中我们可以得到以下...原创 2020-03-09 17:09:43 · 1301 阅读 · 0 评论 -
算法的时间复杂度和空间复杂度
时间复杂度概念一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) ),称O( f(n) ) 为算法的渐进时间复杂度,简称时间复杂度。计算时间复杂度的方法用常数1代替运行时间中的所有加法常...原创 2020-03-08 11:40:10 · 475 阅读 · 2 评论 -
递归--我自己调我自己
递归递归的概念递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于解决复杂的问题,同时让代码变得简洁。如果看了概念之后很懵,没关系,我们通过两个具体的实例来帮助我们理解什么是“递归”。打印问题public class RecursionTest{ public static void main(String[] args){ test(4); } p...原创 2020-03-06 16:13:27 · 1171 阅读 · 0 评论 -
java中的Collection集合和Map集合
集合1 集合概述:集合是java中提供的一种容器,可以用来存储多个数据。2 集合框架集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection和双列集合java.util.Map。Collection集合概述:Collection集合是单列集合类的父接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.List和java.u...原创 2020-03-01 22:25:46 · 1044 阅读 · 0 评论 -
java中的用数组模拟栈和用链表模拟栈
栈(stack)1概述:①栈是一个后进先出(LIFO, Last In First Out)的有序列表。②栈的插入和删除只能在线性表的同一端进行。允许插入和删除的一端称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。③根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。④出栈(pop)和入栈(...原创 2020-03-01 12:59:42 · 350 阅读 · 0 评论 -
Josephu(约瑟夫、约瑟夫环、丢手帕)问题
Josephu 问题描述设编号为1,2,… n的n个人围坐一圈,约定编号k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。解题思路:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点...原创 2020-02-28 09:07:34 · 365 阅读 · 0 评论 -
java实现双向链表
双链表概述:1.双链表设一头结点,设一尾结点2.头结点中prior字段为空,它的next字段给出线性表中的首结点的地址3.尾结点中next字段为空,它的prior字段给出线性表中最后一个节点的地址双向链表的遍历,添加,修改,删除的操作思路遍历方法和单链表一样,不同的是双向链表可以直接反向遍历添加 (默认添加到双向链表的最后)(1) 先找到双向链表的最后这个节点(2) temp....原创 2020-02-27 10:33:09 · 394 阅读 · 0 评论 -
java单链表练习题
新浪----查找单链表中的倒数第K个节点思路分析:遍历整个链表,得到链表的总长度size,接着再次遍历(size-k)个即可。public static Node findNode(Node head,int k){ if(head.next==null){ return null; } int size=getLength(head); if(k<...原创 2020-02-27 08:55:40 · 463 阅读 · 0 评论 -
java实现单链表
1 链表概述链表是有序的列表,但是它在内存中是存储如下图小结:1)链表是以节点的方式来存储,是链式存储。2)每个节点包含 data 域, next 域:指向下一个节点。3)如上图:发现链表的各个节点不一定是连续存储。4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。2 单链表单链表(带头结点) 逻辑结构示意图如下单链表的添加(创建):1)先创建一个head...原创 2020-02-27 00:05:13 · 418 阅读 · 0 评论 -
数据结构之队列(Java版)
1.队列概述:队列是一个有序表,可以用数组或链表实现(本篇讲的是用数组实现),遵循先入先出原则,即先存入队列的数据,要先取出,后存入的要后取出。2.用数组实现队列的思路使用数组的声明如下图,其中MaxSize是该队列的最大容量,则MaxSize-1是队列的最大下标(因为下标是从0开始),两个变量front及rear分别记录队列前后端的下标 ,front会随着数据输出而改变,而rear则是随着数...原创 2020-02-20 19:01:41 · 554 阅读 · 0 评论