算法
文章平均质量分 62
小研说技术
专攻Java,学习前端、Linux、各种流行框架,计算机领域的业余爱好者,我爱学习,记录小研成长的点滴。
展开
-
单链表知识、面试题汇总
单链表1、单链表介绍和内存布局1)链表介绍2)单链表介绍:2、单链表创建和遍历的分析实现1)单链表的应用实例2)单链表的创建示意图3)具体实现3、单链表按顺序插入节点1)思路分析2)具体实现4、单链表节点的修改1)具体实现5、单链表的删除和小结1)思路分析2)具体实现6、面试题1)单链表新浪面试题2)单链表腾讯面试题3)单链表百度面试题1、单链表介绍和内存布局1)链表介绍链表:链表是有序的列表,但是它在内存中存储如下:小结:①链表是以节点的方式来存储,是链式存储②每个节点包含data域,原创 2022-04-09 21:48:07 · 912 阅读 · 22 评论 -
数组模拟环形队列(java)
数组模拟队列1、队列的应用场景和介绍1)介绍2、数组模拟队列的思路分析3、数组模拟队列代码实现4、数组模拟环形队列思路分析数组模拟环形队列:5、数组模拟环形队列实现1、队列的应用场景和介绍1)介绍①队列是一个有序列表,可以用数组或者链表来实现;②遵循先入先出的原则。即:先存入队列的数据,要先取出,后存入的数据,后取出;③示意图:(使用数组模拟队列示意图):2、数组模拟队列的思路分析①队列本身是有序列表,若使用数组的结构来存储队列的数据,则队列数组的声明如下图。其中maxs原创 2022-04-08 21:34:09 · 619 阅读 · 7 评论 -
稀疏数组代码实现(java)
稀疏数组代码实现(java)基本介绍当一个数组大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方法是:①记录数组一共有几行几列,有多少个不同的值。②把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。应用实例使用稀疏数组,来保留类似前面的二维数组(棋盘、地图等等)把稀疏数组存盘,并且可以从新恢复原来的二维数组整体思路分析代码实现1)二维数组转稀疏数组的思路:①遍历原始的二维数组,得到有效数据的个数sum②根据原创 2022-04-07 19:15:43 · 432 阅读 · 1 评论 -
贪心算法解决经典集合覆盖问题
贪心算法1、贪心算法的介绍2、贪心算法解决集合覆盖问题实现1、贪心算法的介绍应用场景:集合覆盖问题贪心算法的介绍:1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或最优的选择。从而希望导致结果是最好或最优的解法;2)贪婪算法所得的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似最优解的结果;2、贪心算法解决集合覆盖问题实现public class Demon { public static void main(String[] args) { //原创 2021-09-08 17:25:40 · 501 阅读 · 0 评论 -
暴力算法和KMP算法解决经典字符串匹配问题
暴力算法和KMP算法解决经典字符串匹配问题1、暴力匹配算法解决字符串匹配问题2、KMP算法解决字符串匹配问题1、暴力匹配算法解决字符串匹配问题public class baoli { public static void main(String[] args) { //测试 String str1="我爱你你爱我大家都爱我"; String str2="你爱我"; int index=violenceMatch(str1,str2); System.out.println("i原创 2021-09-06 21:14:59 · 111 阅读 · 2 评论 -
动态规划算法解决经典背包问题
动态规划算法应用场景:背包问题条件:1)要求达到的目标为装入的背包的总价值最大,并且重量不超出2)要求装入的物品不能重复算法介绍:1)动态规划的核心思想:将大问题分为小问题进行解决,从而一步步获取最优解的处理方法2)算法与分治算法类似,其基本思想也是将带求解的问题分解成若干个小问题,先求子问题,然后从这些子问题的解得到原问题的解;3)与分治法不同的是,适合于动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一阶段的求解是建立在上一阶段的解的基础上,进行进一步的求解)4)动态规原创 2021-09-05 21:50:02 · 635 阅读 · 2 评论 -
分治算法求解汉诺塔问题
分治算法求解汉诺塔问题代码实现:public class Demon { public static void main(String[] args) { //测试 hannoiTower(3,'A','B','C'); } //分治算法解决汉诺塔问题 public static void hannoiTower(int num,char a,char b,char c) { //只有一个盘 if(num==1) { System.out.println("第一个盘从"+a原创 2021-09-04 08:59:34 · 117 阅读 · 2 评论 -
图的深度优先和广度优先
图1、图的基本介绍和存储方式2、图的创建和代码实现3、图的深度优先遍历4、图的深度优先实现5、图的广度优先搜索6、广度优先实现1、图的基本介绍和存储方式简单明了,我们处理多对多的关系时,就要用到图。图的表示方式:邻接矩阵、邻接表2、图的创建和代码实现/* * 103、图的创建和实现(邻接矩阵) */public class Graph { private ArrayList<String> vertexList; //存储节点 private int[][] edges;原创 2021-09-03 16:03:27 · 476 阅读 · 0 评论 -
最大公约数/最小公倍数(C、Java)
最大公约数/最小公倍数(C、Java)1、最大公约数概念: 如果数a能被数b整除,a就叫做b的倍数,b就叫做a的约数。约数和倍数都表示一个整数与另一个整数的关系,不能单独存在。如只能说16是某数的倍数,2是某数的约数,而不能孤立地说16是倍数,2是约数。常用方法: 最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数原创 2021-08-06 14:58:46 · 181 阅读 · 2 评论 -
判断是否是回文数/串(C、Java)
判断是否是回文数/串(C、Java)回文数:第一位和最后一位数字相同,第二位和倒数第二位相同…情形1,如果是一个数字类型,比如int类型:Java代码实现:public static boolean palindromeic(int num) { List<Integer> bit=new ArrayList<>(); while(num!=0) { bit.add(num%10); num/=10; } for(int i=0;i<原创 2021-08-04 14:55:00 · 174 阅读 · 1 评论 -
判断是否是素数(C、Java)
判断是否是素数素数: 素数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。实现Java实现方式一: /* * 判断是否是素数,实现方式一 */ public static boolean JudgePrime(int num) { for(int i=2;i<num/2;i++) { if(num%i==0) { return false; } } return true; }方式一解读: 优化:若n不能被2整除,那么也原创 2021-08-03 17:36:48 · 294 阅读 · 0 评论 -
排序、查找算法齐全(程序员必会 好文 值得收藏!)
十大排序算法(C、Java)1、 绪论2、交换类2-1冒泡排序2-2快速排序3、插入类3-1直接插入排序3-2希尔排序4、选择类4-1简单选择排序4-2堆排序5、归并类5-1归并排序6、桶类排序6-1桶排序6-2计数排序6-3基数排序7、测试8、必备1、 绪论身为程序员,十大排序是对每一个程序员都应该掌握的算法,现在比较流行的算法如快速排序、归并排序等,对算法的时间复杂度和空间复杂度的掌握都有要求。本文将分享常见的十大排序算法,基于Java和C语言实现,让你能够掌握!对于排序的分类,可以根据不同的角原创 2021-08-01 17:36:07 · 1469 阅读 · 3 评论 -
查找算法06-哈希查找
查找算法06-哈希查找6、哈希查找6-1实现代码6-2测试6-3方法解析6、哈希查找(1)概述在哈希表中,若出现key1≠key2,而f(key1)=f(key2),则这种现象称为地址冲突key1和key2对哈希函数f来说是同义词。根据设定的哈希函数f=H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集上,并以关键字在地址集中的“象作为记录中的存储位置,这一映射过程为构造哈希表(散列表)。 好的哈希函数应该使一组关键字的哈希地址均匀分布在整个哈希表中,从而减少冲突,常用的构造原创 2021-07-31 10:13:18 · 831 阅读 · 2 评论 -
查找算法05-分块查找
查找算法05-分块查找5、分块查找5-1、实现代码5-2、测试5-3、方法解析知识分享:热门博客5、分块查找(1)概述: 分块查找又称索引顺序查找,它是顺序查找的一种改进方法。(2)算法流程: 先选取各块中的最大关键字构成一个索引表;查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。(3)要点: 算法的思想是将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序",每个块内的的最大元素小原创 2021-07-30 14:16:47 · 399 阅读 · 0 评论 -
查找算法04-斐波拉契查找
查找算法04-斐波拉契查找4、斐波拉契查找4-1实现代码4-2测试4-3方法解析4、斐波拉契查找斐波那契数列介绍:{1, 1, 2, 3, 5, 8, 13, 21, 34, 55 } :斐波那契数列的两个相邻数 的比例,无限接近 黄金分割值0.618。原理: 同二分法差不多,只不过在mid的位置上作了处理;在斐波那契查找算法中,mid的位置位于黄金分割点附近,即 mid = low + F[ k - 1 ] - 1,其中F为斐波那契数列。关于F[ k - 1 ] - 1的说明:斐波那契数列的性原创 2021-07-29 19:25:08 · 152 阅读 · 0 评论 -
查找算法03-插值查找
查找算法03-插值查找3、插值查找3-1、实现代码3-2、测试3-3、方法解析3、插值查找基本思想: 基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找。时间复杂度: 查找成功或者失败的时间复杂度均为O(log2(log2n))。改进: mid=low+(key-a[low])/(a[high]-a[low])*(high-low)。注: 对于表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能比折半查找要好的多。反之,数组中如果分布原创 2021-07-28 16:42:31 · 122 阅读 · 0 评论 -
查找算法02-二分法查找
查找算法02-二分法查找2、二分法查找2-1实现代码2-2测试2-3方法解析2、二分法查找说明: 元素必须是有序的,如果是无序的则要先进行排序操作。基本思想: 也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。复杂度分析: 最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n)原创 2021-07-27 21:56:59 · 226 阅读 · 0 评论 -
查找算法01-顺序查找
查找01-顺序查找1、顺序查找1-1实现代码1-2测试1-3方法解析查找定义: 根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。1、顺序查找说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表。基本思想: 顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。复杂度分析:查找成功时的平均查找长度为:(假设每个数据元素的概率原创 2021-07-27 17:49:34 · 421 阅读 · 0 评论