HOME 首页
SERVICE 服务产品
XINMEITI 新媒体代运营
CASE 服务案例
NEWS 热点资讯
ABOUT 关于我们
CONTACT 联系我们
创意岭
让品牌有温度、有情感
专注品牌策划15年

    算法优化要考虑的内容(算法优化要考虑的内容不包括)

    发布时间:2023-04-19 08:30:25     稿源: 创意岭    阅读: 124        

    大家好!今天让创意岭的小编来大家介绍下关于算法优化要考虑的内容的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。

    开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等

    只需要输入关键词,就能返回你想要的内容,越精准,写出的就越详细,有微信小程序端、在线网页版、PC客户端

    官网:https://ai.de1919.com

    创意岭作为行业内优秀的企业,服务客户遍布全球各地,如需了解SEO相关业务请拨打电话175-8598-2043,或添加微信:1454722008

    本文目录:

    算法优化要考虑的内容(算法优化要考虑的内容不包括)

    一、SEO算法基础优化有哪些

    这是樱花总结的,你可以看一下

    1、网站结构是否属于扁平化和立体化

    扁平化,URL是否具有可读性,是否符合SEO优化规则

    立体化,网站有推荐阅读,面包屑,网站导航,网站地图,内链部署模块,友链模块,网站404页面等

    2、用户需求

    3、诊断页面SEO元素,TDK,H1,Alt(代替标签),首页部署品牌词,产品页面部署产品词,评论页面部署问答词等,以及页面内关键词的部署密度。

    4、robots文件合理编写

    5、诊断数据统计工具,确保我们分析网站流量数据

    6、分析行业现状,分析竞争对手SEO指标,竞争对手关键词词库,SEO产品建设,行业所处的位置,提升空间,同行的差距

    分析竞对手的优势和劣势,制定相应的策略及方案

    8、SEO效果预估,在一定时间内实现什么样的效果,比如0-1个月网站收录,外链,挖掘长尾关键词,重点热点关键词

    9、外链建设

    二、如何把握算法多样化和优化?

    随着课堂教学改革的深化和《数学课程标准》出台,对计算教学提出了新要求,“应重视口算,加强估算,提倡算法多样化”的理念,给计算教学的课堂带来了新的活力,在不少老师的课堂上,算法多样化的理念能得到很好的体现,一道计算题通过教师的悉心引导,同学们的积极思考,奇思妙想层出不穷,学生课堂表现异常活跃,“算法多样化”成为小学数学教学中关注的一个热点。在计算教学中,我们如何把握算法多样化和优化,不使教学流于形式呢?

    围绕这个问题,我们宾阳县也开展了教研活动,教师们在把算法多样化具体落实在到教学实践时,出现了不少的困惑和误区;在我们学校,老师们也以此确立了一个校级课题,进行研究, 真正开展起来确实觉得对《数学课程标准》中提出的“算法多样化”这一理念的理解比较模糊,在操作上也有很多疑惑,难以把握好算法多样化教学的尺度;通过教研室组织的培训,不断学习、实践和反思,摸爬滚打中我们有了一些自己的体会:

    一、算法多样化不等于算法全面化

    算法多样化是一个学习共同体为解决某一个问题,通过动手实践、自主探索和合作交流后形成的多种计算方法的集合体。它是针对一个学习共同体而言的,绝不是针对某一学习个体而言。多样化并不意味着追求全面化。

    首先,提倡算法多样化并不是把所有的算法都要想出来。如教学13减9得几时,学生只想到了以下四种方法:

    (1)先摆13根小棒,再拿走9根,还剩4根;

    (2)算减法想加法,因为9加4得13,把以13减9得4; (3)先从10里减9得1,1再加3得4;

    (4)先算13减3得10,再算10减6得4。

    除了学生想到的四种方法,还有其它方法,如:9减3得6,10再减6等于4。但学生没有说出,如果教师刻意追求,反复启发,千呼万唤才得了出来,说明这种方法远离儿童的认知最近发展区,强行让学生接受这种方法就会加重学生负担,无益于学生的发展。算法多样化教学,是教学生,不是教教材,不能为了追求全面而让学生把大量的时间花费在某些难懂的解题方法上,只要不影响后续的学习,最好淡化形式,注重实质。

    其次,算法多样化不能要求每个学生都要想出一种或几种不同的计算方法,不能无原则地降低数学思考的要求。每个学生都有自己的特点,学生在学习数学方面的差异是客观存在的。在算法多样化教学中要针对不同的学生提出不同的要求。对已经想出一种方法的学生,教师应给予充分的肯定并鼓励他们继续探索;对于没有想出算法的学生,在肯定他们已经积极动脑、努力探索的基础上,要求他们学会倾听别人的想法、听懂别人的方法。同时要求他们在今后的学习中更加努力的探索,期望有更大的进步。

    第三、算法多样化教学并非要求每个学生掌握多种算法。算法多样化教学鼓励学生用不同的方法探索和解决问题,但决不能要求每个学生都掌握多种算法。教学中,教师可在引导学生了解不同的解题方法,体验解题策略的多样性,引导学生对各种方法进行分析、比较的基础上,提出不同的要求。对学有余力的学生,可鼓励他们掌握两种或两种以上自己喜欢的方法,以开阔其视野;对学困生,只要他们能掌握一种适合自己的方法就可以了。

    认识到算法多样化并非算法全面化、不是一定要达到预期的几种算法,更不是一定要呈现教材中出现的每一种算法;也不是让每一个学生都得掌握其中的每一种算法,而是从学生的自身认知水平出发,以开放、宽容的态度等待、处理算法多样化教学,让学生尽量获得成

    功的体验,感受到自我探索的价值和数学学习的乐趣,促进学生的可持续发展,这才是倡导算法多样化的目的所在。

    二、多中选优,择优而用

    “多样化”后干什么?回答是肯定的:“优化!”因为算法多样化并不是单纯意义上的计算方法多样化,比之更重要的还有 相应的优化的过程,“多中选优,择优而用”的思想方法,是学生的学习和生活中不可缺少的,也是发展学生数学思维、培养学生创新意识的重要方法。在研究中我们有的教师片面的认为算法多样化就是学生讲的方法越多越好,刻意地追求算法的多样化,忽略了算法的优化,从一个极端走向另一个极端,造成了计算教学的低效;也有的教师认为,如果对算法进行优化,那就谈不上算法多样化了,似乎多样化与优化之间存在矛盾,其实不然,算法优化是学生个体的学习、体验和感悟的过程,如果不对算法进行优化,我们的学生就没有收获、没有提高。

    1、构筑多样化与优化的桥梁。

    算法多样化并不是单纯意义上的计算方法多样化,计算方法没有好坏之分,但有繁简之别,我们要清楚, 每一种看似复杂或简单的计算方法之后,跟我们所要最终优化的方案,有哪些潜在的联系。如教学9加几的计算方法中,有摆小棒、数数、用计数器、凑十法等,凑十法是最简单也是最实用的方法,而摆小棒、数数、计数器都与凑十法有一定联系,象摆小棒过程中,学生是一根一根数的,教师就可以引导学生凑足十根捆成一捆,再数剩下几根,让大家一眼就看出一共是几根,既简单形象又渗透了“凑十”的概念;计数器具更是对凑十法的应用,个位上凑足了十个珠,再加上个位剩下的珠子,9+3一共等于几。此时,教师如果能将这些方法的内在含义通过操作演示给学生,并适时小结9加几的加法怎么样算最简便,让学生对凑十法从直观到抽象都有深刻的理解,这样才能促使学生对自己所选择的方法。

    三、优化算法

    动量法、AdaGrad、RMSProp、AdaDelta、Adam

    在7.2节(梯度下降和随机梯度下降)中我们提到,目标函数有关自变量的梯度代表了目标函数在自变量当前位置下降最快的方向。因此,梯度下降也叫作最陡下降(steepest descent)。在每次迭代中,梯度下降根据自变量当前位置,沿着当前位置的梯度更新自变量。然而,如果自变量的迭代方向 仅仅取决于自变量当前位置,这可能会带来一些问题

    可以看到,同一位置上,目标函数在竖直方向( 轴方向)比在水平方向( 轴方向)的斜率的绝对值更大。因此,给定学习率,梯度下降迭代自变量时会使自变量在竖直方向比在水平方向移动幅度更大。那么,我们 需要一个较小的学习率 从而避免自变量在竖直方向上越过目标函数最优解。然而,这会造成自变量在水平方向上 朝最优解移动变慢

    试着将学习率调大一点,此时自变量在竖直方向不断越过最优解并逐渐发散。

    动量法的提出是为了解决梯度下降的上述问题。

    其中,动量超参数 满足 。当 时,动量法等价于小批量随机梯度下降。

    因此,在实际中,我们常常将 看作是最近 个时间步的 的值的加权平均。

    现在,我们对动量法的速度变量做变形:

    优化算法中,⽬标函数⾃变量的每⼀个元素在相同时间步都使⽤同⼀个学习率来⾃我迭代。在“动量法”⾥我们看到当x1和x2的梯度值有较⼤差别时,需要选择⾜够小的学习率使得⾃变量在梯度值较⼤的维度上不发散。但这样会导致⾃变量在梯度值较小的维度上迭代过慢。动量法依赖指数加权移动平均使得⾃变量的更新⽅向更加⼀致,从而降低发散的可能。 本节我们介绍AdaGrad算法,它根据⾃变量在每个维度的梯度值的⼤小来调整各个维度上的学习率,从而避免统⼀的学习率难以适应所有维度的问题。

    AdaGrad算法会使⽤⼀个小批量随机梯度gt按元素平⽅的累加变量st。在时间步0,AdaGrad将s0中每个元素初始化为0。在时间步t,⾸先将小批量随机梯度gt按元素平⽅后累加到变量st:

    其中⊙是按元素相乘。接着,我们将⽬标函数⾃变量中每个元素的学习率通过按元素运算重新调整⼀下:

    其中η是学习率,ϵ是为了维持数值稳定性而添加的常数,如10的-6次方。这⾥开⽅、除法和乘法的运算都是按元素运算的。这些按元素运算使得⽬标函数⾃变量中 每个元素都分别拥有⾃⼰的学习率

    需要强调的是,小批量随机梯度按元素平⽅的累加变量st出现在学习率的分⺟项中。因此,

    然而,由于st⼀直在累加按元素平⽅的梯度,⾃变量中每个元素的学习率在迭代过程中⼀直在降低(或不变)。 所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到⼀个有⽤的解

    当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于 学习率过小 ,可能较难找到⼀个有⽤的解。为了解决这⼀问题,RMSProp算法对AdaGrad算法做了⼀点小小的修改。

    不同于AdaGrad算法⾥状态变量st是 截⾄时间步t所有小批量随机梯度gt按元素平⽅和 ,RMSProp算法将这些梯度 按元素平⽅做指数加权移动平均 。具体来说,给定超参数0 ≤ γ < 1,RMSProp算法在时间步t > 0计算:

    和AdaGrad算法⼀样,RMSProp算法将⽬标函数⾃变量中每个元素的学习率通过按元素运算重新调整,然后更新⾃变量:

    其中η是学习率,ϵ是为了维持数值稳定性而添加的常数,如10的-6次方。因为RMSProp算法的状态变量st是对平⽅项gt ⊙ gt的指数加权移动平均, 所以可以看作是最近1/(1 − γ)个时间步的小批量随机梯度平⽅项的加权平均。如此⼀来,⾃变量每个元素的学习率在迭代过程中就不再⼀直降低(或不变)。

    除了RMSProp算法以外,另⼀个常⽤优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有⽤解的问题做了改进。有意思的是,AdaDelta算法没有学习率这⼀超参数。

    AdaDelta算法也像RMSProp算法⼀样,使⽤了小批量随机梯度gt按元素平⽅的指数加权移动平均变量st。在时间步0,它的所有元素被初始化为0。给定超参数0 ≤ ρ < 1(对应RMSProp算法中的γ),在时间步t > 0,同RMSProp算法⼀样计算:

    与RMSProp算法不同的是,AdaDelta算法还维护⼀个 额外的状态变量∆xt ,其元素同样在时间步0时被初始化为0。我们使⽤∆xt−1来计算⾃变量的变化量:

    最后,我们使⽤∆xt来记录⾃变量变化量 按元素平⽅的指数加权移动平均:

    Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。

    Adam算法使⽤了 动量变量vt 和RMSProp算法中 小批量随机梯度按元素平⽅的指数加权移动平均变量st ,并在时间步0将它们中每个元素初始化为0。给定超参数0 ≤ β1 < 1(算法作者建议设为0.9),时间步t的动量变量vt即小批量随机梯度gt的指数加权移动平均:

    接下来,Adam算法使⽤以上 偏差修正 后的变量 v ˆ t s ˆ t ,将模型参数中每个元素的学习率通过按元素运算重新调整:

    其中 η 是学习率, ϵ 是为了维持数值稳定性而添加的常数,如10的-8次方。和AdaGrad算法、RMSProp算法以及AdaDelta算法⼀样,⽬标函数⾃变量中每个元素都分别拥有⾃⼰的学习率。最后,使⽤ 迭代⾃变量:

    四、数据结构和算法优化

    APP的优化是任重而道远的过程,必须在意每一个环节,否者当你想要优化的时候,发现到处都是坑,已经不知道填补哪里了,所以我们必须一点一滴的做起。

    数据结构和算法优化

    能带来什么好处呢?他能使得你程序获得数据更快,内存占用更合理。最终体现为响应快内存占用小。

    我们先看常见的数据结构类型特点

    数组 : 一片物理上连续的大小确定的储存空间 。int[num]

    顺序表 :物理上连续、逻辑上连续、大小可以动态增加。ArrayList (查找快,添加删除慢)

    链表 :物理上不连续、逻辑上连续、可以动态增加和删除节点。LinkedList (查找慢只能轮寻,增加删除快)

    物理上连续:数组或者链表在初始化的时候,会申请分配内存空间:只要存储空间足够你申请的大小就分配给你初始化(物理不连续);必须要连续的存储空间,我才给你分配,否则失败(物理上连续)

    那么有没有继承纯虚标和链表的2个有点的数据结构呢?HashMap!     

    HashMap

    它是由数组和链表结合组成。(HashMap:JDK1.7之前 24 之前: 数组+ 链表; HashMap:JDK1.8 之后:  数组+ 链表 + 红黑树)

    下面是HashMap结构图

    它是怎么操作的呢?为什么他能同时拥有顺序表和链表的优点呢?  搞清它的实现方式,我们就可以知道了, 大致可以分为以下的步骤。

    ①put方法,传入object和value,通过hash运算得到一个int类型的hashcode,这里假设为X(后续X为这个hashcode)。

    ②hashmap内部是有一个table数组+链表形成的。我们拿到这个X后,使用X/table.length(hashcode值/table[].length),得到一个小于table.length的值M,该值就是这个value应该放置的数组位置。我们准备把value放入table[M]中。

    ③我们把hashcode和value打包为一个node节点(为什么需要这么打包后续会提到),准备存入table[M]中。

    ④出入table数组的链表中有2种方式:

    前插方式:不管数组table[M]节点有值与否,都把这个准备插入的node节点作为数组的根节点。可能出现2种情况:

    (1)如果table[M]节点没有值,则node节点作为数组的根节点。

    (2)如果table[M]节点已存在数据链表,就把这些数据链表,链到这个准备插入的node节点上,以弄得节点为根节点放入table[M中]。

    后插方式:可能会出现的2种情况

      (1)   如果table[M]节点没有值,则node节点作为数组的根节点。

    (2)如果table[M]节点已存在数据链表,则把node节点链到该数据链表的最后一个节点上。

    经历以上4个步骤就完成了hashmap的插入操作,现在解释一下为什么要打包为node节点。

    举个栗子,假如hashmap.length=16,我们准备存入ObjectA(OA)和ObjectB(OB),假设OA经过hash运算得到的hashcode是1,OB经过hash运算得到hashcode是17,OA和OB进行求模运算结果都为1,链到链表上时,我们get方法的时候怎么取到正确的值呢,因为链表上的模运算都是1.这个时候我们就需要通过hashcode来识别这个链表上的哪个值是OA的value哪个是OB的value,因为我们已经把hashcode和value打包起来了。

    补充

    hashmap的table数组的大小事是2的次幂(不要问为什么,源码定的,他们肯定经过大量的统计或者运算,这是科学)。table数组默认的长度是16,也就是说你new一个空的hashmap长度为16,当然也提供了一个给你设置长度的方法,但是假如你设置17,则长度会为32,这不难理解。

    hash碰撞

    hash碰撞就是,假如OA、OB...ON经过模运算得到的数组位置相同,那么他们都会挂在这个数组节点的链表上,极端情况想整个hashmap看起来像单链表。但这种情况这并不是我们想要的结果。我们可以通过扩容来尽可能的避免hash碰撞。

    扩容 :(意义,在于避免大量的hash碰撞,因为在某些极端情况下,有点像单链表)

    阈值 :阈值=table.length* DEFAULT_LOAD_FACTOR (扩容系数,默认为0.75,也可以自己设定,一般不做修改)

    hashmap定义:当hashmap中的元素个数超过阈值大小时,我们就需要对table数组进行2倍扩容,如从16→32。

    注意:扩容后hashmap会调用resize(),对hashmap内的数据重新计算所有元素的位置 。 。因为假如你之前17/16=1,现在17/32=17,你的位置发生变化了。

    缺点 :

    hashMap因为有阈值的扩容机制,所以一定会有空间浪费,比如0.75的时候,一定有25%空间被浪费掉了。空间换时间。

    hashmap是线程不安全的。因为可能在一个线程扩容(resize()方法执行)的情况下,另外一个线程在get,但是拿不到之前的数据了,因为扩容。所以是线程不安全的。或者线程扩容(resize()方法执行时,多线程进行put的时候导致的多线程数据不一致。

    如何线程安全的使用HashMap?使用使用锁分段技术或者使用HashTable(Hashtable的方法是Synchronize的,而HashMap不是,其实也就是锁机制起作用)。

    SparseArray(Android为了优化内存所提供的api)

    特性:key为int,value为object,二分查找的思想,双数组,删除的时候节点不删除,而是把value删除,避免删除的时候数组还要移动。

    SparseArray比HashMap更省内存,在某些条件下性能更好,主要是因为它避免了对key的自动装箱(int转为Integer类型),它内部则是通过两个数组来进行数据存储的,一个存储key,另外一个存储value,为了优化性能,它内部对数据还采取了压缩的方式来表示稀疏数组的数据,从而节约内存空间,我们从源码中可以看到key和value分别是用数组表示。

    为什么是能够进行二分查找呢?从源码上看key和value分别是用int类型数组和object数组表示,所以这也是SparseArray的局限性。

     private int[] mKeys;

     private Object[] mValues;

    为什么说SparseArray比HashMap更省内存,在某些条件下性能更好?

    因为SparseArray有以下一个特性,首先它是2个数组,在数据查找的时候无疑会比hashmap快很多,其次在删除的时候,SparseArray并不会把数组key位置进行删除,而是把key的索引value置位DELETE标志(这样就避免了数组delete操作后的arraycopy的操作)。当我们下次进行插入的时候,若要插入的位置key的索引value为DELETE标志,则把数据覆盖给value(只是经历了set操作,并无其他操作)。否则进行add操作(包含arraycopy)。

    所以经过以上的情况,我们可以看出,SparseArray相对于HashMap,会越用越快。

    缺点

    (1)SparseArray仅仅能存储key为int类型的数据。

    (2)插入操作需要复制数组,增删效率降低 数据量巨大时,复制数组成本巨大,gc()成本也巨大。

    (3)数据量巨大时,查询效率也会明显下降。

    (4)线程不安全问题,类似hashmap

    一般我们在满足下面两个条件我们可以使用SparseArray代替HashMap:

    (1)数据量不大,最好在千级以内

    (2)key必须为int类型,这中情况下的HashMap可以用SparseArray代替:

    ArrayMap(Android为了优化内存所提供的api)

    ArrayMap和SparseArray差不多,不同的是key类型可以是object类型。

    ArrayMap的2个数组,一个数组记录key的hash值,另外一个数组记录Value值。其他存储方式和运行思想和SparseArray一致。

    线程不安全:hashmap、ArrayMap、SparseArray

    以上就是关于算法优化要考虑的内容相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。


    推荐阅读:

    算法的五种描述方法(算法的几种描述方式)

    伪随机算法

    快速排名新(快速排名新算法)

    微博推广(微博推广平台)

    重庆一家和兴装饰公司(重庆一家和兴装饰公司案件)