数据结构和算法
文章平均质量分 69
天上的云川
博客分享积累,记录成长,欢迎讨论
展开
-
二叉堆实现的优先队列
什么是优先队列?优先队列这个数据结构的特点就是在我们执行插入或者删除元素的操作时候,优先队列自己会来维护队列中元素的顺序,不用我们自己去重新对队列中的数据进行排序,所以优先队列中就有了两个主要的 API,分别是 insert 插入一个元素和 delMax 删除最大元素(如果底层用最小堆,那么就是 delMin)优先队列底层的实现原理就是对二叉堆这个数据结构的使用,因为优先队列底层使用的是二叉堆,所以我们可以用O(1)的时间复杂度去获取优先队列中的最大值(这里我们以最大堆来说,所以获取的是最大值)好,到原创 2022-05-15 19:21:28 · 979 阅读 · 0 评论 -
图的入门实现——邻接矩阵实现
要求: 代码实现如下图结构使用临界矩阵效果如下:思路分析存储顶点String 使用 ArrayList保存矩阵 int[][] edges代码实现:public class Graph { public static void main(String[] args) { // 测试图是否创建 int n = 5; String[] vertexValue= {"A","B","C","D","E"}; // 创建图原创 2021-04-15 19:26:59 · 267 阅读 · 0 评论 -
图的基本介绍和表示方式
图的基本介绍1、为什么要有图这个数据结构?我们还学习过线性表(数组、队列、链表和栈)和树,但是我们可以发现,线性表局限于一个直接前驱(就是只能有唯一一个前面的结点)和一个直接后继的(唯一一个后面的结点)关系。树也只能有一个直接前驱也就是父节点。但是当我们如果想要表示多对多的关系时,前面所学习的数据结构就不能满足我们的需求了,这时候我们就需要图这个数据结构2、图的举例说明图是一种数据结构,其中结点可以具有零个或多个相邻元素。两个结点之间的连接称为边。 结点也可以称为顶点。如图:3、图的常用概念原创 2021-04-15 09:17:49 · 1662 阅读 · 0 评论 -
多叉树介绍
二叉树的问题分析二叉树的操作效率很高,但是依旧存在着问题,因为二叉树是需要加载到内存中的,当二叉树的节点少,不会出现什么问题,但是如果二叉树的节点很多(比如1亿), 就存在如下问题:问题1:如果我们二叉树的结点中存放的数据是从文件中获取到的,那么在构建二叉树时,需要多次进行i/o操作(海量数据存在数据库或文件中),构建二叉树时,速度有影响问题2:节点海量,也会造成二叉树的高度很大,会降低操作速度.由此我们引入了多叉树多叉树介绍在二叉树中,每个节点有数据项,最多有两个子节点。如果允许每个节点原创 2021-04-13 18:03:54 · 4042 阅读 · 0 评论 -
平衡二叉树
引举例给你一个数列{1,2,3,4,5,6},要求创建一颗二叉排序树(BST)创建出来的二叉排序树如下分析存在的问题左子树全部为空,从形式上看,更像一个单链表.插入速度没有影响查询速度明显降低(因为需要依次比较), 不能发挥BST的优势,因为每次还需要比较左子树,其查询速度比单链表还慢由此我们才引入了平衡二叉树平衡二叉树基本介绍平衡二叉树也叫平衡二叉搜索树(Self-balancing binary search tree)又被称为AVL树, 可以保证查询效率较高。具有以下特原创 2021-04-05 16:14:45 · 230 阅读 · 0 评论 -
二叉排序树
引我们前面所了解的数据结构有数组链表。当数组未排序的时候,查找速度会很慢,但是把数据直接添加到数组尾部的时候很快;当数组排序的时候,可以使用二分查找,这样查找速度也很快,到那时缺点就是需要当数组排序的时候;而链表不管是否有序,查找起来都很慢,添加数据的速度比数组要快,因为数组添加数据的时候需要数据整体移动。由此我们引入树的结构,树的结构能够提高存储和查询的效率,其中我们要介绍的一种树叫做二叉排序树。二叉排序树二叉排序树介绍二叉排序树BST: (Binary Sort(Search) Tree),原创 2021-04-02 14:52:26 · 371 阅读 · 0 评论 -
赫夫曼编码
1、基本介绍赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式, 属于一种程序算法赫夫曼编码是赫哈夫曼树在电讯通信中的经典的应用之一。赫夫曼编码广泛地用于数据文件压缩。其压缩率通常在20%~90%之间赫夫曼码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,称之为最佳编码2、原理剖析通信领域中信息的处理方式1-定长编码i like like like java do you like a java //原创 2021-01-31 19:03:18 · 5585 阅读 · 0 评论 -
赫夫曼树
1、基本介绍给定n个权值作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree), 还有的书翻译为霍夫曼树。赫夫曼树是带权路径长度最短的树,权值较大的结点离根较近。2、赫夫曼树几个重要概念说明路径和路径长度:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1结点的权及带权路径长度:若将树中结转载 2021-01-31 16:41:32 · 103 阅读 · 0 评论 -
树结构的实际应用
堆排序堆排序基本介绍堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆, 注意 : 没有要求结点的左孩子的值和右孩子的值的大小关系。每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆大顶堆举例说明我们对堆中的结点按层进行编号,映射到数组中就是下面这个样子: 大顶堆特点:arr[i] >= arr[2*i+1原创 2021-01-30 17:09:56 · 648 阅读 · 0 评论 -
树结构
为什么需要树这种数据结构?1、数组存储方式的分析优点:通过下标方式访问元素,速度快。对于有序数组,还可使用二分查找提高检索速度缺点:如果要检索具体某个值,或者插入值(按一定顺序)会整体移动,效率较低2、链式存储方式的分析优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可, 删除效率也很好)。缺点:在进行检索时,效率仍然较低,比如(检索某个值,需要从头节点开始遍历)3、树存储方式的分析能提高数据存储,读取的效率, 比如利用 二叉排序原创 2021-01-24 17:12:09 · 220 阅读 · 0 评论 -
哈希表
哈希表的基本介绍散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。题目有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址…),当输入该员工的id时,要求查找到该员工的 所有信息.思路分析代码实现public class HashTableDemo { public stat原创 2021-01-23 17:14:56 · 100 阅读 · 0 评论 -
查找算法介绍
线性查找(顺序查找)有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值。代码实现/** * 线性查找 */public class SeqSearch { public static void main(String[] args) { int[] arr = {1,8, 10, 89, 1000, 1234}; int i = seqSearch(arr,原创 2021-01-20 18:36:28 · 104 阅读 · 0 评论 -
排序算法的简单介绍
排序也称之为排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。排序的分类内部排序:指将需要处理的所有数据都加载到内存中进行排序外部排序:当数据量过大的时候,无法全部加载到内存当中去,需要借助外部存储进行排序...原创 2021-01-12 17:15:21 · 361 阅读 · 0 评论 -
算法的时间复杂度是什么?如何计算?
我们在度量一个程序(或者一个算法)执行时间的两种方法第一种最简单,我们直接在分别运行需要比较的算法计算个需要的时间然后进行比较当然这种解决方式也是存在问题的:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序;二是所得到的时间统计量依赖于计算机的硬件、软件等环境因素,这种方式要在同一台计算机的相同状态下运行,才能比较哪一种算法效率更高第二种通过分析某个算法的时间复杂度来判断哪一个算法更优我们在学习时间复杂度前需要了解时间频度的概念时间频度一个算法花费的时间于算法中语句执行次数成正比,原创 2021-01-12 17:15:12 · 14944 阅读 · 2 评论 -
八皇后问题
问题描述在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即:任意两个皇后都不能处于同一行、同一列、或者同一斜线,问有多少种解法思路分析第一个皇后先放第一行第一列第二个皇后放在第二行第一列、然后判断是否ok,如果不ok,继续放在第二列、第三列、依次把所有列都放完,找到合适的继续第三个皇后,还是第一列、第二列…直到第8个皇后也能放在一个不冲突的位置,才算是找到了一个正确解当得到第一个正确解时,再栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放在第一列的所有正确解,全部得到然后回头继续第原创 2021-01-09 17:10:32 · 114 阅读 · 0 评论 -
递归迷宫问题
题目说明这里我们有一个地图(用二维数组表示),小球位于地图的起始点(也就是map[1][1]这个位置),然后小球通过进行循环判断小球当前位置的上下左右是否能走,如果能走则在走之前把之前的位置标记为2,代表有路可走,如果上下左右都没有路则把当前位置标记为3,代表无路可走,直到找到地图的目的地,也就是map[6][5]这个位置。1表示墙,不能走代码示范public class MiGong { public static void main(String[] args) { /原创 2021-01-08 16:41:57 · 136 阅读 · 0 评论 -
前缀、中缀、后缀表达式(逆波兰表达式)
前缀表达式1、什么是前缀表达式?前缀表达式又称为波兰表达式,前缀表达式的运算符位于操作数之前举例说明:(3+4)×5-6对应的前缀表达式就是-×+34562、前缀表达式的计算机求值从右至左扫描表达式,遇到数字时,将数字压入栈中,遇到运算符时,弹出栈顶的两个数,运算符对他们做相应的计算(栈顶元素和次顶元素),并将结果入栈;重复上述过程知道扫描至表达式的最左端,最后运算的出的结果即为表达式的结果举例说明:中缀表达式1、什么时中缀表达式?中缀表达式就是常见的运算表达式,如(3+4)×5-6原创 2021-01-04 15:59:03 · 747 阅读 · 0 评论 -
栈的应用场景及思路分析和代码实现
栈栈的介绍栈的英文名称为stack栈是一个先入后出的有序列表栈 是 限制 线性表中元素的插入和删除 ,只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称之为栈顶,另一端为固定的一端,称之为栈底根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素先删除,最先放入的元素最后删除栈的应用场景举例子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,知道子程序执行完后再将地址取出,以回到原来的程序中处理递归调原创 2021-01-02 16:10:19 · 841 阅读 · 1 评论 -
单向环形链表
单向环形链表的应用场景用以解决Josephu(约瑟夫、约瑟夫环)问题问题描述:设编号为:1,2,3,4…n的n个人围坐一圈,约定编号为第k(1<=k<=n)的那个人,从1开始报数,数到m的那个人出列,它的下一位又开始从1报数,数到m的那个人又出列,依次类推,知道所有人出列为止,由此产生了一个出队编号的序列。提示:用一个不带头节点的循环链表来处理Josephu问题:先构成一个有n个节点的单循环链表,然后由k节点起从1开始计数,计到m时,对应的链表中删除,然后再从被删除的节点的下一个节点又原创 2020-12-27 17:00:41 · 134 阅读 · 0 评论 -
双向链表应用示例
使用带head头的双向链表实现-水浒英雄排行榜管理单向链表和双向链表的区别分析单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找单向链表不能自我删除,需要依靠辅助节点,而双向链表可以进行自我删除,所以我们前面单链表删除节点时候,总会使用一个辅助节点temp双向链表实现增删改思路分析代码实现public class DoubleLinkedListDemo { public static void main(String[] args) { HeroN原创 2020-12-27 16:40:07 · 429 阅读 · 0 评论 -
单链表面试题笔记整理
第一题:求如下单链表中有效节点的个数// 结点信息class HeroNode{ public int no; public String name; public String nickname; public HeroNode next; public HeroNode(int no, String name, String nickname) { this.no = no; this.name = name;原创 2020-12-25 15:41:41 · 87 阅读 · 0 评论 -
队列
一、队列的使用场景银行排队等待叫号的案例:方块中的1234代表四个柜台,下面一行的圆球代表队列,现来排队的先去办理银行业务,后来的后去二、队列队列介绍队列是一个有序列表,可以使用数组或者是链表来实现遵循先入先出的原则。即先存入队列的数据,要先取出;后存入的要后取出数组模拟队列的思路分析队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图,其中maxSize是该队列的最大容量因为队列的输出、输入是分别从头部和尾部来处理的,因此我们需要两个量front(头部)和原创 2020-11-27 10:57:27 · 184 阅读 · 0 评论 -
稀疏数组
一、举例一个需求我们再编写五子棋的程序中,有保存当前对局和继续上一次对局的功能。我们会使用二维数组来记录棋盘当中的每个棋子右边就是我们使用的二维数组记录的当前对局的情况,1表示黑子,位于第二行第三列,2表示第三行第四列那么会出现一个问题因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,这时候我们就需要用到稀疏数组来解决这样的问题二、稀疏数组1、基本介绍当一个数组中大部分元素为0,或者为同一个值的时候,我们就可以使用稀疏数组来保存该数组2、稀疏数组的处理方法是:(1)记录数原创 2020-11-26 17:18:24 · 81 阅读 · 0 评论 -
数据结构的分类
数据结构包括线性结构和非线性结构线性结构和非线性结构线性结构线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素结点中存放数据元素以及相邻元素的地址信息线性结构常见的有:数组、队列、链表和栈非线性结构非线性结构包括:二维数组,多为数组,广义表,树结构,图结构...原创 2020-11-26 16:55:17 · 490 阅读 · 0 评论