随笔分类 - CS专业课 / 数据结构与算法
Java实现
摘要:1. 概念 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。但顺序存储二叉树通常只考虑的是完全二叉树。 用数组存储无疑是最节省内存的一种方式。因为数组的存储方式并不需要像链式存储法那样,要存储额外的左右子节点的指针。这也是为什么完全二叉树会单独拎出来的
阅读全文
摘要:1. 遍历方式 a. 先序遍历 步骤 // 先访问根结点 访问根结点 先序访问左子树 先序访问右子树 举例 b. 中序遍历 步骤 // 中间访问根结点 中序遍历左子树 访问根结点 中序遍历右子树 举例 c. 后序遍历 步骤 // 最后访问根结点 后序遍历左子树 后序遍历右子树 访问根结点 举例 2.
阅读全文
摘要:1. 树 1.1 定义 树是 n(n>=0) 个结点的有限集,在任意一棵非空树中: 有且仅有 1 个特定的称为“根”的结点。 当 n>1 时,其余结点可分为 m 个互不相交的有限集 T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根的“子树”。 1.2 基本术语 1.3 树的分类 【一般
阅读全文
摘要:1. 线性结构存储方式分析 1.1 数组存储方式的分析 优点:通过下标方式访问元素,速度快;对于有序数组,还可使用二分查找提高检索速度 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 1.2 链表存储方式的分析 优点:在一定程度上对数组存储方式有优化 (比如:插入一个数值结
阅读全文
摘要:1. 概述 散列表(Hash table,也叫哈希表),是根据 关键码值(Key value) 而直接进行访问的数据结构。也就是说,它通过把关键码值 映射 到表中一个位置来访问记录(也就是先找是存放在哪条链表上),以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 2. 案例 有
阅读全文
摘要:1. 顺序(线性) 查找 额,没啥要说的吧。优点的话,就是待查找集合数据可以无序 2. 二分/折半查找 2.1 思路分析 确定有序数组中间元素的索引 mid = (left + right) / 2 让待查找数 findVal 和 arr[mid] 比较 findVal > arr[mid],说明待
阅读全文
摘要:1. 优先队列 许多应用程序都需要处理有序的元素,但不一定要求它们全部有序,或是不一定要一次就将它们排序。很多情况下我们会收集一些元素,处理当前键值最大的元素,然后再收集更多的元素,在处理当前键值最大的元素,如此这般 ... 在这种情况下,一个合适的数据结果应该支持两种操作:删除最大元素和插入元素。
阅读全文
摘要:1. 基本思想 归并排序(MERGE-SORT) 是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer) 策略。 "归并"思想 基于归并这个简单的操作,也就是说如果想要将一个数组排序,可以先(递归地) 将它分成两半分别排序,然后将结果归并起来,即将两个有序的数组
阅读全文
摘要:参考和引用了 白话经典算法系列之六——快速排序 的一些内容 1. 基本思想 概述 快速排序(Quicksort) 是一种分治的排序算法,它将一个数组分成两个子数组,将两部分独立地排序;排序的方式是当两个子数组都有序时整个数组也就自然有序了。 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的
阅读全文
摘要:1. 引入 插入排序存在的问题: 现在有这么一个数组,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
阅读全文
摘要:1. 基本思想 插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 把 n 个待排序的元素看成为一个〈有序表〉和一个〈无序表〉,开始时有序表中只包含一个元素,无序表中包含有 n-1 个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表
阅读全文
摘要:1. 举例说明 n 个数据,总共进行 n-1 次大的循环,得到一个按从小到大排列的有序序列: 第 1 次从 arr[0]~arr[n-1] 中选取最小值,与 arr[0] 交换 第 2 次从 arr[1]~arr[n-1] 中选取最小值,与 arr[1] 交换 第 3 次从 arr[2]~arr[n
阅读全文
摘要:1. 基本思想 从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒 每循环遍历一次,就能把这一轮见过的元素中 maxValue 放在末尾位置 // 和选择排序正好相反,选择是一轮过后,就确定一个 minVal 待排
阅读全文
摘要:排序就是将一组数据依指定的顺序进行排列的过程。 1. 时间频度 1.1 概念 一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多; 一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 举例:计算 1~100 所有数字之和 1.2 三个特点 随着 n
阅读全文
摘要:1. 迷宫回溯问题 1.1 代码实现 public class Maze { public static void main(String[] args) { int[][] map = new int[8][7]; initWall(map); setWay(map, 1, 1); for (in
阅读全文
摘要:1. 概述 递归就是方法在内部调用自己本身,和调别起的方法没区别 递归需要遵守的重要规则 执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响;但如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据 递归必须向退出递归的条件逼近,即该函数所处
阅读全文
摘要:1. 前缀表达式(波兰表达式) 前缀表达式的运算符位于操作数之前 【举例说明】 (3+4)×5-6 对应的前缀表达式 {- × + 3 4 5 6} 根据 {前缀表达式} 计算求值,从右至左扫描 {前缀表达式} 遇到数字时,将数字压入堆栈 遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(
阅读全文
摘要:1. 简述 栈(stack) 是一个先入后出(FILO-First In Last Out)的有序列表,是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。根据栈的定义可知,最先
阅读全文
摘要:1. Josephu 问题 设编号为 1,2,… n 的 n 个人围坐一圈,约定编号为 k(1<=k<=n)的人从 1 开始报数,数到 m 的那个人出列,它的下一位又从 1 开始报数,数到 m 的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列 2. 解决思路 2.1 简述 用
阅读全文
摘要:1. 思路分析 遍历:遍历和单链表一样,但可以有 2 个方向:往前和往后 添加(默认添加到链尾) 通过遍历先找到当前双向链表的尾结点 temp.next = newNode; newNode.pre = temp; 修改:原理与单链表相同 删除 因为是双向链表,故可直接找到 [待删除结点],实现自我
阅读全文
