
数据结构与算法
文章平均质量分 60
数据结构与算法笔记
寒泉Hq
当你试图解决一个你不理解的问题时,复杂化就产生了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
哈夫曼编解码(C语言)
哈夫曼编解码(C语言)示例输入:helllllllo生成码表:a:00010010b:00010011c:00010100d:00010101e:001f:00010110g:00010111h:010i:00011000j:00011001k:00011010l:1m:00011011n:00011100o:011p:00011101q:00011110r:00011111s:0000000t:0000001u:0000010v:0000011w:00原创 2021-10-28 18:34:39 · 42706 阅读 · 0 评论 -
`>>`(有符号右移) 和 `>>>`(无符号右移)的区别
JavaScript >>(有符号右移) 和 >>>(无符号右移)的区别之所以以 JS 为例,是因为Java中不支持无符号操作直接看MDN英文吧:>> (有符号右移)sign-propagating(符号位-传播)右移 我们知道,计算机中以二进制存储数字,二进制中最左边的第一位,叫符号位,所以这就很明显了,右移2位后,最左边缺少2位数字,那就应该填充数字,那填充什么呢?符号位是什么,我就填什么,所以 -9 >> 2 中最左边2位和符号位一样,都原创 2021-01-31 19:41:40 · 62829 阅读 · 0 评论 -
Java位操作:如何将long类型的指定位设置为0或1?How to set/unset a bit at specific position of a long?
Java位操作:如何将long类型的指定位设置为0或1?How to set/unset a bit at specific position of a long?To set a bit, use:x |= 0b1; // set LSB bitx |= 0b10; // set 2nd bit from LSBto erase a bit use:x &= ~0b1; // unset LSB bit (if set)x &= ~0b10; // unset 2nd bi原创 2021-01-31 12:59:13 · 68566 阅读 · 0 评论 -
leetcode 371. 两整数之和(不用算术运算符实现两个数的加法:按位异或原理)
题目https://leetcode-cn.com/problems/sum-of-two-integers/题解按位异或:相同为0,不同为1对于二进制的加法运算,若不考虑进位,则 1+1=0, 1+0=1, 0+1=1, 0+0=0,通过对比异或,不难发现,此方法与异或运算类似。因而排除进位的情况下,加法可用异或来实现。然后考虑进位,0+0 进位为 0,1+0 进位为 1,0+1 进位为0,1+1 进位为1,该操作与位运算的 & 操作相似。那么加法运算可以这样实现:先不考虑进位原创 2021-01-01 20:13:52 · 67930 阅读 · 0 评论 -
左神算法:判断二叉树是否为平衡二叉树(树形dp套路,Java版)
本题来自左神《程序员代码面试指南》“判断二叉树是否为平衡二叉树”题目。题目平衡二叉树的性质为:要么是一棵空树,要么任何一个节点的左右子树高度差的绝对值不超过 1。给定一棵二叉树的头节点 head,判断这棵二叉树是否为平衡二叉树。要求:如果二叉树的节点数为 N,则要求时间复杂度为 O(N)。题解平衡二叉树的标准是:对任何子树来说,左子树和右子树的高度差都不超过1。本题解法的整体过程为 树形 dp 套路,请读者先阅读 “找到二叉树中的最大搜索二叉子树” 问题了解这个套路,本题是这个套路的再次展.原创 2020-12-30 23:53:26 · 67234 阅读 · 0 评论 -
左神算法:判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树(Java版)
本题来自左神《程序员代码面试指南》“判断 t1 树中是否有与 t2 树拓扑结构完全相同的子树”题目。题目给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 中是否有与 t2 树拓扑结构完全相同的子树。例如,如图3-36 所示的 t1 树和如图 3-37 所示的 t2 树。题解如果 t1 的节点数为 N,t2 的节点数为 M,则本题最优解是时间复杂度为O(N+M)的方法。首先简单介绍一个时间复杂度为O(N×M)的方法:对于 t1 的每棵子树,都去判断是否与 t2 树的拓扑结构完.原创 2020-12-28 09:30:12 · 66274 阅读 · 0 评论 -
左神算法:判断 t1 树是否包含t2 树全部的拓扑结构(剑指 Offer 26. 树的子结构,Java版)
本题来自左神《程序员代码面试指南》“判断 t1 树是否包含t2 树全部的拓扑结构”题目。题目剑指 Offer 26. 树的子结构给定彼此独立的两棵树头节点分别为 t1 和 t2,判断 t1 树是否包含 t2 树全部的拓扑结构。例如,如图 3-34 所示的 t1 树和如图 3-35 所示的 t2 树。题解思路如下。如果 t1 中某棵子树头节点的值与 t2 头节点的值一样,则从这两个头节点开始匹配。匹配的每一步,都让 t1 上的节点跟着 t2 上的节点的先序遍历移动,每移动一步,都检查 t.原创 2020-12-25 16:19:06 · 69450 阅读 · 0 评论 -
左神算法:调整搜索二叉树中两个错误的节点(Java版)
本题来自左神《程序员代码面试指南》“调整搜索二叉树中两个错误的节点”题目。原问题:一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回。已知二叉树中所有节点的值都不一样,给定二叉树的头节点 head,返回一个长度为 2 的二叉树节点类型的数组 errs,errs[0] 表示一个错误节点,errs[1] 表示另一个错误节点。进阶问题:如果在原问题中得到了这两个错误节点,我们当然可以通过交换两个节点的节点值的方式让整棵二叉树原创 2020-12-22 18:23:46 · 68268 阅读 · 1 评论 -
左神算法:二叉树的按层打印与ZigZag打印(Java版)
本题来自左神《程序员代码面试指南》“二叉树的按层打印与ZigZag打印”题目。题目给定一棵二叉树的头节点 head,分别实现 按层 和 ZigZag 打印 二叉树的函数。例如,二叉树如图 3-29 所示。按层打印时,输出格式必须如下:Level 1 : 1Level 2 : 2 3Level 3 : 4 5 6Level 4 : 7 8ZigZag 打印时,输出格式必须如下:Level 1 from left to right: 1Level 2 from right to l.原创 2020-12-21 00:20:43 · 69333 阅读 · 2 评论 -
leetcode 237. 删除链表中的节点(左神算法:一种怪异的节点删除方式、此方法存在的问题分析)
题目题解一种怪异的节点删除方式本题的思路很简单,举例就能说明具体的做法。例如,链表1->2->3->null,只知道要删除节点2,而不知道头节点。那么只需把节点2 的值变成节点3 的值,然后在链表中删除节点3 即可。这道题目出现的次数很多,这么做看起来非常方便,但 其实是有很大问题的。存在的问题一这样的删除方式 无法删除最后一个节点。还是以原示例来说明,如果知道要删除节点3,而不知道头节点。但它是最后的节点,根本没有下一个节点来代替节点3 被删除,那么只有让节点2 的ne原创 2020-12-20 18:50:16 · 68180 阅读 · 0 评论 -
leetcode 235. 二叉搜索树的最近公共祖先(Java版,树形dp套路)
题目原题地址:leetcode 235. 二叉搜索树的最近公共祖先说明:所有节点的值都是唯一的。p、q 为不同节点且均存在于给定的二叉搜索树中。题解关于 树形dp 套路,可以参考我的另一篇博客:左神算法:找到二叉树中的最大搜索二叉子树(Java版)下面简述本题思路:首先,如何判断一个节点 head 是否是 p、q 的公共祖先?只需要用二分查找的方式,判断以 head 为头的树中是否包含 p、q 即可。然后,如何找到“最近”的公共祖先?直观上看,最近的公共祖先,一定是所有的公共祖先中原创 2020-12-20 00:05:34 · 68413 阅读 · 4 评论 -
左神算法:找到二叉树中符合搜索二叉树条件的最大拓扑结构(Java版)
本题来自左神《程序员代码面试指南》“找到二叉树中符合搜索二叉树条件的最大拓扑结构”题目。题目牛客OJ:找到二叉树中符合搜索二叉树条件的最大拓扑结构给定一棵二叉树的头节点head,已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小。例如,二叉树如图 3-19 所示。其中最大的且符合搜索二叉树条件的拓扑结构如图3-20 所示。这个拓扑结构节点数为8,所以返回8。题解方法一:二叉树的节点数为N,时间复杂度为O(N^2)的方法。首先来看这样一个问题,以节点 h.原创 2020-12-18 21:30:11 · 69029 阅读 · 4 评论 -
左神算法:找到二叉树中的最大搜索二叉子树(树形dp套路,Java版)
本题来自左神《程序员代码面试指南》“找到二叉树中的最大搜索二叉子树”题目。题目给定一棵二叉树的头节点 head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这棵子树的头节点。例如,二叉树如图 3-17 所示。这棵树中的最大搜索二叉子树如图 3-18 所示。要求:如果节点数为 N,则要求时间复杂度为 O(N),额外空间复杂度为 O(h),其中,h 为二叉树的高度。题解本题涉及二叉树面试题中一个很常见的套路,也是全书的一个重要内容。利用分析可能性求解在二叉树上做类似动.原创 2020-12-18 12:46:42 · 69999 阅读 · 0 评论 -
左神算法:未排序正数数组中累加和为给定值的最长子数组长度(Java版)
牛客OJ:[未排序数组中累加和为给定值的最长子数组长度] 题目:给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度。本文提供的方法可以做到时间复杂度为O(N)、额外空间复杂度为O(N)。题解:为了说明解法,先定义s 的概念,s(i)代表子数组arr[0..i]所有元素的累加和。那么子数组arr[j..i(] 0≤j≤i<arr.length)的累加和为s(i)-s(j-1),因为根据定义,原创 2020-12-18 00:16:55 · 69103 阅读 · 0 评论 -
左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)
本题来自左神《程序员代码面试指南》“在二叉树中找到累加和为指定值的最长路径长度”题目。题目给定一棵二叉树的头节点 head 和一个 32 位整数 sum,二叉树节点值类型为整型,求累加和为 sum 的最长路径长度。“路径” 是指从某个节点往下,每次最多选择一个孩子节点或者不选所形成的节点链。例如,二叉树如图 3-16 所示。如果 sum=6,那么累加和为 6 的最长路径为:-3,3,0,6,所以返回 4。如果 sum=-9,那么累加和为 -9 的最长路径为:-9,所以返回 1。注:本题不用考.原创 2020-12-17 19:16:31 · 68072 阅读 · 2 评论 -
左神算法:遍历二叉树的神级方法(Morris遍历 / 线索二叉树)
本题来自左神《程序员代码面试指南》“遍历二叉树的神级方法”题目。题目给定一棵二叉树的头节点 head,完成二叉树的先序、中序和后序遍历。如果二叉树的节点数为N,则要求时间复杂度为O(N),额外空间复杂度为O(1)。题解之前的题目已经剖析过如何用递归和非递归的方法实现遍历二叉树,但是很不幸,之前所有的方法虽然常用,但都无法做到额外空间复杂度为O(1)。这是因为遍历二叉树的递归方法实际使用了函数栈,非递归的方法使用了申请的栈,两者的额外空间都与树的高度相关,所以空间复杂度为O(h),h为二叉树的高度.原创 2020-12-16 20:27:16 · 69744 阅读 · 0 评论 -
左神算法:二叉树的序列化和反序列化(Java版)
本题来自左神《程序员代码面试指南》“二叉树的序列化和反序列化”题目。题目二叉树被记录成文件的过程叫作二叉树的序列化,通过文件内容重建原来二叉树的过程叫作二叉树的反序列化。给定一棵二叉树的头节点head,已知二叉树节点值的类型为32 位整型。请设计一种二叉树序列化和反序列化的方案,并用代码实现。题解本文提供两套序列化和反序列化的实现,供读者参考。方法一:通过先序遍历实现序列化和反序列化。先介绍先序遍历下的序列化过程,首先假设序列化的结果字符串为str,初始时str=""。先序遍历二叉树,如果遇.原创 2020-12-15 10:12:58 · 68655 阅读 · 0 评论 -
左神算法:如何较为直观地打印二叉树(Java版)
本题来自左神《程序员代码面试指南》“如何较为直观地打印二叉树”题目。题目二叉树可以用常规的三种遍历结果来描述其结构,但是不够直观,尤其是二叉树中有重复值的时候,仅通过三种遍历的结果来构造二叉树的真实结构更是难上加难,有时则根本不可能。给定一棵二叉树的头节点head,已知二叉树节点值的类型为32 位整型,请实现一个打印二叉树的函数,可以直观地展示树的形状,也便于画出真实的结构。题解这是一道较开放的题目,实现者不仅要设计出符合要求且不会产生歧义的打印方式,还要考虑实现难度,在面试时仅仅写出思路必然.原创 2020-12-13 22:38:45 · 70330 阅读 · 1 评论 -
左神算法:二叉树的最大 / 最小深度(普通+Morris遍历进阶)(Java版)
二叉树的最小深度题目https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/二叉树定义如下:// Definition for a binary tree node.class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}普通版题解时间复杂度O(n原创 2020-12-13 00:30:24 · 65711 阅读 · 3 评论 -
左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
本题来自左神《程序员代码面试指南》“分别用递归和非递归方式实现二叉树先序、中序和后序遍历”题目。题目用递归和非递归方式,分别按照二叉树先序、中序和后序打印所有的节点。我们约定:先序遍历顺序为根、左、右;中序遍历顺序为左、根、右;后序遍历顺序为左、右、根。二叉树节点定义如下:public static class Node { public int value; public Node left; public Node right; public Node(int data.原创 2020-12-11 22:41:22 · 68512 阅读 · 5 评论 -
leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)
题目leetcode 64. 最小路径和提示:m == grid.lengthn == grid[i].length1 <= m, n <= 2000 <= grid[i][j] <= 100题解方法一:递归解法(超时)right 表示当前向已右走的步数,down 表示当前已向下走的步数,cur 表示当前走过的路径和。此方法超时,应该使用 (方法二)动态规划解法。public static int minPathSum1(int[][] grid) {原创 2020-12-10 23:55:10 · 67138 阅读 · 7 评论 -
左神算法:将搜索二叉树转换成双向链表(Java版)
题目对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针;对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针。在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将其转换为一个有序的双向链表。例如,节点定义为:public static class Node { public int value; public Node left; public Node right; public Node(int data) { this.value = d.原创 2020-12-10 18:28:26 · 64672 阅读 · 4 评论 -
左神算法:将单链表的每K个节点之间逆序(Java版)
本题来自左神《程序员代码面试指南》“将单链表的每K个节点之间逆序”题目。题目给定一个单链表的头节点head,实现一个调整单链表的函数,使得每K 个节点之间逆序,如果最后不够K 个节点一组,则不调整最后几个节点。例如:链表:1->2->3->4->5->6->7->8->null,K=3。调整后为:3->2->1->6->5->4->7->8->null。其中7、8 不调整,因为不够一组。题解首先.原创 2020-12-10 00:07:10 · 68740 阅读 · 1 评论 -
leetcode 581. 最短无序连续子数组(详解普通 / 进阶 / 单调栈解法,Java版)
题目题解方法1(暴力排序):时间复杂度O(nlogn),空间复杂度O(n)一个简单的想法是:将数组 nums 进行排序,记为 nums_sorted 。然后比较 nums 和 nums_sorted 的元素来决定最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组。public int findUnsortedSubarray(int[] nums) { int[] snums = nums.clone(); Arrays.sort(snums); int原创 2020-12-09 16:28:59 · 68009 阅读 · 3 评论 -
左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)
本题来自左神《程序员代码面试指南》“两个单链表相交的一系列问题”题目。题目在本题中,单链表可能有环,也可能无环。给定两个单链表的头节点 head1 和 head2,这两个链表可能相交,也可能不相交。请实现一个函数,如果两个链表相交,请返回相交的第一个节点;如果不相交,返回 null 即可。要求:如果链表 1 的长度为 N,链表 2 的长度为 M,时间复杂度请达到 O(N+M),额外空间复杂度请达到 O(1)。题解本题可以拆分成 三个子问题,每个问题都可以作为一道独立的算法题,具体如下。问题.原创 2020-12-09 10:51:58 · 69190 阅读 · 0 评论 -
左神算法:复制含有随机指针节点的链表 / 复杂链表的复制(Java版本)
本题来自左神《程序员代码面试指南》“复制含有随机指针节点的链表”题目。题目一种特殊的链表节点类描述如下:public static class Node { public int value; public Node next; public Node rand; public Node(int data) { this.value = data; } }Node 类中的value 是节点值,next 指针和正常单链表中next 指针的意义一样,都指向下一个节点,.原创 2020-12-08 20:41:38 · 66738 阅读 · 2 评论 -
左神算法:反转单向和双向链表(Java版)
本题来自左神《程序员面试代码指南》“反转单向和双向链表”题目。题目分别实现反转单向链表和反转双向链表的函数。如果链表长度为N,时间复杂度要求为O(N),额外空间复杂度要求为O(1)。题解本题比较简单,读者做到代码一次完成,运行不出错即可。反转单向链表的函数如下(该函数返回反转之后链表新的头节点)反转双向链表的函数如下(函数返回反转之后链表新的头节点)package chapter_2_listproblem;public class Problem_04_ReverseList.原创 2020-12-08 12:51:40 · 69078 阅读 · 0 评论 -
左神算法:环形单链表的约瑟夫问题(Java版)
本题来自左神《程序员面试代码指南》“环形单链表的约瑟夫问题”题目。题目据说,著名犹太历史学家 Josephus 有过以下故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus 及他的朋友躲到一个洞中,39 个犹太人决定宁愿死也不要被敌人抓到,于是决定了一种自杀方式,41 个人排成一个圆圈,由第 1 个人开始报数,报数到 3 的人就自杀,然后再由下一个人重新报 1,报数到 3 的人再自杀,这样依次下去,直到剩下最后一个人时,那个人可以自由选择自己的命运。这就是著名的约瑟夫问题。现在请用单向环.原创 2020-12-07 23:51:17 · 64959 阅读 · 2 评论 -
左神算法:可见的山峰对数量(有重复值的情况)(Java版)
本题来自左神《程序员面试代码指南》“可见的山峰对数量”题目。题目牛客在线OJ:可见的山峰对数量(进阶)一个不含有负数的数组可以代表一圈环形山,每个位置的值代表山的高度。比如,{3,1,2,4,5},{4,5,3,1,2}或{1,2,4,5,3}都代表同样结构的环形山。3->1->2->4->5->3 方向叫作 next 方向(逆时针)3->5->4->2->1->3 方向叫作 last 方向(顺时针)山峰 A 和 山峰 B 能够.原创 2020-12-05 13:53:18 · 67230 阅读 · 2 评论 -
左神算法:最大值减去最小值小于或等于num的子数组的数量(Java版)
本题来自左神《程序员面试代码指南》“最大值减去最小值小于或等于num的子数组的数量”题目。题目给定数组 arr 和整数 num,共返回有多少个子数组满足如下情况:max(arr[i…j]) - min(arr[i…j]) <= nummax(arr[i…j])表示子数组arr[i…j]中的最大值,min[arr[i…j])表示子数组arr[i…j]中的最小值。示例输入第一行输入两个数 n 和 num,其中 n 表示数组 arr 的长度第二行输入n个整数X_i,表示数组arr中的每个.原创 2020-12-05 01:21:26 · 68623 阅读 · 0 评论 -
左神算法:求最大子矩阵的大小(Java版)
本题来自左神《程序员面试代码指南》“求最大子矩阵的大小”题目。题目给定一个整型矩阵 map,其中的值只有0和1两种,求其中全是1的所有矩形区域中,最大的矩形区域为1的数量。 例如:1 0 1 11 1 1 11 1 1 0 其中,最大的矩形区域有 6 个 1,所以返回 6。题解本题利用 单调栈 的思想。关于单调栈,前面我们讲过。可以参考这篇博客 左神算法:单调栈结构(Java版)过程草稿图:代码import java.util.Stack;public c.原创 2020-12-04 18:26:16 · 63970 阅读 · 1 评论 -
左神算法:单调栈结构(Java版)
本题来自左神《程序员面试代码指南》“单调栈结构”题目。题目给定一个不含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。举例输入:arr = {3, 4, 1, 5, 6, 2, 7}返回如下二维数组作为结果:{ {-1, 2}, // -1表示不存在,整体含义为:arr[0]左边离arr[0]最近且比arr[0]小的是arr[-1], // arr[0]右边离arr[0]最近且.原创 2020-12-04 01:17:11 · 67907 阅读 · 2 评论 -
左神算法:生成窗口最大值数组(Java版)
本题来自左神《程序员面试代码指南》“生成窗口最大值数组”题目。题目有一个整型数组 arr 和一个大小为 w 的窗口从数组的最左边滑到最右边,窗口每次向右边滑一个位置。例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时: 窗口数组 最大值 [4 3 5] 4 3 3 6 7 5 4 [3 5 4] 3 3 6 7 5 .原创 2020-12-03 11:26:41 · 69599 阅读 · 0 评论 -
左神算法:用栈来求解限制后的汉诺塔问题(Java版)
本题来自左神《程序员面试代码指南》“用栈来求解汉诺塔问题”题目。题目限制后的汉诺塔问题如下:限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间求当塔有N层的时候,打印最优移动过程和最优移动总步数题解用以下两种方法解决:方法1:递归方法。本文只提供代码,具体的问题解析请参考原书。方法2:非递归,用栈来模拟汉诺塔的三个塔。本文详细说明此方法。代码为了便于理解,本文对 解法 2 做了详细的注释。import java.util.Stack;.原创 2020-12-02 22:30:20 · 67570 阅读 · 0 评论 -
左神算法:用一个栈实现另一个栈的排序(Java版)
本题源自左神《程序员面试代码指南》“用一个栈实现另一个栈的排序”题目。题目在一个栈中元素的类型为整型,现在想将该栈从栈顶到栈底按从大到小的顺序排序,只许申请一个栈,除此之外,可以申请其他变量,但是不能申请额外的数据结构。解答将待排序的栈记为 stack, 辅助栈记为 help。 在 stack 上执行 pop 操作,弹出的元素记为 cur。如果 cur 小于等于 help 的栈顶元素,则将 cur 直接压入 help如果 cur 大于 help 的栈顶元素,则将 help 的元素逐一弹出,.原创 2020-12-02 00:23:38 · 65171 阅读 · 1 评论 -
左神算法:猫狗队列(通过给不同实例盖时间戳的方法实现)
本题来自左神《程序员面试代码指南》“猫狗队列”题目。题目宠物、狗和猫的类如下:public class Pet { private String type; public Pet(String type){ this.type = type; } public String getPetType(){ return this.type; } public class Dog extends Pet{ .原创 2020-12-02 00:03:52 · 68452 阅读 · 1 评论 -
左神算法:用递归函数和栈逆序一个栈(Java版)
题目描述一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。题解题源:《程序员代码面试指南》import java.util.Scanner;import java.util.Stack;public class Main { public static void main(String[] args) { // 输入原创 2020-12-01 00:50:20 · 64161 阅读 · 3 评论 -
数据结构:严蔚敏、殷人昆快速排序规则不同的疑问
严蔚敏和殷人昆给出了两种不同的快排方法。虽然两种方法均正确,但排序中间步骤得到的序列不同,导致做题时对答案产生疑惑。本文对这两种快排算法进行总结与对比。Partition 过程:将要排序的数据分成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。快速排序整个排序过程可以递归进行,以此达到整个数据变成有序序列。原创 2020-11-11 21:23:17 · 68709 阅读 · 2 评论 -
数据结构:二叉查找树 BST 平均查找长度 ASL 的计算
平均查找长度ASL(Average Search Length),即平均查找长度,在查找运算中,由于所费时间在关键字的比较上,所以把平均需要和待查找值比较的关键字次数称为平均查找长度。它的定义是这样的:其中n为查找表中元素个数,Pi为查找第i个元素的概率,通常假设每个元素查找概率相同,Pi=1/n,Ci是找到第i个元素的比较次数。顺序查找平均查找长度的计算在顺序查找(Sequence Search)表中,查找方式为从头扫到尾,找到待查找元素即查找成功,若到尾部没有找到,说明查找失败。所以说,Ci原创 2020-11-09 09:54:54 · 88954 阅读 · 0 评论 -
数据结构:链式基数排序,通俗易懂!
思想每一轮将多个数按由低位到高位的顺序,依次放入 多个 链表(桶)中。输出时,将链表(桶)的数据依次合并到 一个 新的链表中。例子下面演示使用 链式基数排序,进行每一趟的“分配”与“收集”过程。第一趟第二趟第三趟...原创 2020-11-07 10:32:52 · 72573 阅读 · 2 评论