java算法
一些基本算法的java实现
猪奥奥
武汉理工大学在校学生,在这里分享一些学习心得。主要是对java语言、开发框架、数据结构等java后端开发工程师所需要具备的知识的一些分享。
展开
-
贪心算法以及简单示例Java实现
贪心算法一、基本概念二、算法步骤三、贪心算法解决集合覆盖问题代码实现一、基本概念 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。也就是说,不从整体最优上加以考虑,做出的只是在某种意义上的局部最优解。二、算法步骤贪心算法一般按照如下步骤进行:建立数学模型来描述问题把待求解的问题分解位若干个子问题对每个子问题进行求解,得到局部最原创 2020-10-09 15:37:44 · 844 阅读 · 0 评论 -
字符串匹配之暴力匹配及kmp算法Java实现
KMP算法一、基本概念二、思路分析1.暴力匹配算法(不推荐):2.KMP算法(推荐)三、代码实现1.暴力匹配算法代码实现一、基本概念字符串匹配是计算机科学中最古老、研究最广泛的问题之一。一个字符串是一个定义在有限字母表∑上的字符序列。例如,ATCTAGAGA是字母表∑ = {A,C,G,T}上的一个字符串。字符串匹配问题就是在一个大的字符串T中搜索某个字符串P的所有出现位置。其中,T称为文本,P称为模式,T和P都定义在同一个字母表∑上。 对于字符串匹配问题,我们最直接能想到的就是暴力匹配,由于暴原创 2020-10-09 11:16:59 · 515 阅读 · 0 评论 -
动态规划算法以及0/1背包问题Java实现
动态规划算法一、基本概念二、算法步骤及问题举例三、动态规划解决0/1背包问题代码实现一、基本概念动态规划算法的核心思想是:将大问题划分为小问题进行解决,从而一步一步获得最优解的处理算法。动态规划算法与分治算法类似,其基本思想也是将代求问题分解成若干子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治算法不同的是,适合于动态规划求解的问题,经分解得到的子问题往往不是互相独立的,即下一个子阶段的求解过程是建立在上一个子阶段的解的基础上,进行进一步的求解。二、算法步骤及问题举例我们以一原创 2020-10-08 16:32:42 · 1250 阅读 · 1 评论 -
分治算法以及汉诺塔问题Java实现。
分治算法一、基本概念二、算法步骤即问题举例三、分治算法解决汉诺塔问题代码实现一、基本概念分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,原创 2020-10-08 10:40:15 · 192 阅读 · 0 评论 -
排序算法Java实现——堆排序
堆排序一、基本思路二、算法分析三、代码实现一、基本思路堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。基本思路:‘将待排元素构造成一个大顶堆,此时整个序列的最大值是堆顶的根节点,将其与末尾元素进行交换,此时末尾就为最大值,然后将剩余n-1个元素重新构造成一个堆,这样会得到n-1个元素的次小值,反复执行,便能得到一个有序序列。**简单来说:**就是循环执行两步:一、构原创 2020-09-11 17:38:33 · 114 阅读 · 0 评论 -
查找算法java实现——斐波那契(黄金分割法)查找
斐波那契(黄金分割法)查找一、基本思路二、算法分析三、代码实现一、基本思路在介绍斐波那契查找之前,让我们先了解几个基本的概念:黄金分割点:是指把一条线段分成两部分,使其中一部分与全长之比等于另一部分与这部分之比,其比值保留三位小数约为0.618。由于按此比例设计的造型十分美丽,因此成为黄金分割,也称为中外比。斐波那契数列:{1,1,2,3,5,8,13,21,34,55…}即相邻两个数的和等于这两个数后面的数,通过计算我们可以发现,斐波那契数列中的两个相邻数的比例,无限接近黄金分割值0.618。原创 2020-06-09 11:24:48 · 630 阅读 · 0 评论 -
查找算法java实现——插值查找
插值查找一、基本思路二、算法分析三、代码实现一、基本思路插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。要注意的是:插值查找除了和二分查找一样要求查找表是顺序存储的有序表外,数据元素的关键字在查找表中最好均匀分布,这样,就可以按比例插值。基本思路: 插值查找的大体思路和二分查找是一样的,只是不再是递归的从序列的mid进行划分,而是将原来的:替换为:(相当于将原来的1/2替原创 2020-05-21 10:07:33 · 214 阅读 · 0 评论 -
查找算法java实现——二分(折半)查找
二分查找一、基本思路二、算法分析三、代码实现一、基本思路二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。基本思路: 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功原创 2020-05-10 18:48:10 · 721 阅读 · 0 评论 -
查找算法java实现——顺序(线性)查找
顺序查找一、基本思路二、算法分析三、代码实现一、基本思路顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。基本思路: 就是依次遍历所给序列,如果存在元素与要查找的元素相同就返回该元素下标。简单来说: 就是从头到位一个一个的遍历序列,如果存在要查找的元素就记录返回其下标。二、算法分析时间: 因为需要从头到尾遍历待查找序列,所以顺序查找的平均时间复杂度为O(n)。空间: 顺序查找在查找过程中不需要额外开辟空间,所以空间复杂度为O(1)。算法平均时间最好情形最差情形原创 2020-05-10 17:44:07 · 493 阅读 · 0 评论 -
排序算法java实现——基数排序
基数排序一、基本思路二、算法分析三、代码实现一、基本思路(1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用(2)基数排序属于稳定性的排序(3)基数排序是桶排序的扩展(4)基数排序是1887年赫尔曼·何乐礼发明的,它是将整数按位数切割成不同的数字,然后按每个位数分别比较。基本思路: 基数排序是将所有待比较原创 2020-05-10 17:21:51 · 283 阅读 · 0 评论 -
排序算法java实现——归并排序
归并排序一、基本思路二、算法分析三、代码实现一、基本思路基本思路: 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略。先将待排序列分成若干个子序列,使每个子序列有序,再将已有序的子序列合并,得到完全有序的序列。简单来说: 就是将待排序列分成几部分每部分分别排序,再进行合并。举例:有一序列为:8, 4, 5, 7, 1, 3, 6, 2要求按升序排列先进行划分:(按照对半划分:下标mid = (left + right) / 2)(1)(8,4,5,7),(1,3,6,2)(原创 2020-05-09 12:50:55 · 294 阅读 · 0 评论 -
排序算法java实现——Shell(希尔)排序
希尔排序一、基本思路二、算法分析三、代码实现希尔排序是希尔(Donald Shell)1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的版本,也称为缩小增量排序。希尔排序是基于插入排序的以下两点性质而提出改进方法的:1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。2.但插入排序一般来说是低效的,因为插入排序每次只能将数据移...原创 2020-05-08 14:10:03 · 854 阅读 · 0 评论 -
排序算法java实现——插入排序
插入排序一、基本思路二、算法分析三、代码实现一、基本思路基本思路: 把n个待排序元素看成一个有序表和一个无序表,开始时有序表中只含有一个元素,无序表中包含n-1个元素,排序过程中每次从无序表中取出一个元素,把它依次与有序表中的元素进行比较,并插入到有序表的适当位置,使之成为新的有序表。简单来说: 就是从二、算法分析三、代码实现...原创 2020-05-08 11:48:14 · 179 阅读 · 0 评论 -
排序算法java实现——选择排序
选择排序一、基本思路二、算法分析三、代码实现一、基本思路基本思路: 第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到前n个元素都有序。简单来说: 就是从n个元素中先找出最小元素放到第一个位置,再从n-1个元素中找出最小元素放到第二个位置,以此类推,直到前n-1个位置确定。...原创 2020-05-07 19:51:01 · 191 阅读 · 0 评论 -
排序算法java实现——快速排序
快速排序一、基本思路二、算法分析三、代码实现一、基本思路基本思路是: 快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分小,然后再按此方法对这两部分数据分别进行快速排序,整个过程可以递归进行。简单来说: 就是将待排序列不断的拆分成两部分,其中前半部分的所有数据都比后半部分小。举例:有一序列为:-9, 78, 0, 23, -5...原创 2020-05-07 13:06:55 · 179 阅读 · 0 评论 -
排序算法java实现——冒泡排序
冒泡排序一、基本思路二、算法分析三、代码实现一、基本思路基本思路: 将待排序序列从前向后扫描,依次比较相邻的元素,若发现相邻元素逆序,则交换位置,直到没有相邻的元素需要交换。简单来说: 就是依次找出待排序列中较大的元素放在序列较后的位置。举例:有一序列为:2,7,-2,18,9要求按升序排列先从左往右遍历,并且依次比较相邻的元素,如果是逆序就交换。第一趟比较(比较前n个元素,5个元...原创 2020-05-04 12:11:52 · 310 阅读 · 0 评论 -
递归java实现——基本思路及示例
递归算法一、基本概念二、基本思路三、代码示例(一)八皇后问题代码实现一、基本概念递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的...原创 2020-05-03 16:10:20 · 642 阅读 · 0 评论