数据结构
FixedStarHaHa
这个作者很懒,什么都没留下…
展开
-
queue(Array、LinkedList实现)、Double Ended Queue
Enqueue(x)原创 2020-04-03 21:36:50 · 385 阅读 · 0 评论 -
(一)回文
回文是指正读和反读都一样的字符串9.回文数判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左...原创 2019-08-01 20:14:39 · 836 阅读 · 0 评论 -
(十八.1)利用快慢指针找数组、链表中点
slow最终指向即为中点ListNode fast=head;ListNode slow=head;while(fast.next!=null&&fast.next.next!=null) { slow=slow.next; fast=fast.next.next; ...原创 2019-08-01 14:37:45 · 618 阅读 · 0 评论 -
(二十)原地算法
在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部份覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。维基百科中的伪代码示例:假设要将具有n项内容的数组 a 翻转过来。一种看似简单的方法是创建一个大小相等的新数组,用适当...原创 2019-07-24 20:26:48 · 347 阅读 · 0 评论 -
(十九)回溯法
回溯法和DFS有区别backtraking有一个诀窍 就是recursive call之后要退回到之前的一个状态。基本思想在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优...原创 2019-07-15 20:36:46 · 152 阅读 · 0 评论 -
(三.3)聚簇索引、非聚簇索引
转自:https://zhuanlan.zhihu.com/p/62018452聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体的细节依赖于其实现方式,但InnoDB的聚族索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚族索引时,它的数据行存放在索引的叶子页中。术语“聚族”表示数据行和相邻的键值紧凑的存储在一起。因为无法同时把数据行放在两个不同的地方,所以一个表只...转载 2019-07-13 19:10:17 · 147 阅读 · 0 评论 -
(三.2)数据库索索引理论
①没有建立索引②使用平衡二叉树结构(请看推荐资料)索引的情况下访问数据:一、索引的优点加快数据的检索速度,这也是创建索引的最主要的原因 加快表与表之间的连接 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序时间 通过创建唯一性索引,可以保证数据库中每一行数据的唯一性二、什么情况下设置了索引但无法使用?例子参考:https://blog.csdn...转载 2019-07-13 18:51:08 · 155 阅读 · 0 评论 -
(三.1)二叉查找(排序)树、平衡二叉树、红黑树
二叉搜索树(BST)1、性质: ①非空左子树的所有键值小于其根节点的键值②非空右子树的所有键值大于其根节点的键值 ③左右子树都是二叉搜索树二、查找效率任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进。因此查找中数据比较次数与树的形态密切相关。当树中每个结点左右子树高度大致相同时,树高为logN。则平均查找长度与logN成正比...原创 2019-07-13 15:25:40 · 248 阅读 · 0 评论 -
(十八)快慢指针判断环路问题
快指针走两格,慢指针走1格,若有环,则一定会相遇。简单理解:一定是快指针先进入环中,若慢指针也进入环中,则两者速度差1。相当于慢指针不动(相对静止),而快指针以速度为1,追赶慢指针,(是环,一定会遇到)若没有环,则快指针将会先到达尾部。时间复杂度O(n),空间复杂度O(1)/** * Definition for singly-linked list. * cla...原创 2019-07-13 12:46:29 · 542 阅读 · 0 评论 -
(十七)拓扑排序算法
在代码具体实现的时候,我们还需要两个辅助的数据结构:1、邻接表:通过结点的索引,我们能够得到这个结点的后继结点;2、入度数组:通过结点的索引,我们能够得到指向这个结点的结点个数。3.入度为0的队列具体做如下:1、在开始排序前,扫描对应的存储空间(使用邻接表),将入度为 0的结点放入队列。2、只要队列非空,就从队首取出入度为 0的结点,将这个结点输出到结果集中,并且将这个...原创 2019-07-12 18:17:40 · 328 阅读 · 0 评论 -
(十六)拓扑排序
转自:https://blog.csdn.net/lisonglisonglisong/article/details/45543451一、拓扑排序基本概念在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。 若存在一条从顶点...转载 2019-07-12 15:32:55 · 77 阅读 · 0 评论 -
(十五)图的广度优先遍历BFS及最短路径
类似于一个分层搜索的过程,广度优先遍历需要使用一个队列以保持访问过的结点的顺序,以便按这个顺序来访问这些结点的邻接结点。具体算法表述如下:访问初始结点v并标记结点v为已访问。 结点v入队列 当队列非空时,继续执行,否则算法结束。 出队列,取得队头结点u。 查找结点u的第一个邻接结点w。 若结点u的邻接结点w不存在,则转到步骤3;否则循环执行以下三个步骤: 1). 若结点w尚未被...原创 2019-06-12 14:45:27 · 1752 阅读 · 0 评论 -
(十四)图的深度优先遍历DFS
DFS(Depth First Search)深度优先搜索是从起始顶点开始,递归访问其所有邻近节点,比如A节点是其第一个邻近节点,而B节点又是A的一个邻近节点,则DFS访问A节点后再访问B节点,如果B节点有未访问的邻近节点的话将继续访问其邻近节点,否则继续访问A的未访问邻近节点,当所有从A节点出去的路径都访问完之后,继续递归访问除A以外未被访问的邻近节点。因为是递归过程,所以我们用过程图看一...原创 2019-06-10 14:58:29 · 155 阅读 · 0 评论 -
(十三)动态规划算法的两种形式
为了说明动态规划的这两种方法,举一个最简单的例子:求斐波拉契数列Fibonacci。先看一下这个问题:Fibonacci (n) = 1; n = 0Fibonacci (n) = 1; n = 1Fibonacci (n) = Fibonacci(n-1) + Fibonacci(n-2)public int fib(int n){ if(n<=0)...原创 2019-06-06 16:35:31 · 1207 阅读 · 0 评论 -
(十二)动态规划--01背包
贼,夜入豪宅,可偷之物甚多,而负重能力有限,偷哪些才更加不枉此行(价值)?抽象的话,就是:给定一组多个()物品,每种物品都有自己的重量()和价值(),在限定的总重量/总容量()内,选择其中若干个(也即每种物品可以选0个或1个),设计选择方案使得物品的总价值最高。更加抽象的话:给定正整数、给定正整数,求解0-1规划问题:, s.t.,。(在限重情况下,价值最大,其中物...原创 2019-06-06 16:18:46 · 209 阅读 · 0 评论 -
(十一)排序算法分类、稳定性、时间复杂度和空间复杂度总结
一、排序算法分类:交插选归①插入排序: 直接插入排序、希尔排序②交换排序: 冒泡排序、快速排序③选择排序: 简单选择排序、堆排序④归并排序: 二路归并排序二、稳定性记住不稳定算法的顺口溜:快些选堆(快排,希尔,选择,堆)稳定算法有:冒泡排序...原创 2019-03-22 18:33:55 · 270 阅读 · 0 评论 -
(十)直接插入排序
一、直接插入排序的基本思想把n个待排序的元素看成为一个有序表和一个无序表。开始时有序表中只包含1个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,将它插入到有序表中的适当位置,使之成为新的有序表,重复n-1次可完成排序过程。二、代码public static void insertSort(int[] arr) { int length=arr.len...原创 2019-03-22 18:22:18 · 143 阅读 · 0 评论 -
(九)直接选择排序
一、直接选择排序的基本思想简单选择排序是最简单直观的一种算法,基本思想为每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止。二、代码public static void selectSort(int[] arr) { int length=arr.length; int min; for(int i=0;i<length...原创 2019-03-22 17:42:38 · 143 阅读 · 0 评论 -
(八)希尔排序
一、直接插入排序存在的问题简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3,2,1,0]这种倒序序列,数组末端的0要回到首位置很是费劲,比较和移动元素均需n-1次。二、希尔排序的基本思想先将待排序的数组元素分成多个子序列,使得每个子序列的元素个数相对较少,然后对各个子序列分别尽心直接插入排序,待整个待排序序列“基本有序”后,最后...原创 2019-03-22 16:45:12 · 104 阅读 · 0 评论 -
(七)冒泡排序
冒泡排序的基本思想从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。 public static void bubbleSort(int[] arr) { fo...原创 2019-03-22 14:37:16 · 157 阅读 · 0 评论 -
(六)排序为什么要分稳定和不稳定?
稳定性的意义如果只是简单的进行数字的排序,那么稳定性将毫无意义。 如果排序的内容仅仅是一个复杂对象的某一个数字属性,那么稳定性依旧将毫无意义 如果要排序的内容是一个复杂对象的多个数字属性,但是其原本的初始顺序毫无意义,那么稳定性依旧将毫无意义。 除非要排序的内容是一个复杂对象的多个数字属性,且其原本的初始顺序存在意义,那么我们需要在二次排序的基础上保持原有排序的意义,才需要使用到稳定性的...原创 2019-03-22 10:27:17 · 776 阅读 · 0 评论 -
(五)快速排序
快速排序基本思想在数据集之中,选择一个元素作为”基准”(pivot)。 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。这个操作称为分区 (partition) 操作,分区操作结束后,基准元素所处的位置就是最终排序后它的位置。 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。public class ...原创 2019-03-22 09:48:00 · 128 阅读 · 0 评论 -
(四)平衡二叉树
一、二叉排序树的缺点若树中插入的是随机数据,则执行效果很好,但是若插入的是有序或者是逆序的数据,则二叉查找树的执行速度很慢。为了能以较快的时间 O(logN) 来搜索一棵树,需要保证树总是平衡的(或者至少大部分是平衡的),这就是说对树中的每个节点在它左边的后代数目和在它右边的后代数目应该大致相等。红-黑树的就是这样的一棵平衡树,对一个要插入的数据项,插入例程要检查会不会破坏树的特征,如果破...原创 2019-03-13 21:41:49 · 293 阅读 · 0 评论 -
(三)B数、B+树及在数据库索引中应用
在算法逻辑上,二叉树的查找效率和比较次数都是最小的,但是在实际问题中,还要考虑磁盘IO.数据库索引是存储在磁盘上的,当数据量比较大时,索引可能几个G。当我们利用索引查询的时候,不能将整个索引全部加载到内存中,能做的只能是逐一加载每一个磁盘页,这里的磁盘页对应索引树的节点。二叉查找数、平衡二叉树、红黑树是典型的二叉查找数结构,其查找的时间复杂度为O(log2N)与树的深度有关,所以降...原创 2019-03-09 11:11:28 · 1670 阅读 · 0 评论 -
(二)二分查找
前提:有序 public int binarySearch(int[] array,int low,int high,int key) { int mid=0; while(low<=high) { mid=(low+high)/2; if(array[mid]>key) { high=mid-1; } else...原创 2019-03-06 10:01:50 · 139 阅读 · 0 评论 -
(一)归并排序
归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略可以看出这种结构像一个完全二叉树,递归深度为log2n从上往下的归并排序:它与"从下往上"在排序上是反方向的。它基本包括3步:① 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2;② 求解 -- 递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归并...原创 2019-03-04 10:21:27 · 185 阅读 · 0 评论