
数据结构与算法
记录学习过程
ん心之所向ヅ
迷途漫漫,终有一归。
展开
-
算法 | 堆排序
堆排序的基本介绍1、堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序也是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),同时它也是不稳定排序;2、堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大项堆;每个结点的值都小于或等于其左右孩子结点的值,称为小项堆。堆排序的基本思想1、将待排序序列构成一个大项堆,此时整个序列的最大值就是堆顶的根节点;2、将其与末尾元素进行交换,此时末尾就为最大值;3、然后将剩余的n-1个元素重新构造成一个堆,这样原创 2021-08-13 20:13:44 · 514 阅读 · 0 评论 -
数据结构 | 线索化二叉树
线索化二叉树的由来在二叉树中,我们经常发现,有许多的叶子结点的左右指针没有完全利用上,于是我们希望能将这些指针充分的利用,所以就出现了线索化二叉树线索化二叉树的基本介绍1、n个结点的二叉链表中含有n+1个空指针域。利用二叉链表中的空指针域,存放指向该结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为线索);2、这种加上了线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树。根据线索性质的不同,线索二叉树可分为前序线索二叉树,中序以及后序三种;3、每一个结点的前一个结点称之为前驱结点原创 2021-08-13 13:51:24 · 1170 阅读 · 0 评论 -
数据结构 | 二叉树
为什么需要树这种数据结构?因为它能够提高数据的存储、读取的效率。比如二叉排序树,既可以保证数据的检索速度,也可以保证数据的插入、删除、修改速度,相比于数组这种存储方式,显然效率以及实用性更高。二叉树的概念树有很多种,且每个节点最多只能有两个子节点的一种形式称为二叉树,二叉树的子节点分为左节点和右节点,如果该二叉树的所有叶子结点都在最后一层,且结点总数=2^n-1(n为层数),则称之为满二叉树;如果该二叉树的所有叶子结点都在最后一层或者倒数第二层,且最后一层的叶子结点在左边连续,倒数第二层的叶子结点在原创 2021-08-13 12:42:06 · 391 阅读 · 0 评论 -
算法 | 求和最大的子序列
题目说明给定一整数序列A1,A2,A3,…,An(其间可能存在负数),求A1到An的一个子序列Ai-Aj,使得Ai~Aj的和最大,并输出子序列的内容。代码体现public class MaxSub { public static void main(String[] args) { int[] nums = {-4, -2, 1, 4}; method_1(nums); method_2(nums); } //方法一:暴力破原创 2021-08-04 15:30:48 · 375 阅读 · 0 评论 -
总结四种常见的查找算法
四种常见的查找算法1、顺序查找1.1、定义1.2、代码体现2、二分查找2.1、定义2.2、思路分析2.3、代码体现3、插值查找3.1、定义3.2、代码体现4、斐波那契查找4.1、定义4.2、原理4.3、代码体现1、顺序查找1.1、定义顺序查找又名线性查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败。1.2、代码体现public class SequenceSearch {原创 2021-08-02 18:59:57 · 4999 阅读 · 1 评论 -
算法 | 八皇后问题
什么是八皇后问题?八皇后问题是一个古老而著名的问题,它是回溯算法的典型案例。其问题的内容是:在8x8格的国际棋盘上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问共有多少种摆法。八皇后问题算法思路分析:1、先把第一个皇后放在第一行第一列;2、第二个皇后放在第二行第一列,然后判断是否可行,如果可以,继续放在第二列、第三列,依次把所有列都放完,找到一个合适的;3、继续放第三个皇后,还是从第一列、第二列…直到第八个皇后也能放在一个不冲突的位置上,这样就找到了一原创 2021-07-28 20:20:40 · 2596 阅读 · 1 评论 -
算法 | 大数相乘
题目描述例如:String a = “12546546…”;String b = “4845452…”,a的长度和b的长度都很大,且给出的数都是正整数注意一点:一个n位数乘以一个m位的数,相乘最终的结果位数区间应该在:n到n+m之间。代码体现://大数相乘public class Solution { public static void main(String[] args) { String a = "9674657999"; String b原创 2021-07-18 16:03:01 · 445 阅读 · 0 评论 -
总结Java中常见的一些排序算法
部分常见的排序算法:1、冒泡排序1.1代码体现2、选择排序3、插入排序4、希尔排序5、快速排序6、归并排序7、基数排序8、以上排序算法的总结和对比1、冒泡排序冒泡排序的基本思想是:依次比较相邻元素的值,若发现逆序则交换,使较大的元素逐渐向后移动,就像是水底的气泡一样逐渐向上浮动。1.1代码体现public class BubbleSort { public static void main(String[] args) { int value[] = {3, -6, 18原创 2021-07-18 10:50:14 · 774 阅读 · 0 评论 -
算法 | 大数相加
题目描述:例如:String b = “12546546…”;String b = “4845452…”,a.size和b.size都大于1000位,且给出的数都是正整数思路分析:1、在进行相加的时候需要将末尾对齐,然后依次相加。2、此时会涉及到一个问题,进位。两个数相加最多只会进一位,因为两个个位数相加最大只会是18。3、两个数相加结果的位数只会有两种情况,要么是较大数位数的长度,要么就是较大数位数的长度加一。4、在相加的时候可以把两个String代表的数转成数组然后再进行一个计算原创 2021-07-15 20:41:14 · 748 阅读 · 0 评论 -
数据结构——栈 | 使用数组及单链表来模拟栈的实现
Tips:①栈是一个先入后出的有序列表;②栈的插入和删除只能在同一端进行,允许插入和删除的一段为栈顶,固定的一段为栈底;③由栈的特性可知,最先放入的元素在栈底,最后进入的元素在栈顶。而删除元素则刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。这里使用两种方式来实现栈的创建一、使用数组来模拟栈代码体现://定义一个ArrayStack用来表示栈public class ArrayStackDemo { private int maxSize;//栈的大小 privat原创 2021-07-12 16:25:42 · 527 阅读 · 0 评论 -
数据结构——单向环形链表 | 约瑟夫问题
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终原创 2021-07-11 16:35:08 · 528 阅读 · 0 评论 -
数据结构——双向链表
单向链表和双向链表的区别:单向链表查找的方向是单一的,而双向链表既可以向前查找,也可以向后查找;在删除时,单向链表需要靠辅助节点进行删除操作,而双向链表。和单链表一样,首先仍然需要先创建一个头结点public class Node { public int no; public String name; public Node pre;//指向前一个节点 public Node next;//指向下一个节点 public Node(int no, Str原创 2021-07-11 16:05:07 · 494 阅读 · 0 评论 -
数据结构——单链表
单链表的介绍1、链表是以节点的方式来存储2、每个节点包含一个data域以及next域,next域指向下一个节点;3、链表的各个节点在内存中不一定是连续存储的。先创建一个头结点/** * 定义Node,每个Node对象就是一个节点 */public class Node { public int no; public String name; public Node next;//用于指向下一个节点 public Node(int no, String原创 2021-06-20 19:01:22 · 616 阅读 · 1 评论 -
数据结构——数组模拟队列
队列是一个有序列表,可以用数组或链表来实现,它遵循先进先出的原则。内容概述:1、数组模拟队列2、数组模拟循环队列一、数组模拟队列代码实现/** * 使用数组模拟队列 */public class ArrayQueue { private int maxSize;//表示数组的最大容量 private int front;//队列头 private int rear;//队列尾 private int[] arr;//该数组用于存放数据,模拟队列原创 2021-06-13 23:13:33 · 731 阅读 · 2 评论 -
数据结构——稀疏数组
稀疏数组作用:数组中有很多无效数据,压缩数组。疏数组可以简单的看作为是压缩,在开发中也会使用到。比如将数据序列化到磁盘上,减少数据量,在IO过程中提高效率等等。为什么要进行压缩?由于稀疏矩阵中存在大量的“空”值,占据了大量的存储空间,而真正有用的数据却少之又少,且在计算时浪费资源,所以要进行压缩存储以节省存储空间和计算方便。这里用一个小Demo来展示稀疏数组的作用,主要功能如下:1、将二维数组转稀疏数组2、将稀疏数组转回原始数组3、将稀疏数组存到磁盘中4、从磁盘中读取稀疏数组并将其原创 2021-06-10 17:47:35 · 501 阅读 · 0 评论