算法基础学习
文章平均质量分 66
自己学习数据结构和算法分析的总结
程序员小牧之
汲取,分享与成长,我们唯一能做的就是坚持。
展开
-
1.几种基本的算法思想(分治,动态规划,回溯)
分治法是计算机领域中最为常用的算法类型,其核心思想是分而治之,其原理是:首先将一个复杂混合的问题拆解为两个或两个以上类型相同的子问题,然后将子问题依然进行分治法处理,直到子问题本身简单到可以求解,最终按照问题的拆解顺序,从子问题逐步向大问题结果汇总,层层向上,最终得到原问题的解。分治法的一个典型的应用就是递归动态规划法又叫中间结果记录法,它的原理是:将问题拆分为多个简单的子问题,对于相对重叠的子问题的结果记录在中间结果表中,当遇到相同的问题时直接查询中间结果表的结果即可。原创 2021-12-28 16:53:48 · 585 阅读 · 0 评论 -
2.分治策略递归学习
一.什么是分治策略?我的总结是:大分小,小合大。这句话将贯穿下面所以递归算法。首先简单了解下递归:然后解决下列两个问题:全排列和整数划分...原创 2020-03-14 10:23:04 · 169 阅读 · 0 评论 -
3.针对二维数组的某一项对二维的数组排序
针对二维数组的某一项对二维的数组排序我的思路是降维排序import java.util.Arrays;public class beibaowenti { public static void main(String[] args) { int things[][] = {{4, 50}, {6, 60}, {7, 100}, {8, 70}};//定义一个二维数...原创 2020-03-14 12:38:21 · 231 阅读 · 2 评论 -
3.1 冒泡排序算法java实现与分析
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ofvjkw0-1678498997776)(maopao.png "冒泡排序图示")]从第一个数开始,每个数都与其后面所有数进行一轮比较,根据比较结果进行位置交换,最后得到一个有序的数组。当n无穷大时,O(n)=n^2, 所以其时间负责度为O(n^2);我们假设数组的大小为n, 进行一次比较的时间复杂度为1。很容易可以看出其空间复杂度为O(1)原创 2020-03-17 15:33:21 · 172 阅读 · 1 评论 -
3.2 插入排序思路和java实现
注意:插入排序只适合少量元素的排序,其时间复杂度为O(n^2)它的一个特点是:回溯到前面进行比较,之后往后进行比较。这个排序方法了解即可,因为其时间复杂度非常高。空间复杂度为O(1)原创 2020-03-18 11:04:40 · 173 阅读 · 1 评论 -
3.3 希尔排序思路和java实现
通过比较相距一定间隔的元素,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻的元素的最后一趟位置。其时间复杂度比较优秀:最好为O(n), 最坏时取决于间隔序列。执行结果:[1, 2, 3, 5, 7, 9]空间复杂度:最坏O(n)原创 2020-03-18 11:06:16 · 153 阅读 · 1 评论 -
3.4 快速排序算法的java实现
java代码实现如下:package PaiXuFenXi;//测试方法public class Quicksort { public static void main(String[] args) { int b[]={10,9,8,7,6,5,4,3,2,1}; Quicksort text=new Quicksort(); ...原创 2020-03-17 15:38:11 · 494 阅读 · 0 评论 -
3.5 归并排序的java实现
侵权立删java实现代码如下:1.排序主方法和合并方法如下://合并方法public void merge(int []a,int left,int mid,int right){ int []tmp=new int[a.length];//辅助数组 int p1=left,p2=mid+1,k=left;//p1、p2是检测指针,k是存放指针 ...原创 2020-03-31 14:08:26 · 94 阅读 · 0 评论 -
3.6 计数排序的java实现
计数排序的应用场景是假设n个输入元素中的每一个都是在0到k区间内的整数。排序的时间复杂度为O(n),但是空间复杂度是不稳定的,为O(k),也就是说,空间复杂度取决于k此排序的一个重要的特性是稳定,它的时间复杂度是很稳定的。原创 2020-03-31 18:48:52 · 301 阅读 · 0 评论 -
4.1.Java实现单向链表(完整代码及详细注释)
一.什么是单向链表?它由多个节点组成,每个 节点(用于存储数据) 通过next指针相互连接,从而构成了一个线性的表(它与数组的区别就是它可以不具空间连续性)。在java中一般通过定义节点类和操作类的方式来实现链表二.JAVA代码的实现:1.定义节点:class ListNode{ private int data;//存储的数据 private ListNode next...原创 2020-03-14 16:55:39 · 846 阅读 · 0 评论 -
4.2 Java实现双向链表(完整代码及详细注释)
双向链表由多个节点组成,每个 节点(用于存储数据) 通过prev,next指针和前,后节点相互连接,下一个节点的引用存放在上一个节点的next指针中, 上一个节点的引用存放在下一个节点的prev指针中,从而构成了一个线性的链表 (它与数组的区别就是它可以不具空间连续性)在java中一般通过定义节点Node类和API类的方式来实现链表 JDK中对链表LinkedList的节点的实现结构如下:可以看到链表节点组成分为三部分:存储数据的元素item , 当前节点下一节点的引用next, 当前节点上一节点原创 2022-01-04 21:14:08 · 913 阅读 · 2 评论 -
4.3 Java实现循环链表(完整代码及详细注释)
一.循环链表什么是循环链表? 顾名思义,就是收尾相连的链表,也就是说在这个链表里,任何节点都可能是头节点,也可以是尾节点。为了简单理解,这里只演示单向循环链表。1.单向循环链表循环链表和单向链表基本没差别,无非就是将尾节点的next设置为头节点即可(注意这个点就理解了),也就是说单向循环链表的定义和单向链表的定义基本一致,只是多了一个标志,用于结束循环。二.循环链表的实现1.节点定义package Exa04.CycleList;import lombok.Data;@Datapub原创 2022-01-05 20:23:12 · 1834 阅读 · 0 评论 -
4.4 松散链表的java实现(附完整代码及详细注释)
松散链表是单向链表和(循环链表/数组/双向链表/单向链表)的一种有效结合,松散链表中的每个节点存储一个块,每个块中可以有多个元素,这些元素由(循环链表/数组/双向链表/单向链表)存放链接在一起。如图所示:这是松散链表的结构,它的节点也是链表结构fill:#333;color:#333;color:#333;fill:none;List1.nextList2.nextList3.nextList1List2List3null其中链表的结构如下fill:#333;原创 2020-03-16 18:49:42 · 467 阅读 · 0 评论 -
5.1 栈Stack基于动态数组的Java实现
栈是一个有序的线性表,只能在栈顶进行操作插入和删除操作。所以也叫先进后出表。原创 2023-03-30 10:34:06 · 397 阅读 · 0 评论 -
6.1 队列的链表实现 Java版
队列和栈不同,它是一个先进先出表,它的特性是先进先出,先被存进的元素先被取出。我们可以使用数组去实现队列,但是对于数组实现而言,队列用链表来实现更为简单。原创 2023-03-31 09:53:54 · 342 阅读 · 0 评论 -
7.1 二叉树学习及其java实现
树是一种类似于链表的数据结构,只不过链表中节点之间的关系是1对1,而在树中就变成了一对多的关系,树结构是表达具有层次结构的图的一种方式。如下图所示:每个节点都会有0/1/2个子节点和一个父节点,只有根节点没有父节点fill:#333;color:#333;color:#333;fill:none;123456null对于树这种数据结构的应用,元素的顺序并不是考虑的重点,如果我们需要用到元素的顺序信息, 我们大可去使用链表,栈,队列等这些较为简单的数据结构那么使用树的关键在于哪里呢。原创 2020-03-23 14:12:11 · 404 阅读 · 0 评论 -
7.2 搜索二叉树(BST)及其Java实现
简单来说,它是一个加了限定条件的二叉树,它可以使最坏情况下的平均搜索的时间复杂度降低到O(log n).一个节点的左子树只能包含值小于该节点的值的节点一个节点的右子树只能包含值大于该节点的值的节点左右子树也都必须是二叉搜索树比如我们想向一颗空树中添加下面元素:3,2,1,4,5最后我们得到的树结构应该如下:fill:#333;color:#333;color:#333;fill:none;原创 2023-04-06 15:17:59 · 605 阅读 · 1 评论 -
排序方法自动测试(只需一行代码)
上项目地址https://gitee.com/yan-jiadou/study/tree/master/Java%E5%8A%A8%E6%89%8B%E5%81%9A%E4%B8%80%E5%81%9A/src/main/java/SortStudy测试方法已经写了,采用的是自动测试,你只需调用即可,非常简单,这样我们的精力就可以放在SortCore的算法实现上了,这里的自动测试自带数据比对功能,用来测试你的排序方法实现的对不对,如果结果有问题,会返回false。一.目的有人说,排序方法我学了,但原创 2021-12-25 14:02:45 · 1046 阅读 · 0 评论 -
数组学习之特殊矩阵的压缩存储
一.为什么压缩存储?1.在计算机中矩阵用二维数组来表示是最自然的方式。2.但是在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有很多值相同的元素或者为0的元素。3.所以有时我们为了节省空间需要对这些矩阵进行压缩存储。4.当我们想要压缩的矩阵的数值分布具有一定的规律时我们才可能去实现压缩存储。二.此类矩阵主要包括三类:1.对称矩阵对于它我们只需要记住一条规则:若n阶(n*n)矩阵...原创 2020-05-06 15:34:34 · 1036 阅读 · 0 评论 -
并查集(等价类)ADT学习分析
一,什么是并查集?(也叫等价类)并查集ADT(抽象数据结构)可以表示一组无序元素,可用来解决等价问题。二,等价类中的一些操作:1.创建一个等价类2.查找等价类3.合并等价类。三,等价类的一些应用1.表示网络的连通性2.图像处理3.查找最近公共祖先4.定义有限状态自动机的等价性5.Kruscal最小生成树算法6.博弈算法四,实现方法1.快速UNION实现(慢FIND):...原创 2020-04-06 15:20:57 · 451 阅读 · 1 评论 -
最小生成树基础
一.什么是最小生成树?所有顶点且边权值之和最小 的图生成的树。只有连通图才有最小生成树。原创 2020-04-01 10:35:35 · 102 阅读 · 0 评论 -
最短路径算法基础
本博客只是初级思维学习笔记,本人尚未实现其中的代码,其中的代码可能存在错误!!。原创 2020-04-01 10:30:06 · 162 阅读 · 0 评论 -
拓扑排序
一.什么是拓扑排序?原创 2020-04-01 10:18:01 · 210 阅读 · 0 评论 -
图的宽度遍历java实现
一.什么是宽度遍历?我们可通过下图理解:下面我们用代码重现上面的情况:二.代码实现://辅助队列class ArrayQueue{ private int front; private int rear; private int capacity; private int [] array; //有参构造方法 public ArrayQ...原创 2020-03-30 16:30:22 · 233 阅读 · 0 评论 -
图算法深度遍历java实现
一.什么是深度遍历?我们可以通过下面的图深入了解:二.代码实现:import java.util.Stack;class Vertex{ public char label;//节点信息 public boolean visited;//存储节点是否被访问信息 public Vertex(char lab) { label=lab;...原创 2020-03-30 15:58:49 · 591 阅读 · 0 评论 -
图算法基础一
一.什么是图?有几个节点,节点之间有线连着,这样的情景就叫图:二.由于节点之间的连接方式的不同,我们诞生了以下含义:1.有向边:从一个节点到另一个节点的连接是单向的,我们成两个节点之间的线为有向边。2.无向边: 从一个节点到另一个节点的连接是双向的,我们成两个节点之间的线为无向边。3.有向图: 图中所有的边都是有向边4.无向图: 图中所有的边都是无向边三.由于要对图加以描述...原创 2020-03-30 13:52:03 · 492 阅读 · 0 评论 -
最大堆的堆排序的Java实现
一.基本思想:首先将所有元素(从未排过序的数组)插入堆中,然后从堆的根节点开始提取并且将最小的元素放到根节点然后堆化,直到完毕。二,具体代码如下://堆排序int[] Heapsort(Heap h,int A[],int n){ inti,temp; BuildHeap(h,A,n); h.count=n; for(i=n-1;i>=0;i--)...原创 2020-03-27 10:17:27 · 136 阅读 · 0 评论 -
堆和二叉堆
1.什么是堆?堆是一颗具有特定性质的完全二叉树。特定性质是:所有节点的值必须大于或等于(或小于或等于)其孩子节点的值。2.堆的类型。最小堆:节点的值必须小于或等于孩子节点的值。最大堆:节点的值必须大于或等于孩子节点的值。3.堆的java实现以最大堆为例:我们使用数组来实现。那么堆的元素是如何存储的呢?例子:这里有一个最大堆:我们可以得到它的数组存储表为:通过上面的表我...原创 2020-03-26 20:26:39 · 247 阅读 · 0 评论 -
平衡二叉搜索树及其java实现
一.什么是平衡二叉搜索树?在二叉搜索树的基础上:每个左右子树的高度差为0,此时的二叉树称为完全平衡二叉搜索树。每个左右子树的高度差不大于1时,此时的二叉树称为AVL树。(就是平衡二叉搜索树)二.旋转当树的结构发生变化时(插入,删除节点),它可能变得不符合AVL结构了,所以我们需要旋转来保证树符合AVL结构。其中心思想是:将从插入点到根节点路径上第一个不满足AVL性质的节点修复。以插入...原创 2020-03-25 10:45:36 · 372 阅读 · 0 评论 -
N叉树的java实现
一.什么是N叉树?就是节点的孩子没有限制的树。例如:那么怎么表示这种树呢?有一种方法可以合理的表示它:1.同一个父母节点的孩子从左到右排列。2.父母节点只指向第一个孩子节点。如图:它的节点定义和二叉树一样:class BinaryTreeNode{ private int data; private BinaryTreeNode first; priv...原创 2020-03-23 14:27:33 · 1442 阅读 · 0 评论 -
字符压缩编码
总结自《大数据时代的机器学习,人工智能及其典型实例》原创 2020-03-13 15:42:23 · 187 阅读 · 0 评论