随笔分类 -  数据结构

关于数据结构的基本知识
摘要:顺序存储树 一、 顺序存储二叉树的概念 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组 顺序二叉树通常只考虑完全二叉树第 n 个元素的左子节点为 2*n+1第 n 个元素的右子节点为 2*n+2第 n 个元素的父节点为 (n-1)/2n: 表示二叉树中 阅读全文
posted @ 2020-11-18 17:26 Latteitcjz 阅读(103) 评论(0) 推荐(0)
摘要:二叉树遍历与查找、简单删除 一、遍历 使用前序,中序和后序对下面的二叉树进行遍历. 前序遍历: 先输出父节点,再遍历左子树和右子树中序遍历: 先遍历左子树,再输出父节点,再遍历右子树后序遍历: 先遍历左子树,再遍历右子树,最后输出父节点小结: 看输出父节点的顺序,就确定是前序,中序还是后序 二、查找 阅读全文
posted @ 2020-11-16 23:50 Latteitcjz 阅读(73) 评论(0) 推荐(0)
摘要:树基础知识 一、 为什么需要树这种数据结构 数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 [示意图] 画出操作示意图: 2. 链式存储方式的分析 优点:在一定程度上对数组 阅读全文
posted @ 2020-11-16 15:35 Latteitcjz 阅读(75) 评论(0) 推荐(0)
摘要:哈希表 散列表(Hashtable,也叫哈希表),是根据关键码值(Keyvalue)而直接进行访问的数据结构。也就是说,它通 过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组 叫做散列表。 google 公司的一个上机题: 有一个公司,当有新的员工 阅读全文
posted @ 2020-11-16 15:11 Latteitcjz 阅读(58) 评论(0) 推荐(0)
摘要:斐波那契数列查找算法 黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位 数字的近似值是 0.618。由于按此比例设计的造型十分美丽,因此称为黄金分割,也称为中外比。这是一个神 奇的数字,会带来意向不大的效果。斐波那契数列 {1,1,2,3,5,8,13 阅读全文
posted @ 2020-11-16 12:37 Latteitcjz 阅读(218) 评论(0) 推荐(0)
摘要:插值查找 插值查找原理介绍: 插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。将折半查找中的求 mid 索引的公式 ,low 表示左边索引 left,high 表示右边索引 right. key 就是上一篇的findValintmid=low+(high-low)(ke 阅读全文
posted @ 2020-10-26 20:40 Latteitcjz 阅读(68) 评论(0) 推荐(0)
摘要:二分查找 思路: 注意二分查找只能用于有序的数组,无序的不能使用二分查找算法 具体实现如下: //查找单值的二分查找 public static int binarySearch(int [] arr,int left,int right,int findval) { //如果左边的大于右边的说明没 阅读全文
posted @ 2020-10-26 15:33 Latteitcjz 阅读(76) 评论(0) 推荐(0)
摘要:排序看这一篇就够了 文章目录 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、快速排序 六、归并排序 七、基数排序/桶排序 稳定:如果 a 原本在 b 前面,而 a=b,排序之后 a 仍然在 b 的前面;不稳定:如果 a 原本在 b 的前面,而 a=b,排序之后 a 可能会出现在 b 的 阅读全文
posted @ 2020-10-26 11:38 Latteitcjz 阅读(51) 评论(0) 推荐(0)
摘要:基数排序或桶排序 (1) 基数排序(radixsort)属于“分配式排序”(distributionsort),又称“桶子法”(bucket sort)或 binsort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用 (2) 基数排序法是属于稳定性的排序,基数 阅读全文
posted @ 2020-10-25 12:50 Latteitcjz 阅读(161) 评论(0) 推荐(0)
摘要:归并排序 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修 补"在一起,即分而治之)。 归并排序先把每 阅读全文
posted @ 2020-10-24 15:40 Latteitcjz 阅读(69) 评论(0) 推荐(0)
摘要:快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列 。 一、定义两个指针一个 阅读全文
posted @ 2020-10-23 22:37 Latteitcjz 阅读(56) 评论(0) 推荐(0)
摘要:希尔排序 希尔排序是希尔(DonaldShell)于 1959 年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序。 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含 的关键词越来越多,当 阅读全文
posted @ 2020-10-22 18:32 Latteitcjz 阅读(59) 评论(0) 推荐(0)
摘要:插入排序 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 插入排序(InsertionSorting)的基本思想是:把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有 序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无 阅读全文
posted @ 2020-10-21 15:20 Latteitcjz 阅读(57) 评论(0) 推荐(0)
摘要:选择排序 选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的。 选择排序(select sorting)也是一种简单的排序方法。它的基本思想是: 第一次从 arr[0]~arr[n-1]中选取最小值, 与 arr[0]交换,第二次从 arr[1 阅读全文
posted @ 2020-10-19 21:14 Latteitcjz 阅读(49) 评论(0) 推荐(0)
摘要:八皇后 1.通过递归回溯来判断路线 2.先放第一行第一列,然后放第二个是否合适,放完第三个再回溯看与之前是否冲突 具体实现如下: public class BaHuangHou { public static void main(String[] args) { BaHuangHou baHuang 阅读全文
posted @ 2020-10-19 12:00 Latteitcjz 阅读(119) 评论(0) 推荐(0)
摘要:递归与递归实现迷宫问题 递归就是方法自己调用自己,每次调用时传入不同的变量 递归需要遵守的重要规则 (1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) (2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量 (3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型 阅读全文
posted @ 2020-10-17 17:15 Latteitcjz 阅读(63) 评论(0) 推荐(0)
摘要:中缀表达式转后缀表达式与计算 1.创建两个栈,一个存储数字和后缀表达式s1,一个存储符号栈s2 2.存储流程 (1)如果符号栈s2为空,直接存入符号。 (2)如果不为空,当前符号优先级等于或者大于栈的符号,直接存入。 (3)如果不为空,当前符号优先级雄小于栈的符号,先弹出一个符号栈顶的元素,再比较, 阅读全文
posted @ 2020-10-14 14:34 Latteitcjz 阅读(104) 评论(0) 推荐(0)
摘要:逆波兰表达式/中缀表达式 1.先定义一个方法分割字符串每个数据,然后存到集合里面 2.然后在新的方法中定义 一个栈来存储数据 具体实现如下: //字符串转换为list集合 public static List<String> getString(String str) { //方便为了测试,用空格隔 阅读全文
posted @ 2020-10-08 13:37 Latteitcjz 阅读(136) 评论(0) 推荐(0)
摘要:栈实现中缀表达式 1.创建两个栈,一个用来存储数字一个用来存储操作符号 2.判断每一个字符是数字还是操作符 3.如果是数字,直接存入数栈中 4.如果是符号,看符号栈是否为空,如果为空直接存入 5.如果符号栈不为空,从符号栈中取出一个数据与当前符号比较,如果当前操作符优先级高于栈取出的,直接存入,否则 阅读全文
posted @ 2020-10-05 20:55 Latteitcjz 阅读(228) 评论(0) 推荐(0)
摘要:括号匹配问题 1.创建一个栈(stack)来存储左边的括号 2.遍历字符串获取每一个字符看是否为左括号或者右括号,如果为左括号将他压入栈中,如果为右括号从栈中弹出一个左括号,如果都不是继续遍历 3.判断t是否为null为null则没有对应的左括号 4.遍历结束查看stack中是否还有左括号剩下,有则 阅读全文
posted @ 2020-10-04 15:12 Latteitcjz 阅读(108) 评论(0) 推荐(0)