随笔分类 - 数据结构与算法
摘要:二叉树遍历的说明 使用前序,中序和后序对二叉树进行遍历: 1. 前序遍历: 先输出父节点,再遍历左子树和右子树(父左右) 2. 中序遍历: 先遍历左子树,再输出父节点,再遍历右子树(左父右) 3. 后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点(左右父) 小结: 看输出父节点的顺序,就确定是
阅读全文
摘要:1、先明确完全二叉树的概念 完全二叉树分为楼主所说的(图1就是了),还有一种完全二叉树是图2。图2也是完全二叉树!图2也是完全二叉树!图2也是完全二叉树! 概念: 完全二叉树分为两种: 1、最后一层没有满,那么最后一层的节点都得在左边。 2、最后一层满了,那就得全满才行,图2。 完全二叉树就这么个事
阅读全文
摘要:为什么需要树这种数据结构 1) 数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 。 插入的操作示意图: 2) 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比
阅读全文
摘要:哈希表基本介绍 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 哈希表的应用场景: 哈希表的逻辑图: 有关哈希表的
阅读全文
摘要:斐波那契(黄金分割法)原理: 斐波那契查找原理与前两种查找(二分查找和插值查找)相似,仅仅改变了中间结点(mid)的位置,mid 不再是中间或插值得到,而是位于黄金分割点附近,即 mid=low+F(k-1)-1(F 代表斐波那契数列),如下图所示: 对 F(k-1)-1 的理解: 由斐波那契数列F
阅读全文
摘要:1)插值查找原理介绍: 插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。2)将折半查找中的求 mid 索引的公式 : (low 表示左边索引 left, high 表示右边索引 right;key 就是前面我们讲的findVal) 3)int mid = low + (
阅读全文
摘要:线性查找 从第一个遍历判断到最后一个,查找到全部符合条件的值。(遍历数组找到就返回下标值(如果有多个可先存储)) 1. public class seqsearch { 2. public static void main(String[] args) { 3. int[] arr = {45, 2
阅读全文
摘要:堆排序基本介绍 1) 堆排序是利用堆(heap)这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它也是不稳定排序。 堆排序的基本思想是: 1. 将待排序序列构造成一个大(小)顶堆 2. 此时,整个序列的最大(小)值就是堆顶的根节点。 3.
阅读全文
摘要:基数排序(桶排序的一种)介绍 1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或 bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排
阅读全文
摘要:归并排序介绍 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 归并排序思想
阅读全文
摘要:快速排序法介绍 快速排序(Quicksort)是对冒泡排序的一种改进。 基本思想是: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 快速排序法示意
阅读全文
摘要:引入:简单插入排序存在的问题 插入排序可能存在的问题是数组 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
阅读全文
摘要:插入排序法介绍 插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 插入排序法思想 把 n 个待排序的元素看成为一个有序表和一个无序表, 一开始时有序表中只包含一个元素(arr[0]),无序表中包含有 n-1 个元素(arr[1]~arr[n]) 排序过程
阅读全文
摘要:基本介绍 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 选择排序思想 第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换, 第二次从 arr[1]~arr[n-1]中选取最小值,与 arr[1]交换, 第三次从
阅读全文
摘要:冒泡排序(Bubble Sorting)的基本思想 通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。图解: 小结: (1) 一共进行(数组的大小-1)次大的循环 (2)每一趟排序的次数在逐渐的减
阅读全文
摘要:排序的分类 1) 内部排序: 指将需要处理的所有数据都加载到内部存储器(内存)中进行排序。 2) 外部排序法:数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。 3) 常见的排序算法分类: 算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 1) 事后统计的方法 这种方法可行, 但是
阅读全文
摘要:递归需要遵守的重要规则 1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)2) 方法的局部变量是独立的,不会相互影响, 比如n变量3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.4) 递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflo
阅读全文
摘要:思路分析: 1) 初始化两个栈:运算符栈s1和储存中间结果的栈s2(s2实际可用ArrayList);2) 从左至右扫描中缀表达式;3) 遇到操作数时,将其压s2;4) 遇到运算符时,比较其与s1栈顶运算符的优先级: (1)如果 s1 为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;(2)否
阅读全文
摘要:前缀表达式(波兰表达式) 1)前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前 2)举例说明: (3+4)×5-6 对应的前缀表达式就是 - × + 3 4 5 6 前缀表达式的计算机求值 从右至左扫描表达式,遇到数字时,将数字压入堆栈, 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的
阅读全文
摘要:栈的介绍 栈的英文为:Stack 栈是一个先入后出(FILO-First In Last Out)的有序列表。 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一 种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Botto
阅读全文