
Java算法与数据结构
文章平均质量分 91
码涤生
现在以一颗谦容的心想大家学习,将来以一颗无私的心想大家解答疑难杂症
展开
-
遗传算法在智能推荐中的设计与应用
一、思维概述这个算法是来源于毕设、本来是打算采用遗传算法优化安踏一个最佳优惠策略的算法,但是后来因为商业合作的原因并没有用在安踏上。就将此算法用到了另外设计的一个生鲜上层的系统上。应用的场景是,通过商品的属性、用户行为等信息通过定时任务执行遗传算法来计算出一个商家利益最大化的每日推荐商品列表、站在每个用户角度角度的猜你喜欢列表(根据用户的行为特征不同)每个用户的列表都是不同的。遗传算法顾名思义就是运用了生物上的达尔文进化论的思想,我们需要想明白的是达尔文进化轮中有群体、群体中有个体、个体中会进行交叉遗传原创 2021-11-08 22:55:14 · 1560 阅读 · 2 评论 -
Java十大算法(七)——最小生成树之克鲁斯卡尔算法
算法思想克鲁斯卡尔算法与我们之前说的普利姆算法一样都是用来求最小生成树算法。所不同的是我们的普利姆算法是以点为中心的,但是我们克鲁斯卡尔算法是以边为中心的。在这个算法中我们也是需要进行是否构成回路判断的,代码分析类排序相关知识扩展算法代码public class KruskalCase { public static void main(String[] args) { //测试看看图是否创建ok String[]...原创 2020-10-11 21:13:22 · 438 阅读 · 0 评论 -
Java十大算法(六)——最小生成树之普利姆算法
最小生成树就是在我们的一些诸多点的联通图中(图中的边都是由权重的)找到权重和最小的边集合使得这些点相连相通,这就是我理解的最小生成树。普利姆算法是围绕点来进行的,在设U集合为点集合,V集合为我们已经访问过的集合。先找一个起始的坐标点,找到与这个点相连的权重最小的点,将找到的这个点加入集合V,接下来就在V集合中寻找可以与这些节点相连通的权值最小的点并且这个点加入V集合之后,V中的点不能构成回路。在做算法的时候我们应该注意代码总体的设计,代码中的方法职能要分离,返回的数据要尽可能的简单,参数的.原创 2020-10-10 16:48:24 · 292 阅读 · 1 评论 -
Java十大算法(五)——贪心算法之集合覆盖
算法描述贪心算法就是每一次都给我们的问题找一个靠近问题的最优解,个人理解贪心算法解题的核心点在于如何描述最优解?在我们逐步求解的过程中最优解是如何确定的。下面我们用一个贪心算法比较经典的案例来说明:这里的最优解我们可以描述为,可以包含最多有效城市的集合,在算第一个集合的时候肯定是那个集合size最大就先选那个集合,选第二个集合的时候有效城市集合就是总的城市集合中除去第一个已选集合中包含的城市剩下的城市集合。代码分析代码实现public class GreedyAlgorith.原创 2020-10-10 10:07:22 · 385 阅读 · 0 评论 -
Java十大算法(三)——动态规划指背包问题解决
动态规划算法与分治算法相似都是采取了将大的问题换分为小的问题在求解,不通的是动态规划算法每一个小问题的求解都是建立在前一个小问题的基础上的,也就是说他们的小问题之间是不相互独立的。在利用动态规划解决问题的时候关键是找到算法的状态转移方程即当前的小问题是如何和前面的小问题产生关联的。背包问题的解决是动态规划算法的一个经典应用,背包问题又可以分为01背包、完全背包。01背包问题指的是没见物品都中有一件,对于一个物品只有里两个状态,要么放入背包,要么不放入背包;完全背包指的是每件商品的个数都是无穷多的,只要能原创 2020-10-09 21:08:12 · 733 阅读 · 0 评论 -
Java常见的十大算法(二)——分治算法之汉诺塔
分治算法指的是将我们需要解决的问题分而解之,将大的问题分解成小的问题,算法最后的结果就是最后的那个小问题的解,分治算法中的小问题之间往往是可以独立的,不是相互依赖的。常见的诸多高效算法中都运用了分治算法的基础思想——二分搜索、大整数除法、合并排序、快速排序、傅里叶变换。在这里我们展示的是一个分治排序算法的经典运用——汉诺塔。...原创 2020-10-09 20:23:32 · 235 阅读 · 0 评论 -
Java十大算法(一)——非递归二分查找
在前面的文章中我们写过一篇关于二分查找的递归实现(https://blog.youkuaiyun.com/lmlzww/article/details/107029360)那么除过递归的实现方式还用一种实现便是我们的非递归实现,非递归二分查找算法的实现主要是...原创 2020-10-09 17:11:34 · 128 阅读 · 0 评论 -
java中的递归算法——迷宫问题与八皇后
递归,玩不好就是死龟~递归就是函数自己调用自己,在我们的JVM中存在一种叫做方法栈的概念,我们可以简单的理解为我们方法的每次调用执行都有一个独立的空间。递归之所以可以运用在于他一下的几个特性:在我们递归中对于应用型数据与数值型数据的差异在于我们Java中参数传递的本质都是值传递,一个传递的是他的本身二一个传递的是他的他值的引用。对于这一点的理解便于我们对递归中值的变化有一个基础了解。在使用递归的时候最关键的是要设置跳出递归的一个条件,不然的话就会出现死循环,造成我们的栈溢出。我们使用递归是为了解原创 2020-09-02 15:21:36 · 281 阅读 · 0 评论 -
逆波兰表达式的实现——中缀表达式转后缀表达式的实现思路与步骤
我们的表达式可以分为中缀表达式、前缀表达式、后缀表达式。在我们的上一篇博客中说了用Java栈来模拟实现综合计算器,在哪个算法中我们传递给程序的实际是中缀表达式,也就是我们最常见的表达式形式——操作符位于两个被操作数的中间,那么我们的前缀表达式、后缀表达式就是我们的操作符位于被操作数的之前、之后。前缀表达式、后缀表达式除过他们的操作符的位置有些不同外,就是在我们进行处理计算的时候前缀表达式是从右向左开始的但是我们的后缀表达式是从左向右开始的。他们操作的大致思路就都是,遇到操作数的话就将数入操作数栈,遇到操作符原创 2020-09-01 15:52:15 · 675 阅读 · 0 评论 -
Java用栈实现带括号的四则运算表达式计算
实现分析栈是我们计算机中的一种数据结构,它有着先进后出的数据特性。四则运算表达式实现的方式有多种,我们先用栈的数据结构来实现这个算法,在Java中是没有直接的栈结构的,所以要实现此算法,我们的工作有两步:用Java常见的数据类型设计stack类,并根据算法实现的需求设计合理的工具方法 理清实现思路用代码表述出来在这里我们的栈用数据来模拟实现,因为我们是用数组模拟实现的所以我们栈的大小一定是固定的,在我们存取数据的时候应该判断当前栈是否已经满了或是是否里面没有数据以避免数组访问越界,我们对数据的存原创 2020-08-31 22:43:47 · 3128 阅读 · 1 评论 -
Java单向链表实现约瑟夫环问题
据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着圆圈一直进行,直到最终原创 2020-08-20 13:24:35 · 982 阅读 · 0 评论 -
Java实现桶排序
桶排序的实现思路是很好理解的,代码的实现应该也是这所有这几种常见的算法中实现起来最好理解的。他就是将所有待比价的数值统一为相同的长度,然后从低位开始,依次进行排序。这样从最低位排序一直到最高位排序完成之后就变成了一个有序的序列。代码实现图解:代码实现:public static void radixSort(int[] arr) { int max = arr[0]; //假设第一数就是最大数 for(int i = 1; i < arr.length; i++) {..原创 2020-08-19 11:56:53 · 742 阅读 · 2 评论 -
Java快速排序算法的实现
快速排序算法就是找一个中间值把比这个值小的元素放在他的左边大的放在右边,再递归对左右两边的元素进行一个这样操作,直到所有的排序完成,在这个算法中在回溯的过程中我们并没有进行操作,其中较难理解的是我们算法结束的一个条件。1.比中间值大或是小的元素的个数是不确定的,那我们又是如何通过他们的交换来实现中间值位于中间呢?如何设计一个比较优雅的算法来实现呢?这是我们这个算法比较难以理解的地方2.算法如何结束,我们进行递归排序的结束条件是什么,如何控制我们的条件不断的往这个条件上靠拢呢?这一部分的解释说明在我们原创 2020-08-19 11:26:37 · 747 阅读 · 3 评论 -
Java归并排序的实现
归并排序有两个主要的核心步骤——拆分、合并。运用的分治的思想,在分解的过程中并没有执行具体的步骤,算法的排序实现是在合并的过程中产生的上面的过程中我们并不难看懂分解合并的过程,在代码实现中两个比较难以理解的地方是:1.我们知道这是一个以空间换时间的算法,其中会用到一个临时的数组,在我们mergerUtils()的方法中,有一个将临时数组中的元素赋值给元素组的过程?而且是原来的位置,可是为什么要这样呢?我们待合并的数组是存在于我们原数组的存储位置上的,由于我们的排序思路是左右两面同时开...原创 2020-08-18 23:58:14 · 2253 阅读 · 0 评论 -
插入排序、希尔排序的Java实现
插入排序属于内部排序,他的基本思想是把n个待排序的元素看成一个有序表、一个无序表,从无序表中挑选出元素,依次找到合适的位置插入有序表,直到无序表中的元素都插入到了有序表,n个元素变成了有序的。从上面的动图我们可以看出,在比较的过程中有一个元素移动的过程,这个移动的步骤是我们代码的最内部动作。有序、无序数组的长度变化过程是通过一个for循环实现的,在寻找插入位置的过程是由一个for循环控制的,这两个for循环是嵌套的,内层的循环长度收外层for的影响,在两个for循环之内是有一个if的判断体,这个判断原创 2020-08-13 23:35:56 · 139 阅读 · 0 评论 -
Java无向图链表、邻接表实现以及深度优先遍历广度优先遍历
概述图的存储形式中链表是通过数组加LinkedList(不一定是LinkedList,可以自己写链,也可以选择其他的集合数据结构),邻接表采用的是二维数组的结构。链表存储形式的相关实现数据存储结构与基础操作初始化数据存储结构private static LinkedList[] arrayLists;public static void createDatastruct(int count){ /** *@description:根据图中点的数量原创 2020-07-31 13:58:21 · 1637 阅读 · 0 评论 -
冒泡排序与选择排序的Java实现
冒泡排序 实现思路 代码实现 package sort;import java.util.Arrays;import java.util.Calendar;public class BubbleSort { static final int arrSize = 80000; static long longStartTime = 0; static long longEndTime = 0; public static void ..原创 2020-07-24 17:20:25 · 349 阅读 · 0 评论 -
Java数据结构与算法——二分查找与插值查找
二分查找在一定的局部空间内是从中间开始的,所以位于两端的元素的查找就会有一个较多的折半次数,才可以定位到目标元素。插值查找通过一个均值算法解决了二分法查找的这个缺点。在这里我们通过代码展现了递归实现以及非递归实现、查找序列中目标值的一个索引以及查找目标值的所有索引原创 2020-06-29 21:51:33 · 237 阅读 · 0 评论 -
Java数据结构与算法——顺序查找
常见的查找算法有顺序查找、二分查找、插值查找、黄金查找。顺序查找是最基本的查找方式,即按顺序比较,直到找到目标元素。原创 2020-06-29 19:22:36 · 393 阅读 · 1 评论 -
Java数据结构与算法——稀疏数组
对大量重复的元素不做重复记录,主要记录那些不同元素的数据信息以及位置信息以及原始 数组的行数、列数以及大量重复数据的数值是什么,需要复原的时候根据这些记录的信息来实现对原始数组的复原原创 2020-06-27 08:37:56 · 345 阅读 · 0 评论