数据结构与算法
天才少年137
这个作者很懒,什么都没留下…
展开
-
图的深度优先遍历(DFS)和广度优先遍历(BFS)
深度优先遍历(DFS)图的遍历:即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略: (1)深度优先遍历 (2)广度优先遍历图的深度优先搜索(Depth First Search) 。1:深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点, 可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。 2:我们...原创 2021-11-21 18:46:00 · 1287 阅读 · 0 评论 -
平衡二叉树AVL
平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。 具有以下特点:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。平衡二叉树也是二叉排序树案例:图一图二是平衡二叉树,图三不是左旋转:主要代码:int[] arr = {4,3,6,5,7,8}/**...原创 2021-11-05 22:27:42 · 84 阅读 · 0 评论 -
二叉排序树BST
二叉排序树:BST: (Binary Sort(Search) Tree), 对于二叉排序树的任何一个非叶子节点,要求左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。 特别说明:如果有相同的值,可以将该节点放在左子节点或右子节点 比如针对前面的数据 (7, 3, 10, 12, 5, 1, 9) ,对应的二叉排序树为:一:删除节点删除叶子节点 (比如:2, 5, 9, 12)删除只有一颗子树的节点 (比如:1)删除有两颗子树的节点. (比如:7, 3...原创 2021-11-03 19:55:30 · 146 阅读 · 0 评论 -
哈夫曼编码详解
一:基本介绍哈夫曼编码也翻译为 赫夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法 赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。 赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间 赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码1.1:原理剖析 1:通信领域中信息的处理方式1-定长编码将 i like like like java do ...原创 2021-10-30 23:20:29 · 17881 阅读 · 0 评论 -
哈夫曼树详解
一:定义 1:给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 2:赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。基本概念 1: 路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点...原创 2021-10-29 14:59:16 · 1656 阅读 · 0 评论 -
二叉树应用——堆排序
一:堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆是具有以下性质的完全二叉树: 1:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 ...原创 2021-10-27 15:23:01 · 161 阅读 · 0 评论 -
线索化二叉树
一:什么是线索化二叉树问题分析: 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上. 如果我们希望充分的利用 各个节点的左右指针, 让各个节点可以指向自己的前后节点,怎么办? 解决方案-线索二叉树 1:n个结点的二叉链表中含有n+1 【公式 2n-(n-1)=n+1】 个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加...原创 2021-10-26 20:54:01 · 202 阅读 · 0 评论 -
顺序存储二叉树
从数据存储来看,数组存储方式和树 的存储方式可以相互转换,即数组可 以转换成树,树也可以转换成数组, 看右面的示意图。顺序存储二叉树的特点: 顺序二叉树通常只考虑完全二叉树 第n个元素的左子节点为 2 * n + 1 ...原创 2021-10-25 19:56:43 · 76 阅读 · 0 评论 -
二叉树前序中序后序遍历和查找
一:前序中序后序前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点小结: 看输出父节点的顺序,就确定是前序,中序还是后序二:遍历思路三:二叉树前序中序后序遍历package com.atgguigu.tree;public class BinaryTreeDemo { public stati...原创 2021-10-24 21:11:33 · 116 阅读 · 0 评论 -
二叉树概念
一:数组,链表,数的差别数组存储方式的分析 :优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。 缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)树存储方式的分析 能提高数据存储...原创 2021-10-24 20:34:00 · 38 阅读 · 0 评论 -
哈希表原理
原理 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。哈希表作用:哈希表结构:案例:google公司的一个上机题: 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址...),当输入该员工的id时,要求查找到该员工的 所...原创 2021-10-23 18:54:58 · 107 阅读 · 0 评论 -
查找算法——斐波拉契(黄金分割)查找
斐波那契(黄金分割法)原理: 斐波那契查找原理与前两种相似,仅仅 改变了中间结点(mid)的位置,mid不 再是中间或插值得到,而是位于黄金分 割点附近,即mid=low+F(k-1)-1 (F代表斐波那契数列),如下图所示对F(k-1)-1的理解: 由斐波那契数列 F[k]=F[k-1]+F[k-2] 的性质,可以得到 (F[k]-1)=(F[k-1]-1)+(F[k-2]-1)+1 。该式说明:只要顺序表的长度为F[k]-1,则可以将该表分成长度为F[k-1]-1...原创 2021-10-22 21:36:46 · 95 阅读 · 0 评论 -
查找算法——插值查找
插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。 将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right. key 就是前面我们讲的 findVal ;int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;/*插值索引*/ 对应前面的代码公式: int mid = left + (right – left) * (find...原创 2021-10-22 19:04:44 · 85 阅读 · 0 评论 -
查找算法——二分查找
请对一个有序数组进行二分查找 {1,8, 10, 89, 1000, 1234} ,输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示"没有这个数"。package com.atgguigu.search;public class BinarySearch { public static void main(String[] args) { int[] arr = {1, 8, 10, 89, 1000, 1234}; ...原创 2021-10-22 00:36:12 · 65 阅读 · 0 评论 -
数据结构预与算法——基数排序
基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法。它将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。...原创 2021-10-21 23:59:32 · 56 阅读 · 0 评论 -
数据结构预与算法——归并排序
归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。package com.atgguigu.sort;import java.lang.reflect.Array;import java.text.SimpleDateFormat;import ...原创 2021-10-19 01:03:33 · 59 阅读 · 0 评论 -
数据结构与算法——快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列public static void quickSort(int[] arr,int left, int right) { int l = left; //左下标 int r = ri...原创 2021-10-16 17:19:18 · 39 阅读 · 0 评论 -
数据结构与算法——希尔排序
131原创 2021-10-16 16:15:57 · 81 阅读 · 0 评论 -
数据结构与算法——插入排序
插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。小结: 1:大循环次数 数组大小-1 次 2:每次大循环后有序数组个数加一,无序数组个数减一 ...原创 2021-10-13 19:59:55 · 51 阅读 · 0 评论 -
数据结构与算法——选择排序
选择排序(select sorting)也是一种简单的排序方法。它的基本思想是:第一次从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]~arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个...原创 2021-10-13 18:42:09 · 53 阅读 · 0 评论 -
数据结构与算法——冒泡排序
冒泡排序(Bubble Sorting)的基本思想是:通过对待 排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大 的元素逐渐从前移向后部,就象水底下的气泡一样逐渐 向上冒。 小结: 1:大循环次数 数组大小-1 次 2:每次大循环内小循环次数依次减一m,从 数组大小-1 次 开始 3:优化:如果某次大循环没有交换,...原创 2021-10-13 17:30:45 · 126 阅读 · 0 评论