【Zeus】算法
文章平均质量分 74
GTW_Zeus
猪宝盆科技CEO@掘金同名,有事急联ZeusCode
展开
-
算法系统学习-轻轻‘撬’开算法的入门
对解决问题的求解步骤的描述,在计算机中表现为指令的有限序列,并且每天指令表示一个或多个操作。其实算法并不是个陌生词汇,例如小学的加减乘除中“先算乘除,后算加减”就是四则运算的算法。到后面文章要讲的指数运算,矩阵运算以及其他的代数运算都是一种算法。简单来说:算法就是你解决问题的技巧和方式。2.面向对象方法:所谓的对象是包含数据和对数据操作代码的实体,或者是说在传统的数据结构中加入一些被称为成员函数的过程,因而赋予对象以动作。(因为这个方法是比较主流的编程思想具体不过多阐述)PAD图(问题分析图)伪代码:是用介原创 2022-07-13 18:17:52 · 1166 阅读 · 0 评论 -
算法系统学习-xdm,时间复杂度到底是个啥?
在不考虑机器对算法的影响,我们对一个算法主要从时间效率和空间效率两个维度上考虑。简单理解是就是执行完该算法所用的时间,一般用bigO表示,它是数量级Order的第一个字母。一个算法转换程序后所耗费的时间,主要取决与算法中执行重复执行的次数,即与语句中的频度有关(下面有详细介绍)(这是学习算法的核心,也是无法绕开的一个问题。)T(n)就是我们常说的时间复杂度,O是数量级的符。虽然上面会有一点点难以理解,但是实际上采用的是 从算法中选取一种对于说研究的问题来说是基本的原操作,以该基本操作在算法中重复执行的原创 2022-07-13 18:16:55 · 1053 阅读 · 0 评论 -
算法系统学习-牛刀小试几个小Case(非递归算法)
拓展:仅仅依赖于问题规模的时间复杂度,这类问题的操作都具有普遍性,也就是说对所有的数据均等价地处理。(这里问题较为容易)分析:以上三条单个语句的频度都是为1,该算法段的执行时间是一个与问题规模n无关的常数,所以算法的时间复杂度为常数阶 ,即T(n)=O(1);注意:只要不随问题规模n的增加而增长,即使算法中有上千条语句,时间复杂度仍然是一个比较大的常数而已。因此此类算法的时间复杂度为O(1)分析:当有若干个循环语句时,算法的时间复杂度是由于嵌套层数最多的循环语句中最内成循环的频度 f(n原创 2022-07-13 18:15:21 · 295 阅读 · 0 评论 -
算法系统学习-最最简单递归算法分析和迭代法
构造算法中的两个步骤:递归算法如下(以n=3为例) 调用过程为:f(3)--f(2)--f(1)--f(2)---f(3)---- 递归 -->-------回溯------->递归调用其实是一个降低规模的过程,和一般算法一样,算法的起始模块通常也是终止模块。当规模降为1 时,即递归到f(1)时,满足停止条件停止递归,开始回溯并计算。先将递归算法简化成对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和。再估计和的渐近阶,或者,不求级数的和耐而直接估计级数的渐近阶,从而达到对递归原创 2022-07-13 18:13:50 · 634 阅读 · 0 评论 -
算法系统学习-兔子生兔子(迭代算法-正推法)
也称是一种不断用变量的旧值递推出新值的解决问题的方法。一般用于数值计算,常见的累加,累乘都是迭代算法策略的基础应用。递推法算法是最基本的表现形式,从小规模的问题推解出大规模问题的一种方法,也称其“正推”。如累加过程就是求出前n-1项和的基础上推出前n项和的,递推公式是Sn=Sn-1 +An。 由于无须保存每次的累加结果。所以用一个迭代变量s存储每次的累加结果,累加对象存储在变量a中,这样的递推公式就抽象成 “循环不变” 的累加式: S=s+a用枚举法:将问题的求解过程以及各种不同情况一一列举出来,从中发现解原创 2022-07-13 18:12:41 · 828 阅读 · 0 评论 -
算法系统学习-正的麻烦反着来呗!(迭代算法-倒推法)
所谓的倒推法,是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法,正向推理比较麻烦时,反而在逆向推理中更加巧妙地解决问题。一只小猴子摘了若干个桃子,每天吃总数的一半多一个,到第十天的时候就剩一个桃子,请问原来有多少桃子?每天的桃子总数为a10=1, a9=(1+a10)*2, a8=(1+a9)*2, .....由于每天的桃子数只依赖前一天的桃子数,所以用一个迭代变量代表桃子个数就可以了ai=(1+ai)*2 i 取值为9,8,7,6,5,4....1由一个简单的小case对倒推法有一个简..原创 2022-07-13 18:11:49 · 547 阅读 · 0 评论 -
算法系统学习-水仙花数是啥花?(蛮力算法补充)
首先水仙花必须是三位数,那么为数据的范围自然而然是【100,999】,可知每个数都是三位数,那只需要令a,b,c分别等于三个数,然后求出它们的立方和是否等于这个三位数,如果是则就是水仙花数。那只需要枚举这个区间内所有的数,统计水仙花数的个数即可。完数问题Case2:判断两个数正整数之间完数的个数算法分析:根据定于预处理的枚举出1-10000以内的完数有哪些,然后用各数ans【i】存1~i以内的完数个数,这样就可以直接判断某个区间内的完数个数。 比如区间【a,b】那答案就是ans【b】-原创 2022-07-12 09:48:53 · 279 阅读 · 0 评论 -
算法系统学习-大事化小,小事化了(分而治之)
主要的设计思想是:将一个难以解决的大问题,分割成几个规模较小的相似问题,逐个击破。其实这个算法并不陌生,在数据结构中很常见例如:折半查找,合并排序,快速排序,二叉树遍历(先左后右),二叉树排序树的查找算法。可以用一个递归过程表示,分治法就是一种大规模问题与小规模问题关系的方法,是递归设计方法的一种具体策略,分治法在每一层递归上一般分为三个步骤:老板有一袋金块(共n块)。最优秀的雇员得到其中的最重的一块,最差的雇员得到最轻的一块,假设有一台比较重量的仪器,请使用最少的比较次数找出最重的金块比较简单的方法是逐个原创 2022-07-12 09:47:35 · 534 阅读 · 0 评论 -
算法系统学习-找第k小值(非等分分治)
现实中常见的应用就是寻找中值元素(中值是一个很有用的统计量,例如中间工资,中间年龄,中间重量等),因此经常会遇到在“一组数据中取第k小的值”。按照以前的最好的排序算法的复杂性是O(nlogn),但我们可以利用二分法将复杂度降为O(n),可这个二分法不是简单典型的二分法分解成完全独立,相似的两个问题,因为在选出分解后第一组的第k小的数据和第二组的第k小的数据,不能保证这两个数据之一是原问题的解。求一组数的第二小的数在用二等分法分解的两个子集中,无论只选取第二小数据或只选取最小的数据,合并处理后都有可能得不到原原创 2022-07-12 09:46:34 · 643 阅读 · 0 评论 -
算法系统学习-老板找零,别找那么多张(贪心算法)
假设有面值 5元,2元,1元,5角,2角,1角的货币,需要找给顾客4元6角现金,但必须要求付出货币数量最少。在付款问题中,每一步的贪心选择中,在不超过应付金额的条件下,只能选择面值最大的货币,而不去考虑在后面看这种选择是否合理,而且它还不会改变决定,一旦选择了一张货币,就永远选定,也就是无后性贪心算法其实在数据结构中也常见到:霍夫曼树,构造最小生成树的Prim算法和Kruskal算法。贪心算法没有固定的算法框架,核心在与贪心策略的选择,一定要注意的是选择的贪心策略要具有无后性(即某阶段的状态确定过后,不受这原创 2022-07-12 09:45:12 · 579 阅读 · 0 评论 -
算法系统学习-贪心策略(可绝对贪婪问题详解)
在位数固定的前提下,让高位的数字尽量小,其值就越小,依据贪心策略就可以解决这个问题。但是数据的不同也会造成不同种情况的出现,例如 假设1,假设2,假设3n=“12435863” s=2(去掉两个数)开始最后输出 12356 为最小数结束因此,可得相邻数字只需要从前向后比较;n=“231183” s=3(去掉三个数)开始最后输出 113 为最小数结束因此,可得当第i位与第i+1位比较,若删除第i位后,必须向前考虑第i-1位与第i+1位进行比较,才能保证结果的正确性。假设3:n=“123456” s=3(去掉三原创 2022-07-12 09:44:31 · 1036 阅读 · 0 评论 -
算法系统学习-取数先取如何必定获胜?(相对或近似贪心)
有AB 两个人轮流取2n个数中的n个数,取数之和大者为胜,若相同则先取者胜。请用算法让先取数的人胜(取数时只能看到2n个数的两边的数,即每次都只能看到该头和尾)假设这组数为:6,16,27,6,12,9,2,11,6,5。用贪心策略每次两人都取两边的数中较大的一个数用贪心算法的情况来看:假设A,B两人取数,每次都只能取两边,那么6,16,27,6,12,9,2,11,6,5,先取者胜,以A先取,取数结果为:所以A胜出但是如果数据的不同也将会影响结果假设这组数据为:16,27,7,12,9,2,11,6 如果原创 2022-07-12 09:43:27 · 2040 阅读 · 1 评论 -
HashMap详细讲解
HashMap最早出现在JDK1.2中,是基于Map接口的实现,储存的内容是键值对(key-value),HashMap中的键和值都可以为null。HashMap的实现并不是同步的,也就是说它不是线程安全的。在JDK1.8中,HashMap的数据结构为,红黑树是HashMap在JDK1.8新引入的数据结构,主要是为了解决链表过长导致查询效率变成O(n)的问题。当插入一个键值对时,HashMap会根据key计算出hash,再根据hash确定在数组中的位置,如果发生hash碰撞,将使用链表的形式储存,当链表过长原创 2022-07-12 09:41:26 · 256 阅读 · 0 评论 -
排序算法-基数排序详细讲解(RadixSort)
public static int getNumLength(int num){ if(num == 0) return 1; int count = 0; for (int i = num; i != 0; i /= 10) { count++; } return count; } public static void RadixSort(int[] array){ in原创 2022-07-12 09:37:22 · 253 阅读 · 0 评论 -
排序算法-桶排序详细讲解(BucketSort)
桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。桶排序 (Bucket sort)的工作的原理:假设输入数据服从均匀分布,将数据分到有限数量的桶里,每个桶再分别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排)。为了使桶排序更加高效,我们需要做到这两点:同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。 public static void bucketSort(int[] arr){ if (arr.lengt原创 2022-07-12 09:36:22 · 712 阅读 · 0 评论 -
排序算法-计数排序详细讲解(CountSort)
前提是确定了取值范围有限的数组,利用数组下标来确定元素的正确位置时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性O(n+k)O(n+k)O(n+k)O(k)稳定当数列最大和最小值差距过大时,并不适合做计数排序当数列元素不是整数时,也不适合用计数排序...原创 2022-07-11 17:21:33 · 325 阅读 · 0 评论 -
排序算法-归并排序详细讲解(MergeSort)
归并,指合并,合在一起。归并排序(Merge Sort)是建立在归并操作上的一种排序算法。其主要思想是分而治之。若将两个有序集合并成一个有序表,称为2-路归并,与之对应的还有多路归并。借助一个辅助空数组,把左右两边的数组按照大小比较,按顺序放入辅助数组中即可。以下面两个有序数组为例:public static void mergeSort(int[] arr){ if (arr == null || arr.length<2){ return;原创 2022-07-11 17:20:49 · 18074 阅读 · 8 评论 -
排序算法-堆排序详细讲解(heapSort)
每次将堆顶元素取出,与末尾元素交换,调整前n-1个元素,使其仍然成堆,重复上述过程,直到剩余元素为1时为止,即可得到非递减序列 public static void downAdjust(int [] array,int parentIndex,int length){ //temp保存父节点值,用于最后的赋值 int temp=array[parentIndex]; int childIndex=2*parentIndex+1; while原创 2022-07-11 17:20:13 · 298 阅读 · 0 评论 -
排序算法-选择排序详细讲解(selectSort)
1.找到数组中最大(或最小)的元素2.将它和数组的第一个元素交换位置(如果第一个元素就是最大(小)元素那么它就和自己交换)3.在剩下的元素中找到最大(小)的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序public static void selectionSort(int[] arr){ //清洗数据 if (arr == null || arr.length<2) { return; }原创 2022-07-11 17:19:32 · 305 阅读 · 0 评论 -
排序算法-希尔排序详细讲解(ShellSort)
一种基于插入排序的快速的排序算法。简单插入排序对于大规模乱序数组很慢,因为元素只能一点一点地从数组的一端移动到另一端。希尔排序为了加快速度简单地改进了插入排序,也称为缩小增量排序。是一种不稳定排序算法希尔排序是把待排序数组按一定的数量分组,对每组使用直接插入排序算法排序;然后缩小数量继续分组排序,随着数量逐渐减少,每组包含的元素越来越多,当数量减至 1 时,整个数组恰被分成一组,排序便完成了。这个不断缩小的数量,就构成了一个增量序列,这里的数量称为增量(其实也叫步长)public static void原创 2022-07-11 17:18:49 · 478 阅读 · 0 评论 -
排序算法-插入排序算法详细讲解(InsertSort)
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到全部待排序记录全部插入为止。类似于打牌时插入,时间复杂度为O(n^2),是一种稳定排序。原创 2022-07-11 17:18:14 · 415 阅读 · 0 评论 -
排序算法-冒泡排序详细讲解(BubbleSort)
把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻元素时,位置不变。冒泡排序是一种稳定的排序(稳定的定义,如果相同的元素在排序前和排序后位置不变则稳定),平均时间复杂度为 O(n^2)public static void bubbleSort(int array[]){ for(int i=0;i<array.length;i++){ for(int j=0;j<array.length-1-i;j++){原创 2022-07-11 17:17:05 · 1047 阅读 · 0 评论 -
排序算法-快排详细讲解(QuickSort)
快速排序作为经典的排序算法之一,其实也用到了冒泡排序的思想,冒泡排序是每一轮将最大(最小)的元素放到一端,而快速排序是每一轮找出比基准元素大、小的所有元素,然后放在基准元素的两边。是分治法体现之一。只从数组的一边对元素进行遍历和交换。首先选定基准元素pivot,同时,设置一个mark指针指向数列起始位置,这个mark指针代表 小于基准元素的区域边界/** * * 单边循环法 * */ public static void quickSort(int []原创 2022-07-11 16:57:31 · 1551 阅读 · 0 评论