展开
拓展 关闭
订阅号推广码
GitHub
视频
公告栏 关闭

随笔分类 -  算法与设计 / 数据结构与算法

摘要:简介 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。 这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… # 解决的问题 二分搜索 大整数乘法 棋盘覆盖 阅读全文
posted @ 2022-09-27 15:00 DogLeftover 阅读(21) 评论(0) 推荐(0) 编辑
摘要:简介 二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要查找7次( 2^6 < 100 < 2^7) 代码实现 public class Binary 阅读全文
posted @ 2022-09-27 14:55 DogLeftover 阅读(32) 评论(0) 推荐(0) 编辑
摘要:简介 图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点 无向图: 顶点之间的连接没有方向,比如A-B, 即可以是 A-> B 也可以 B->A 路径: 比如从 D -> C 的路径有 1) D->B->C 2) D->A->B->C 有向图 带权图 阅读全文
posted @ 2022-09-27 13:11 DogLeftover 阅读(387) 评论(0) 推荐(0) 编辑
摘要:二叉树存在的问题 二叉树需要加载到内存的,如果二叉树的节点少,没有什么问题,但是如果二叉树的节点很多(比如1亿) 问题1:在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),节点海量,构建二叉树时,速度有影响 问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度 多叉树 在二 阅读全文
posted @ 2022-09-27 11:28 DogLeftover 阅读(21) 评论(0) 推荐(0) 编辑
摘要:二叉排序树所存在的问题 一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST) 左子树全部为空,从形式上看,更像一个单链表. 插入速度没有影响 查询速度明显降低(因为需要依次比较), 不能发挥BST 的优势,因为每次还需要比较左子树,其查询速度比 单链表还慢 解决方案-平衡二叉树(AV 阅读全文
posted @ 2022-09-27 10:16 DogLeftover 阅读(24) 评论(0) 推荐(0) 编辑
摘要:分3种情况 代码实现 public class BinarySortTreeDemo { public static void main(String[] args) { int[] arr = {7, 3, 10, 12, 5, 1, 9, 2}; BinarySortTree binarySor 阅读全文
posted @ 2022-09-26 17:41 DogLeftover 阅读(46) 评论(0) 推荐(0) 编辑
摘要:应用实例 一个数列 (7, 3, 10, 12, 5, 1, 9),要求能够高效的完成对数据的查询和添加 数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢. 数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到插入位置后,后面的数据需整体移动,速 阅读全文
posted @ 2022-09-26 17:11 DogLeftover 阅读(26) 评论(0) 推荐(0) 编辑
摘要:应用实例 代码实现,转为赫夫曼树 public class HuffmanCode { public static void main(String[] args) { String content = "i like like like java do you like a java"; byte 阅读全文
posted @ 2022-09-26 15:11 DogLeftover 阅读(58) 评论(0) 推荐(0) 编辑
摘要:定长编码 变长编码 统计不同字符出现的次数 字符所对应的编码 以上的编码在解码时,会存在多义性,所以不是前缀编码 赫夫曼编码 注意点 阅读全文
posted @ 2022-09-26 13:57 DogLeftover 阅读(15) 评论(0) 推荐(0) 编辑
摘要:简介 给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。 赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近 路径和路径长度:在一棵树中,从一个结点往下可以达到的 阅读全文
posted @ 2022-09-26 11:51 DogLeftover 阅读(65) 评论(0) 推荐(0) 编辑
摘要:简介 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。 每个 阅读全文
posted @ 2022-09-26 11:07 DogLeftover 阅读(42) 评论(0) 推荐(0) 编辑
摘要:将数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 问题分析 当我们对上面的二叉树进行中序遍历时,数列为 {8, 3, 10, 1, 6, 14 } 但是 6, 8, 10, 14 这几个节点的左右指针,并没有完全的利用上. 如果我们希望充分的利用各个节点的左右指针,让各个节点可以 阅读全文
posted @ 2022-09-25 22:59 DogLeftover 阅读(29) 评论(0) 推荐(0) 编辑
摘要:简介 从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组 特点 顺序二叉树通常只考虑完全二叉树 第n个元素的左子节点为 2 * n + 1 第n个元素的右子节点为 2 * n + 2 第n个元素的父节点为 (n-1) / 2 应用实例 遍历数组 arr时, 阅读全文
posted @ 2022-09-25 22:33 DogLeftover 阅读(22) 评论(0) 推荐(0) 编辑
摘要:应用实例 代码实现 public class BinaryTreeDemo { public static void main(String[] args) { //先需要创建一颗二叉树 BinaryTree binaryTree = new BinaryTree(); //创建需要的结点 Hero 阅读全文
posted @ 2022-09-25 14:58 DogLeftover 阅读(17) 评论(0) 推荐(0) 编辑
摘要:数组存储方式的分析 优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度。 缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低 链式存储方式的分析 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删 阅读全文
posted @ 2022-09-25 14:00 DogLeftover 阅读(41) 评论(0) 推荐(0) 编辑
摘要:简介 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。 这个映射函数叫做散列函数,存放记录的数组叫做散列表 应用实例 有一个公司,当有新的员工来报道时,要求将该员工的信 阅读全文
posted @ 2022-09-25 10:55 DogLeftover 阅读(25) 评论(0) 推荐(0) 编辑
摘要:斐波那契也称黄金分割法,通过黄金分割点找到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 。 该式说明:只要顺序表 阅读全文
posted @ 2022-09-25 09:08 DogLeftover 阅读(69) 评论(0) 推荐(0) 编辑
摘要:简介 插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找。 将折半查找中的求mid 索引的公式 , low 表示左边索引left, high表示右边索引right. key 就是前面我们讲的 findVal int mid = low + (high - low) * (key 阅读全文
posted @ 2022-09-24 22:58 DogLeftover 阅读(21) 评论(0) 推荐(0) 编辑
摘要:简介 只能对有序数组进行查找 代码实现 public class BinarySearch { public static void main(String[] args) { // 查找单个数据 int arr[] = { 1, 8, 10, 89, 1000, 1234 }; int resIn 阅读全文
posted @ 2022-09-24 22:26 DogLeftover 阅读(19) 评论(0) 推荐(0) 编辑
摘要:排序算法时间复杂度比较 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面; 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面; 内排序:所有排序操作都在内存中完成; 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行; 时间复杂度:  阅读全文
posted @ 2022-09-24 20:13 DogLeftover 阅读(56) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示