算法 + 数据结构
算法第四版,读到一半哈哈
萌宅鹿同学
目前在百度工作
展开
-
【Java数据结构】计算机中数据的存储方式(为什么要使用B树)
多路查找树计算机的存储内存硬盘硬盘基本构成硬盘存储的优缺点磁盘的预读二叉树与B树二叉树读取数据B树读取数据计算机的存储计算机中的存储大致可以分为内存与硬盘存储,硬盘还能继续分为机械硬盘与固态硬盘。内存内存我们相对比较熟悉,可以总结出它的优缺点:优点:使用电信号来保存信息,不存在机器操作,所以访问速度非常快。缺点:造价高,断电后数据丢失。一般作为CPU的高速缓存。硬盘硬盘基本构成...原创 2019-09-23 10:31:48 · 463 阅读 · 0 评论 -
【Java数据结构】平衡二叉树
平衡二叉树二叉排序树的不足平衡二叉树构建二叉排序树平衡因子返回当前节点的高度判断左旋转还是右旋转左左(右旋转)右旋转图解右旋转代码实现左旋转示例完整代码平衡二叉树类 BalancedBinaryTree平衡二叉树节点类 Node测试案例右右(左旋转)左旋转图解左旋转代码实现双旋转二叉排序树的不足关于之前就介绍过的二叉排序树,我们设下一下以下的情景:如果有一组数字:{1,2,3,4,5,6,7...原创 2019-09-22 00:10:20 · 434 阅读 · 0 评论 -
【Java数据结构】二叉排序树
二叉排序树为什么需要二叉排序树?什么是二叉排序树(BST)?为什么需要二叉排序树?假设有一组数字,{7,3,10,12,5,1,9},面对这么一组数字,我们有很多种方式来存储他们。例如线性结构中不排序的顺序存储结构:对这种数据结构来说,它查找某个元素十分的困难,需要从头到尾挨个去寻找。线性结构中排序的顺序存储结构:哪怕是排序过后的该种数据结构,通过二分查找,它的查找效率会变高,但是...原创 2019-09-19 19:57:44 · 363 阅读 · 0 评论 -
【Java数据结构】赫夫曼树
哈弗曼树哈弗曼树定义哈弗曼树示例哈弗曼树代码实现哈弗曼树定义给定 N 个权值作为 N 个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。结点的带权路径长度:从根到该结点的路径长度与该结点的权值乘积。树的带权路径长度:树中所有叶子结点的带权路径长度...原创 2019-09-18 22:23:49 · 332 阅读 · 0 评论 -
【Java数据结构】线索二叉树
中序线索二叉树线索二叉树概述线索二叉树代码实现线索二叉树的数据结构线索二叉树的遍历线索二叉树示例完整代码线索二叉树类 ThreadedBinaryTree线索二叉树节点类 ThreadedNode测试类 TestThreadBinaryTree线索二叉树概述线索化二叉树时,一个节点的前一个节点,叫做前驱节点;一个节点的后一个节点,叫做后继节点。线索二叉树是建立在二叉树的基础上,可以方便...原创 2019-09-15 17:40:02 · 432 阅读 · 2 评论 -
【Java数据结构】顺序存储的二叉树
顺序存储的二叉树二叉树数据结构二叉树的遍历先序遍历中序遍历后序遍历二叉树示例完整代码二叉树数据结构顺序存储的二叉树通常只讨论完全二叉树,顺序存储的二叉树,主要是利用数组来实现的。public class ArrayBinaryTree { int[] data; public ArrayBinaryTree(int[] data){ this.data = d...原创 2019-09-15 01:03:20 · 609 阅读 · 0 评论 -
【Java数据结构】链式存储的二叉树
二叉树数据结构二叉树示例二叉树结点类 TreeNode二叉树类 BinaryTree测试类 TestBinaryTree二叉树数据结构二叉树示例以下示例为创建一个如下的二叉树,并且实现先序、中序、后序遍历该二叉树。二叉树结点类 TreeNode二叉树节点类 TreeNode:public class TreeNode { // 节点的权 int value; /...原创 2019-09-15 01:03:35 · 392 阅读 · 0 评论 -
【LeetCode刷题】23. 合并K个排序链表
23. 合并K个排序链表题目思路1 - 普通思路思路2 - 逐一比较思路3 – 逐一两两合并思路4 – 优先级队列(小顶堆)思路5 – 分治策略题目链接:23. 合并K个排序链表合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2-&...原创 2020-04-10 17:53:01 · 263 阅读 · 0 评论 -
《Algorithms》—— 下压(LIFO)栈(能够动态调整数组大小的实现)
调整数组大小选择用数组表示栈内容意味着用例必须预先估计栈的最大容量。在 Java 中,栈一旦创建,其大小是无法改变的,因此栈使用的空间只能是这个最大容量的一部分。选择大容量的用例在栈为空或几乎为空时会浪费大量的内存。因此,我们修改了数组的实现,动态调整数组 a[] 的大小,使得它既足以保存所有元素,又不至于浪费过多的空间。实际上,完成这些目标非常简单。首先实现一个方法将栈移动到另一个大小不同的数...原创 2019-09-04 02:10:32 · 1267 阅读 · 0 评论 -
《Algorithms》—— Dijkstra 的双栈算术表达式求值算法
想当年学数据结构的时候,一直觉得这个是我一辈子都搞不懂的一个东西。现在看看。。。还挺简单的。。。重点在于如何解析由括号、运算符和数字组成的字符串,并按照正确的顺序完成各种初级算术操作。利用了两个栈(一个用于保存运算符,一个用于保存操作数)可以十分简单的完成这个任务。表达式由括号、运算符和操作数(数字)组成。我们根据以下4中情况从左到右逐个将这些实体送入栈处理:将操作数压入操作数栈将运算符...原创 2019-09-04 02:08:41 · 450 阅读 · 0 评论 -
《Algorithms》—— 链表实现栈,队列,背包
链表链表的定义链表实现栈链表实现队列链表实现背包链表的定义链表是一种递归的数据结构,它或者为空(null),或者是指向一个节点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链的引用。首先用一个嵌套类来定义结点的抽象数据: class Node { Item item; //泛型,节点存放的元素 Node nextNode; //递归,指向下一个节点 } 链表和...原创 2019-09-04 02:09:34 · 204 阅读 · 0 评论 -
《Algorithms》Comparable 实现选择排序
选择排序代码中涉及到 Comparable 的部分将会在别的文章单独介绍。选择排序是一种最简单的排序算法:首先,找到数组中最小的那个元素,其次,将它和数组第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。再次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种排序叫做选择排序,因为它在不断地选择剩余元素中的最小者。选择排序有两个...原创 2019-09-05 01:29:12 · 205 阅读 · 0 评论 -
《Algorithms》Comparable 实现插入排序
插入排序推荐一个算法的可视化学习网站:VisuAlgo,特别,特别棒!在插入排序中,为了要给插入的元素腾出空间,我们需要将其余所有元素在插入之前都向右移动一位。与选择排序一样,当前索引左边的所有元素都是有序的,但它们的最终位置还不确定,为了给更小的元素腾出空间,它们可能会被移动。但是当索引达到数组的右端时,数组排序就完成了。和选择排序不同的是,插入排序所需的时间取决于输入中元素的初始顺序。...原创 2019-09-05 01:32:34 · 187 阅读 · 0 评论 -
《Algorithms》Comparable 实现希尔排序
希尔排序希尔排序其实是改进版的插入排序,我们先回忆一下插入排序,插入排序每次将已排序序列的后一位元素插入到前面已排序的序列中,重点是这个插入的过程,其实和冒泡排序的思想是一样的,它是一位一位的移动,这样子效率很明显是低下的。而插入排序对于部分有序的数组进行排序又是高效的,希尔排序就是利用这两点对插入排序进行了改进。希尔排序又名缩小增量排序。这里的增量是第一个需要理解的重点,希尔排序是先将待排序...原创 2019-09-05 21:57:08 · 210 阅读 · 0 评论 -
《Algorithms》SortCompare 实现排序算法的比较
SortCompare 实现排序算法的比较对长度为 N 的 Double 型随机数组进行排序,元素值均在 0.0 到 1.0 之间,重复 T 次,然后输出时间。SortCompare 实现代码:public class SortCompare { public static double time(String alg, Double [] a) { Stop...原创 2019-09-05 23:42:40 · 334 阅读 · 0 评论 -
《Algorithms》Comparable 实现归并排序
Comparable 实现归并排序原创 2019-09-07 16:22:17 · 364 阅读 · 0 评论 -
《Algorithms》Comparable 实现冒泡排序
冒泡排序冒泡排序实际上就是进行 a.length 轮循环,每轮会将最小的元素放到左边(已经排好元素的右边)。由于冒泡排序比较简单,不多说了,展示下示例与代码即可。下面以数列{20,40,30,10,60,50}为例,演示它的冒泡排序过程(如下图)。public class BubbleSort { /** * 交换元素 * */ public stat...原创 2019-09-07 17:45:31 · 218 阅读 · 0 评论 -
《Algorithms》Comparable 实现快速排序&&三向切分的快速排序
快速排序快速排序的切分完整的快速排序几种排序的比较快速排序是目前使用最广泛的排序,同时也是目前最快的排序,它也体现了分治的思想:将数组分成两部分,并分别独立地进行排序,和归并排序不同的是,归并排序是将两个有序的数组合并为一个有序的大数组,快排则是当小数组有序时, 大数组就自然有序了。快速排序是用一个数v将数组切分, v左边的数全都小于v,,v右边的数全都大于v, 在将小数组继续切分, 直到不能...原创 2019-09-08 12:05:32 · 276 阅读 · 0 评论 -
《Algorithms》常见排序算法比较
各类排序算法比较原创 2019-09-08 21:39:50 · 293 阅读 · 0 评论 -
《Algorithms》Comparable 实现排序大全
各种排序这篇文章是将所有排序写到了一起。。方便复习。各个排序的单独介绍戳下面:选择排序插入排序冒泡排序希尔排序归并排序快速排序慢慢补全。。。各排序算法时间比较(代码)public class test { /** * 比较大小 * */ public static boolean less(Comparable m, Comparabl...原创 2019-09-09 00:53:46 · 192 阅读 · 0 评论 -
《Algorithms》Java 语言特性
背包、队列和栈API泛型自动装箱许多基础数据类型都和对象的集合有关。具体来说,数据类型的值就是一组对象的集合,所有操作都是关于添加、删除或是访问集合中的对象。本节,我们将学习三中这样的数据类型,分别是背包(Bag)、队列(Queue)和 栈(Stack)。它们的不同之处在于删除或者访问对象的顺序不同。API背包----------------------------------------...原创 2019-09-02 00:28:02 · 274 阅读 · 0 评论