
数据结构和算法
文章平均质量分 95
一颗小陨石
除非我不想赢,不然没人能让我输
展开
-
《算法4》最短路径问题笔记
一、最短路径的定义:在一幅加权有向图中,从顶点s到顶点t的最短路径是所有从s到t的路径中的权重最小者。二、最短路径树一幅加权有向图中,以s为起点的一颗最短路径树是图的一个子图,包含了s和从s可达的所有顶点。该有向树的根节点为s,树的每条路径都是有向图中的一条**最短路径。**即我们可以找到从s到达图中任何顶点的最短路径。三、加权有向边public class DirectedEdge {...原创 2020-03-09 21:23:47 · 1227 阅读 · 0 评论 -
《算法4》最小生成树讲解笔记(Prim的延时和即使实现,Kruskal算法)
生成树: 图的生成树就是一颗含有其所有顶点的无环连通子图。最小生成树: 即给定一个加权无向图,找到它的一颗最小生成树(权值最小)。因此最小生成树的研究范围是:带权无向图,且是连通图。如下给出加权无向图的数据结构:带权重的边:/** * 带权重的边 * @author MaoLin Wang * @date 2020/2/239:49 */public class Edge i...原创 2020-03-09 14:43:21 · 475 阅读 · 0 评论 -
《算法4》无向图和有向图的有关问题详解(DFS,BFS,环,拓扑排序,连通性和强连通性)
本文仅作为《算法》第四版图的相关知识的个人笔记。几个概念:1.连通图:从任意一个顶点都存在一条路径到达另一个任意顶点。非连通图由若干连通图组成,都是极大连通子图。2.树是一个无环连通图。连通图的生成树是其一个子图,拥有图的所有顶点。3.二分图一种能够将所有节点分为两部分的图。简单的说,如果按双色上色,二分图的任意两个相邻的顶点的颜色不同。4. 两个顶点通过一条边连接,称为相邻的。顶点...原创 2020-03-08 19:02:29 · 2172 阅读 · 0 评论 -
《算法4》散列表实现笔记
一、散列函数散列函数会将键转为数组的索引。我们的散列函数应该计算速度快且能够均匀分布所有的键,如对于大小为M的散列表,我们的散列函数应当能够让任意的key都能够转化为 0-到M-1 的整数,对于不同的键应该有不同的散列函数。Java中许多常用的类都重写了hashCode方法,以针对不同的数据类型使用不同的散列函数。二、基于拉链法的散列表散列算法理想的状态是将不同的key都转为不同的索引值,但...原创 2020-03-08 13:16:33 · 247 阅读 · 0 评论 -
《算法4》红黑树原理实现---笔记
前面讲了AVL平衡树的实现https://blog.youkuaiyun.com/weixin_43696529/article/details/104701374,但由于AVL是高度平衡的树(高度差小于等于1),而红黑树是根据颜色来不严格的实现平衡,因此在插入和删除节点时,红黑树的调整次数较少,尤其是在大量数据面前时,红黑树的效率会更高。一、定义介绍首先我们需要知道什么是2-节点,什么是3-节点。2-...原创 2020-03-07 17:21:18 · 610 阅读 · 2 评论 -
AVL树的原理讲解-------java实现
前面讲到了二叉查找树,虽然能够很好的应用于大多数的场景,但是他们在最坏情况下性能还是很差的,如二叉查找树最坏情况下是一颗高度为N的树,显然不利于查找。因此我们需要让查找树保持一种平衡,如二叉查找树最优情况的状态一样。一、AVL树基础AVL树是一颗保持平衡的二叉查找树,保证了树的深度为O(logN)。其每个节点的左子树和右子树的高度都最多相差1上图就是一颗AVL树,其任意节点的左孩子和右孩...原创 2020-03-06 18:12:39 · 366 阅读 · 2 评论 -
二叉查找树(BST)---java实现
一、定义二叉查找树(BST)是一颗二叉树,其每个节点的值都比左孩子的任意节点大,比右孩子的任意节点小。二、数据结构public class BinarySearchTree<T extends Comparable<? super T>> { private TreeNode<T> root; public BinarySearchT...原创 2020-03-06 15:38:13 · 276 阅读 · 0 评论 -
顺序查找和二分查找----java实现
一、基于无序链表的顺序查找没啥讲的,就是顺序找。/** * 顺序查找(基于无序链表) * 未命中和命中都需要N次比较 * 命中最坏需要N次比较 * @author MaoLin Wang * @date 2020/3/118:01 */public class SequentialSearchST<Key, Value> { /** * 首节点 ...原创 2020-03-05 22:44:37 · 192 阅读 · 0 评论 -
《算法4》索引优先队列笔记-----java实现
一、前言前面已经讲了优先队列的实现,https://blog.youkuaiyun.com/weixin_43696529/article/details/104672731,但是其很明显有一个缺点,那就是无法直接访问已经在队列中的元素,更新或是删除它们,在Dijistra算法中就非常需要此性质,因此要解决此问题就需用到索引优先队列二、索引优先队列数据结构讲解索引优先队列使用一个int[] pq数组作为...原创 2020-03-05 20:31:22 · 891 阅读 · 0 评论 -
优先队列(堆)以及堆排序-------java实现
实现优先队列的基本数据结构是使用二叉堆一、二叉堆二叉堆即用一颗完全二叉树(底层元素从左向右填入)。如果所示,因此我们可以使用一个数组来表示二叉堆,而不使用链表:0 1 2 3 4 5 6 7 8 9 10 A B C D E F G H I可以发现,对于任意节点 i...原创 2020-03-05 14:36:30 · 1194 阅读 · 0 评论 -
《算法第四版》---union-find并查集笔记
union-find主要用于解决动态连通性的问题,如下图:对于输入的一系列整数对p,q,表示p和q是相连的,在将整数对输入完毕后,我们就可以从该图中获取该图的连通性,如任意两个节点是否相连,共有几个连通分量。如上图可看出共有两个连通分量:0-5-6-1-2-7,8-3-4-9union-find算法API如下: //初始化count个顶点 public UF(int count)...原创 2020-03-04 15:04:47 · 420 阅读 · 0 评论 -
LeetCode68题——旋转链表
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5-&...原创 2020-02-11 00:50:51 · 222 阅读 · 0 评论 -
哈夫曼树学习------java实现
一、基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的**带权路径长度(WPL)**达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)**路径:**在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径路径长度: 通路中分支的数目**权值:**树中结点具有的某种含义的数值**带权路径长度:**从根结点到该结点之间的路径长度与该结点...原创 2019-11-08 21:22:44 · 196 阅读 · 0 评论 -
(复习)二叉树的三种遍历方式、查找和删除----------Java实现
一、概念:二叉树二叉树的每个节点最多只能由两个子节点性质:二叉树的第 i 层最多有 2 ^ (i-1) 个节点深度为 k ( k≥0 )的二叉树最少有 k 个节点(一层一个),最多有 (2^k )-1 个节点 (空树k=0,只有一个根节点k=1)对于任意一个非空二叉树,若其 叶子节点数为 n,度为2的非叶子节点数为 m,则 n=m+1,(度 即节点所拥有的子树的个数)如果节点总...原创 2019-11-05 22:22:13 · 254 阅读 · 0 评论 -
哈希表-------java实现
今天太累了,不想写原理了,简单记一下供以后复习简单的讲就是通过散列函数求出待插入/查找元素的位置,然后将其插入到那个位置的链表即实现,这里散列函数用的取模法创建Person类,用作存储数据class Person { public int id; public String name; public Person next; public Person(i...原创 2019-11-02 11:03:07 · 148 阅读 · 0 评论 -
数据结构学习之斐波那契查找-----------java实现
一、斐波那契数列介绍{1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } :斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值0.618二、斐波那契查找算法2.1原理同二分法差不多,只不过在mid的位置上作了处理。在斐波那契查找算法中,mid的位置位于黄金分割点附近,即 mid = low + F[ k - 1 ] - 1,其中F为斐波那契数列关于F[ k -...原创 2019-11-01 12:17:57 · 329 阅读 · 0 评论 -
折半和插值查找 --------java实现
一、递归写法,返回待查数据下标原理很简单,网上很多解释,这里就不叙述了/** * 二分查找 * @author * @date 2019/10/3112:54 */public class BinarySearch { public static void main(String[] args) { //必须是有序的 int arr[]={2...原创 2019-10-31 16:32:10 · 168 阅读 · 0 评论 -
基数排序-------------java实现
一、基本思想1.基数排序(Radix Sort)属于分配式排序(distribution sort),又称"桶子法"(Bucket Sort或Bin Sort),它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。2.基数排序属于稳定的排序,基数排序法的是效率高的稳定性排序法3.基数排序(Radix Sort)是桶排序的扩展4.将所有待比较数值统一为同样的数位长度,...原创 2019-10-30 14:22:28 · 155 阅读 · 0 评论 -
算法第四版笔记之归并排序-------------java实现
归并排序采用分治策略实现平均时间复杂度 : O(nlogn) 最差时间复杂度: O(nlogn) 稳定性: 稳定 空间复杂度:O(n)归并排序时以空间换时间的排序方法,空间消耗很大,一般内部排序使用快速排序较多假设有这样一组数据:[10,4,8,7,1,3,2,9]一、分如上将8个数组分成8个单独的数据二、合1.将 10和 4合并2.将8和7合并...原创 2019-10-29 20:51:19 · 242 阅读 · 0 评论 -
快速排序-------------java实现
一、基本思想选择一个基准数,通过一趟排序将待排序数据分成两个独立的部分,其中一部分的所有数都比基准数小,另一部分都比基准数大,然后再使用此方法递归对两部分数据进行快排,最终实现整个数据的有序。二、详解排序过程现有待排序数据:{-21, 312, 44, 11, -23, 2, 10};蓝色为左哨兵,记为left,黄色为右哨兵记为right,红色为基数基数=(左哨兵坐标+右...原创 2019-10-29 18:27:26 · 239 阅读 · 0 评论 -
基于插入排序的希尔排序-----------java实现
首先看一下之前使用简单插入排序存在的问题:当存在一个数组,其最后一个数据为最小值,如:arr={5,6,16,34,33,2}这样的话需要循环到最后一次,也就是第6次的时候,才可以将2排到前边,效率非常低但是希尔排序可以很好的解决这个问题,其是简单插入排序改进后的一个效率较高的排序方式,也叫缩小增量排序复杂度:平均时间: O(nlogn)最差: O(n²)...原创 2019-10-28 20:04:18 · 619 阅读 · 0 评论 -
插入排序-----------java实现
一、复杂度平均时间复杂度: O(n²)最差时: O(n²)是否稳定: 稳定空间开销: O(1)在大部分数据已经排好序时性能较好二、基本思想将n个待排序元素看成一个有序表和一个无序表,开始有序表只有一个元素,每次排序从无需表中取第一个元素,将它的值依此和有序表元素的数据比较,插入到有序表的适当位置,形成新的有序表详解:初始数据:18, 5, 54,...原创 2019-10-28 17:29:13 · 136 阅读 · 0 评论 -
选择排序 ------java实现
一、插入排序的思想把n个待排序元素看成一个有序列表和一个无序列表,开始时有序列表只有一个元素,无序表有n-1个元素,每次排序时从无序表中取出第一个元素将其依次与有序表元素进行比较,将其插入到有序表适当的位置,称为新的有序表二、思路详解待排序元素: [34] 54 123 55 11 22第一次排序: [11,34] 54 123 55 22第二次排序 :...原创 2019-10-28 16:43:04 · 157 阅读 · 0 评论 -
冒泡排序---------java实现
一、冒泡排序平均时间复杂度: O(n²)最差时: O(n²)是否稳定:稳定 空间开销:O(1)适合n较小时原始数组:3 , 9, -1, 8, 2第一趟排序:(1) 3, 9, -1, 8,2(2) 3, -1, 9,8, 2(3) 3, -1, 8, 9, 2(4)3, -1, 8, 2, 9 9确定第二趟排序:(1)-1,3, 8, 2, 9(2)-1, ...原创 2019-10-26 11:45:40 · 138 阅读 · 0 评论 -
八皇后问题,递归回溯方法实现
一、思路分析代码实现:/** * 八皇后问题 * @author MaoLin Wang * @date 2019/10/2511:05 */public class Queue8 { int max=8;//共有多少皇后 int[] array=new int[max];//保存皇后位置的结果 static int count=0; public...原创 2019-10-25 13:00:34 · 154 阅读 · 0 评论