数据结构与算法
文章平均质量分 86
数据结构与算法
hellosc01
喂,你知道吗,有时候,自由意志就是你能主动选择最小概率的路。
展开
-
Leetcode_数学、位运算
目录汉明距离1 题目描述2 解题(Java)2.1 方法一:异或 + 无符号右移2.2 方法二:z = z & (z−1)3 复杂性分析比特位计数1 题目描述2 解题(Java)3 复杂性分析只出现一次的数字1 题目描述2 解题(Java)3 复杂性分析不用加减乘除做加法1 题目描述2 解题(Java)2.1 解题思路2.2 代码3 复杂性分析二进制中1的个数1 题目描述2 解题(Java)3 复杂性分析数值的整数次方1 题目描述2 解题(Java)2.1 解题思路2.1.1 快速幂解析(二进制角度原创 2021-08-20 19:21:37 · 634 阅读 · 1 评论 -
Leetcode_双指针、滑动窗口
目录找到字符串中所有字母异位词1 题目描述2 解题(Java)3 复杂性分析移动零1 题目描述2 解题(Java)3 复杂性分析滑动窗口的最大值1 题目描述2 解题(Java)2.1 解题思路2.2 算法流程2.3 代码3 复杂性分析和为s的连续正数序列1 题目描述2 解题(Java)2.1 解题思路2.2 算法流程2.3 代码3 复杂性分析最小覆盖子串1 题目描述2 解题(Java)3 复杂性分析调整数组顺序使奇数位于偶数前面1 题目描述2 解题(Java)3 复杂性分析和为s的两个数字1 题目描述2 解原创 2021-08-20 17:57:02 · 628 阅读 · 1 评论 -
Leetcode_排序
目录数组中重复的数字1 题目要求2 解题(Java)2.1 解题思路2.2 代码3 复杂度分析根据身高重建队列1 题目描述2 解题(Java)3 复杂性分析移动零1 题目描述2 解题(Java)3 复杂性分析数组中的第K个最大元素1 题目描述2 解题(Java)3 复杂性分析下一个排列1 题目描述2 解题(Java)3 复杂性分析合并区间1 题目描述2 解题(Java)3 复杂性分析二维数组中的查找1 题目描述2 解题(Java)3 复杂性分析数组中的逆序对1 题目描述2 解题(Java)3 复杂性分析把数原创 2021-08-20 15:16:05 · 261 阅读 · 1 评论 -
LeetCode_Database
1 大的国家问题描述+-----------------+------------+------------+--------------+---------------+| name | continent | area | population | gdp |+-----------------+------------+------------+--------------+---------------+| Afghanistan原创 2021-01-02 20:49:45 · 5654 阅读 · 1 评论 -
Leetcode_分治算法
目录合并K个升序链表1 题目描述2 解题(Java)3 复杂性分析表达式求值1 题目描述2 解题(Java)3 复杂性分析排序链表1 题目描述2 解题(Java)3 复杂性分析合并K个升序链表1 题目描述给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3-&原创 2021-08-20 13:28:24 · 231 阅读 · 0 评论 -
Leetcode_栈、队列
目录每日温度1 题目描述2 解题(Java)3 复杂性分析字符串解码1 题目描述2 解题(Java)2.1 解法一:栈2.2 解法二:递归最大矩形1 题目描述2 解题(Java)3 复杂性分析滑动窗口的最大值1 题目描述2 解题(Java)2.1 解题思路2.2 算法流程2.3 代码3 复杂性分析字符串变形1 题目描述2 解题(Java)3 复杂性分析表达式求值1 题目描述2 解题(Java)3 复杂性分析基本计算器1 题目描述2 解题(Java)3 复杂性分析从尾到头打印链表1 题目描述2 解题(Java原创 2021-08-20 12:28:26 · 212 阅读 · 0 评论 -
LeetCode_多线程
目录哲学家进餐1 题目描述2 解题(Java)交替打印字符串1 题目描述2 解题(Java)H2O 生成1 题目描述2 解题(Java)打印零与奇偶数1 题目描述2 解题(Java)交替打印FooBar1 题目描述2 解题(Java)按序打印1 题目描述2 解题(Java)2.1 解法1:共享变量2.2 解法2:信号量哲学家进餐1 题目描述5 个沉默寡言的哲学家围坐在圆桌前,每人面前一盘意面。叉子放在哲学家之间的桌面上。(5 个哲学家,5 根叉子)所有的哲学家都只会在思考和进餐两种行为间交替。哲学家原创 2021-08-20 10:51:19 · 414 阅读 · 0 评论 -
Leetcode_DFS、BFS
目录目标和1 题目描述2 解题(Java)3 复杂性分析路径总和 III1 题目描述2 解题(Java)3 复杂性分析目标和1 题目描述给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数原创 2021-08-19 22:58:22 · 490 阅读 · 0 评论 -
Leetcode_链表
目录1 寻找重复数1 题目描述2 解题(Java)3 复杂性分析2 回文链表1 题目描述2 解题(Java)3 复杂性分析1 寻找重复数1 题目描述给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有一个重复的整数 ,找出 这个重复的数 。你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。示例 1:输入:nums = [1,3,4,2,2]输出:2示例 2:原创 2021-08-19 11:10:16 · 256 阅读 · 0 评论 -
Leetcode_Map、Set
目录和为K的子数组1 题目描述2 解题(Java)3 复杂性分析目标和1 题目描述2 解题(Java)3 复杂性分析前 K 个高频元素1 题目描述2 解题(Java)3 复杂性分析最长连续序列1 题目描述2 解题(Java)3 复杂性分析扑克牌中的顺子1 题目描述2 解题(Java)3 复杂性分析最小覆盖子串1 题目描述2 解题(Java)3 复杂性分析字母异位词分组1 题目描述2 解题(Java)3 复杂性分析两数之和1 题目描述2 解题(Java)3 复杂度分析复杂链表的复制1 题目描述2 解题(jav原创 2021-08-17 15:24:52 · 289 阅读 · 0 评论 -
Leetcode_模拟
目录左旋转字符串1 题目描述2 解题(Java)2.1 解题思路2.2 代码3 复杂性分析LRU 缓存机制1 题目描述2 解题(Java)旋转图像1 题目描述2 解题(Java)3 复杂性分析顺时针打印矩阵1 题目描述2 解题(Java)3 复杂性分析两数相加1 题目描述2 解题(Java)2.1 思路2.2 代码3 复杂性分析栈的压入、弹出序列1 题目描述2 解题(Java)3 复杂性分析替换空格1 题目描述2 解题(Java)3 复杂性分析设计LRU缓存结构1 题目描述2 解题(Java)左旋转字符串原创 2021-08-17 13:40:24 · 398 阅读 · 0 评论 -
Leetcode_并查集
目录朋友圈1 题目描述2 解题(Java)3 复杂性分析朋友圈1 题目描述一个班上有 n 个同学,其中一些彼此是朋友,另一些不是。朋友关系是可以传递的,如果 a 与 b 直接是朋友,且 b 与 c 是直接朋友,那么 a 与 c 就是间接朋友。定义 朋友圈 就是一组直接或者间接朋友的同学集合。给定一个 n x n 的矩阵 isConnected 表示班上的朋友关系,其中 isConnected[i][j] = 1 表示第 i 个同学和第 j 个同学是直接朋友,而 isConnected[i][j]原创 2021-08-17 10:40:26 · 383 阅读 · 0 评论 -
Leetcode_二分法
排序链表1 题目描述给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(nlogn) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?示例 1:输入:head = [4,2,1,3]输出:[1,2,3,4]示例 2:输入:head = [-1,5,3,4,0]输出:[-1,0,3,4,5]示例 3:输入:head = []输出:[]提示:链表中节点的数目在范围 [0, 5 * 10 ^ 4] 内-10 ^ 5原创 2021-08-16 22:56:49 · 436 阅读 · 0 评论 -
Leetcode_树、堆
目录合并二叉树1 题目描述2 解题(Java)3 复杂性分析二叉树的直径1 题目描述2 解题(Java)3 复杂性分析把二叉搜索树转换为累加树1 题目描述2 解题Java3 复杂性分析路径总和 III1 题目描述2 解题(Java)3 复杂性分析前 K 个高频元素1 题目描述2 解题(Java)3 复杂性分析打家劫舍 III1 题目描述2 解题(Java)3 复杂性分析实现 Trie1 题目描述2 解题(Java)3 复杂性分析二叉树中的最大路径和1 题目描述2 解题(Java)3 复杂性分析二叉树展开为链原创 2021-08-16 11:05:31 · 230 阅读 · 0 评论 -
Leetcode_动态规划、迭代
目录回文子串1 题目描述2 解题(Java)2.1 动态规划法2.2 中心扩展法最短无序连续子数组1 题目描述2 解题(Java)3 复杂性分析分割等和子集1 题目描述2 解题(Java)2.1 解题思路:动态规划2.2 Java代码3 复杂性分析比特位计数1 题目描述2 解题(Java)3 复杂性分析打家劫舍 III1 题目描述2 解题(Java)3 复杂性分析零钱兑换1 题目描述2 解题(Java)3 复杂性分析戳气球1 题目描述2 解题(Java)3 复杂性分析最佳买卖股票时机含冷冻期1 题目描述2原创 2021-08-15 13:24:29 · 602 阅读 · 2 评论 -
计数排序(Java)
目录1 简介2 代码实现3 复杂性分析1 简介计数排序统计小于等于该元素值的元素的个数i,于是该元素就放在目标数组的索引i位(i≥0)。2 代码实现public class SortCount { public static void main(String[] args) { int[] arr = {1,4,6,7,5,4,3,2,1,4,5,10,9,10,3}; sortCount(arr, 1, 10); System.out.pr原创 2021-07-23 18:03:09 · 100 阅读 · 0 评论 -
动态规划解题一般步骤(附带案例解析)
目录1 题目场景2 解题步骤3 案例分析1 题目场景1 计数有多少种方式走到右下角;有多少种方法选出k个数使得和为sum;2 求最值从左上角走到右下角路径的最大数字和;最长上升子序列长度3 求存在性取石子游戏,先手是否必胜;要不要选出k个数使得和是sum;2 解题步骤3 案例分析...原创 2021-03-15 15:05:16 · 3286 阅读 · 1 评论 -
递归算法、递归的注意事项、递归案例(Java实现)
目录1 概述2 简单案例2.1 计算1 ~ n的和2.2 递归求阶乘2.3 递归打印多级目录3 综合案例3.1 文件搜索3.2 过滤器优化文件搜索3.3 Lambda优化文件搜索1 概述递归:方法自身调用自身的现象。递归分类:直接递归:方法直接调用自身。间接递归:方法通过间接的方式调用自身,比如A方法调用B方法,B方法调用C方法,C方法调用A方法。注意事项:递归一定要有条件限定,保证递归能停下来,否则会发生栈内存溢出;虽然设定限定条件,但递归次数依然不能太多,否则也会可能栈内存溢出;原创 2020-10-22 14:48:11 · 1784 阅读 · 0 评论 -
四大算法思想:贪心,分治,回溯,动态规划
这里写目录标题1 贪心算法1.1 介绍1.2 案例(最短路径)2 分治算法2.1 介绍2.2 基本思想2.3 解题步骤2.4 应用场景2.5 分治与递归的联系2.6 案例(海量数据处理)2.6.1 题目要求2.6.2 解题思路3 回溯算法3.1 介绍3.2 解题步骤3.3 案例(八皇后问题)3.3.1 问题描述3.3.2 解题思路3.3.3 代码示例(Java)4 动态规划4.1 介绍4.2 应用场景1 贪心算法1.1 介绍贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择原创 2020-12-06 17:25:24 · 8512 阅读 · 0 评论 -
平衡树简介、AVL树详解及Java实现
目录1 平衡树和AVL树2 结点定义3 树高的计算4 旋转5 插入6 删除7 完整代码1 平衡树和AVL树平衡树(Balance Tree,BT) :任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等;AVL树:首先是一棵二叉搜索树,其次是高度平衡的二叉树,树中任意节点的两个子树的高度差都小于等于1;2 结点定义3 树高的计算4 旋转5 插入6 删除7 完整代码public class AVLTree<T exten原创 2021-02-24 19:30:38 · 427 阅读 · 0 评论 -
回溯算法实现全排列的一个小demo(Java)
代码public class QPL { // 定义输入 String[][] input = new String[][] { {"1","2","3"}, {"a","b","c"}, {"A","B","C"} }; // 定义临时 StringBuilder temp = new StringBuilder(); // 定义结果 StringBuilder res = n原创 2021-02-03 11:31:58 · 146 阅读 · 0 评论 -
数据结构最完整汇总(简洁全面、Java代码示例)
目录1 数据结构简介分类2 线性2.1 数组2.2 链表2.3 栈2.4 队列3 非线性3.1 树3.2 堆3.3 散列表1 数据结构简介数据结构是为实现对计算机数据有效使用的各种数据组织形式,服务于各类计算机操作;不同的数据结构具有各自对应的适用场景,旨在降低各种算法计算的时间与空间复杂度,达到最佳的任务执行效率;分类数据结构可分为线性数据结构与非线性数据结构;线性数据结构:数组、链表、栈、队列;非线性数据结构:树、堆、散列表、图;2 线性2.1 数组数组是将相同类型的元原创 2020-12-01 20:07:16 · 2194 阅读 · 1 评论 -
递归和迭代的区别
这里写目录标题1 定义2 结构3 与普通循环的比较1 定义递归(recursion):函数直接或间接调用函数自身,直到满足终止条件,再逐层回归;迭代(iteration):利用已知的变量值,不断用变量的旧值递推新值,直到到达结束状态;2 结构递归是树结构,从字面可以其理解为重复“递推”和“回归”的过程,当“递推”到达底部时就会开始“回归”,其过程相当于树的深度优先遍历;迭代是环结构,从初始状态开始,每次迭代都遍历这个环,并更新状态,多次迭代直到到达结束状态;3 与普通循环的比较迭原创 2020-12-02 15:33:11 · 390 阅读 · 0 评论 -
数据结构:符号表
1 符号表简介符号表最主要的目的是将一个键和一个值联系起来,其存储的数据元素是由一个键和一个值共同组成的键值对数据;我们可以根据键来查找对应的值;符号表中的键具有唯一性;符号表的使用场景应用查找目的键值字典找出单词的释义单词释义图书索引找出某个术语相关的页码术语一串页码网络搜索找出某个关键字对应的网页关键字网页名称2 符号表API设计结点类类名Node<Key, Value>构造方法Node(K原创 2020-12-28 17:48:08 · 1531 阅读 · 0 评论 -
数据结构:线性表之栈和队列(Java实现)
目录1 栈1.1 简介1.2 API设计1.3 代码1.4 括号匹配问题1.5 逆波兰表达式求值问题2 队列2.1 简介2.2 API设计2.3 代码1 栈1.1 简介栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表;先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来);称数据进入到栈的动作为压栈,数据从栈中出去的动作为弹栈;1.2 API设计类名Stack构造方法Sta原创 2020-12-28 16:05:28 · 209 阅读 · 0 评论 -
数据结构:线性表之顺序表和链表(Java实现)
1 线性表简介线性表是最基本、最简单、也是最常用的一种数据结构,一个线性表是若干个具有相同特性的数据元素的有限序列;数据元素之间具有一种“一对一”的逻辑关系;前驱元素:若A元素在B元素的前面,则称A为B的前驱元素;后继元素:若B元素在A元素的后面,则称B为A的后继元素;第一个数据元素没有前驱,这个数据元素被称为头结点;最后一个数据元素没有后继,这个数据元素被称为尾结点;除了第一个和最后一个数据元素外,其他数据元素有且仅有一个前驱和一个后继;2 线性表分类线性表数据存储的方式有两种:顺序原创 2020-12-24 20:39:20 · 467 阅读 · 2 评论 -
加权有向图与最短路径问题(Dijstra算法,Java实现)
目录1 加权有向图1.1 加权有向边的实现1.2 加权有向图的实现2 最短路径2.1 最短路径定义及性质1 加权有向图加权无向图的边没有方向,一条边会同时出现在该边的两个顶点的邻接表中,为了能够处理含有方向性的图的问题,引入了加权有向图。1.1 加权有向边的实现API设计:类名DirectedEdge构造方法DirectedEdge(int v, int w, double weight):通过顶点v、w以及权重weight构造一个边对象成员方法1. public d原创 2020-12-09 21:49:52 · 2895 阅读 · 0 评论 -
加权无向图与最小生成树(Prim算法和Kruskal算法)
0 引入通过加权无向图结合最小生成树相关算法,可以解决最小成本问题,并找到最小成本对应的顶点和边。1 图的最小生成树定义及相关约定图的生成树:图的生成树是它的一个含有其所有顶点的无环连通子图。图的最小生成树:图的权值(所有边的权重之和)最小的生成树。约定:最小生成树只存在于连通图中,如果图不是连通的,那么分别计算每个连通子图的最小生成树,再合并到一起形成最小生成森林。同时为了便于理解,约定所有边的权重都不相同。(如果有权重相同的边,最小生成树可能就不唯一了)2 最小生成树原理2.1 性原创 2020-12-07 16:54:27 · 6130 阅读 · 0 评论 -
加权无向图的定义及实现(Java)
1 定义加权无向图是一种为每条边关联一个权重值的图模型;可以用于多个领域。例如:在航空图中,边表示航线,权值表示距离或者费用;在电路图中,边表示导线,权值表示导线长度。2 边的实现使用对象来描述一条边。API设计:类名Edge implements Comparable构造方法Edge(int v, int w, double weight):通过顶点v和顶点w,以及权重weight值构造一个边对象成员方法1.public double weight():获取边原创 2020-11-28 15:17:26 · 1863 阅读 · 0 评论 -
基于有向图的拓扑排序(Java实现)
目录1 概念及推导1.1 引入1.2 概念1.3 检测有向图中的环1.4 基于深度优先的顶点排序4 拓扑排序实现1 概念及推导1.1 引入在生活中,很多事情都讲求循序渐进。以学习java为例,需要从java基础,到jsp/servlet,到ssm,再到springboot等,是一个循序渐进且有依赖的过程。为了简化问题,我们使用整数为顶点编号的标准模型来表示这个案例:要学习这些课程,就需要指定一个循序渐进的方案,即对图中的顶点进行排序,将其转换为一个线性序列,这时就需要用到一种叫拓扑排序的算法。原创 2020-11-26 21:30:39 · 1405 阅读 · 0 评论 -
贪心算法与动态规划概念解析及二者区别
1 贪心自顶向下求解,动态规划自底向上求解;2 贪心最优解一定包含上一步的最优解,动态规划最优解不一定包含上一步的最优解;3 贪心不能保证全局最优,动态规划(本质是穷举法)能保证全局最优;4 贪心复杂度较低,动态规划复杂度较高;原创 2020-11-23 12:41:13 · 4333 阅读 · 2 评论 -
有向图的定义及Java实现
目录1 定义2 相关术语3 Java实现1 定义在实际生活中,很多图都具有方向性,比如互联网,从A页面通过链接跳转到B页面,A和B的连接就有方向A->B,就需要使用有向图来表达。定义:有向图是具有方向性的图,由一组顶点和一组有方向的边组成,每条方向的边都连着一对有序的顶点。2 相关术语出度:由某个顶点指出的边的个数;入度:指向某个顶点的边的个数;有向路径:由一系列顶点组成,其中的每个顶点都存在一条有向边,从它指向序列中的下一个顶点;有向环:至少含有一条边,且起点和终点相同的有向路径原创 2020-11-21 18:17:52 · 4906 阅读 · 0 评论 -
Java实现:无向图、深度优先搜索、广度优先搜索、路径查找
1 无向图1.1 特征无向图的边仅仅连接两个顶点,没有其他含义,区别于有向图(边不仅连接两个顶点,且具有方向)。1.2 相关术语相邻顶点:通过一条边相连的两个顶点,并且称这条边依附于这两个顶点;度:某顶点的度指依附于该顶点的边的个数子图:一幅图的所有边的子集(包含这些边依附的顶点)组成的图;路径:由边顺序连接的一系列的顶点组成;环:含有至少一条边且终点和起点相同的路径。连通图:如果图中任意一个顶点都存在一条路径到达另外一个顶点,那么这幅图就称为连通图;连通子图:一个非连通图由若干连原创 2020-11-18 16:09:25 · 1106 阅读 · 0 评论 -
图的定义及分类
目录1 定义2 分类2.1 无向图2.2 有向图1 定义图是由一组顶点和一组将顶点相连的边构成的数据结构。特殊的边:自环:连接顶点和顶点自身的边;平行边:连接同一对顶点的多条边。2 分类2.1 无向图边仅仅连接两个顶点,没有其他含义。2.2 有向图边不仅连接两个顶点,且具有方向。...原创 2020-11-16 16:37:02 · 1932 阅读 · 0 评论 -
并查集详解:UF——UF_Tree——UF_Tree_Weighted逐步优化
并查集是一种树型的数据结构,它可以高效地进行如下操作:查询元素p和元素q是否属于同一组;合并元素p和元素q所在的组。原创 2020-11-15 20:48:19 · 695 阅读 · 0 评论 -
B+树,B+树和B树的比较,B+树在数据库中的应用
1 B+树简介B+树是对B树的一种变形,有两个特点:非叶结点仅具有索引作用,也就是说,非叶子结点只存储key,不存储value;树的所有叶结点的key构成一个有序链表,可以按照key排序的次序遍历全部数据。2 B+树存储数据与B树类似,M阶B+树的特点如下:每个结点最多M-1个key,并且升序排列;每个结点最多M个子结点。我们选择5阶B+树来演示B+树数据的存储:3 B+树 VS B树B+树的优点:叶子结点相连且key有序,对整个树的遍历只需一次线性遍历叶子结点即可,便于区原创 2020-11-13 21:26:41 · 318 阅读 · 0 评论 -
B树、B树的特性及B树在磁盘文件中的应用
1. 二叉查找树一个结点一个key; 2. 2-3树一个结点最多可以有两个key; 3. 红黑树一个结点一个key,但通过对链接染红色的方式去表达一个结点两个key,间接实现了2-3树。B树也是一种树型结构,它的一个结点可以有多于两个key的存在,它能够存储数据、对数据排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作。原创 2020-11-12 12:20:45 · 1697 阅读 · 0 评论 -
红黑树及Java代码实现
目录1 简介2 性质3 结点API4 平衡化4.1 左旋4.2 右旋5 向单个的2-结点插入新键6 向底部的2-结点插入新键7 颜色反转8 向单个的3-结点插入新键9 根节点的颜色总是黑色10 向底部的3-结点插入新键1 简介红黑树是一种2-3树思想的简单实现,主要是对2-3树进行编码;基本思想是用标准的二叉查找树(完全由2-结点构成)+ 一些额外的信息(表示3-结点)来表示2-3树;树中有两种链接:红链接:将两个2-结点链接起来构成一个3-结点;黑链接:普通链接。可以将3-结原创 2020-11-10 21:35:39 · 326 阅读 · 2 评论 -
二叉查找树的局限以及2-3查找树的简单介绍
在大部分情况下,二叉查找树的效率比链表查询效率要高得多,但在最坏的情况下,二叉查找树的性能也很糟糕。如下图,依次往二叉查找树中插入9,8,7,6,5,4,3,2,1。如果要查找1,查找的效率依然很低,效率低的原因在于这个树并不平衡,全部向左边分支。我们希望有一种方法,能够不受插入数据的影响,让生成的树都像完全二叉树那样,那么即使在最坏情况下,查找的效率依旧会很好。这样便引入了2-3查找树。原创 2020-11-09 17:06:37 · 548 阅读 · 0 评论 -
索引最小优先队列的实现
概述最大优先队列和最小优先队列,它们分别可以快速访问到队列中的最大元素和最小元素,但是它们没有办法通过索引访问已存在于优先队列中的对象,并更新它们。为此,在优先队列的基础上,引入了一种新的数据结构——索引优先队列。下面以最小优先队列进行讲解。实现思路给每一个数据元素关联一个整数,例如insert(int k, T t),k就是t关联的整数,通过k,我们可以快速获取t,k具有唯一性;虽然可以快速获取元素,但元素的排列并不是堆有序的。因此,增加数组int[] pq,保存每个元素的索引,pq实原创 2020-11-08 21:43:28 · 582 阅读 · 0 评论