php算法之选择排序

functionselect_sort($arr){//实现思路取出第一个下标为假设的最小值然后和后面的元素比较,算出真正最小值的下标,如果不是假设的下标,则把两个元素互换//双重循环完成,外层控制轮数,当前的最小值。内层控制的比较次数//$i当前最小值的位置,需要参与比较的元素//$i<=$len-2,是因为只取到倒数第二个元素for($i=0,$len=count($arr);$i<=$len-2;$i++){//先假设最小的值的位置$p=$i;//$j当前都需要和哪些元素比较,$i后边的。for($j=$i+1;$j<$len;$j++){//$arr[$p]是当前已知的最小值if($arr[$p]>$arr[$j]){//比较,发现更小的,记录下最小值的位置;并且在下次比较时,//应该采用已知的最小值进行比较。$p=$j;}}//已经确定了当前的最小值的位置,保存到$p中。//如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可if($p!=$i){$tmp=$arr[$p];$arr[$p]=$arr[$i];$arr[$i]=$tmp;}}/...
代码星球 代码星球·2020-04-08

php算法之插入排序

//插入排序算法//总结很简单soeasy//拿数组的第二个元素到最后一个元素分别与此元素前面的元素作比较,如果元素值小于前面的元素,则两个元素互换位置。//也就是拿一个元素与从小到大排好顺序的元素做比较,如果小于前面的元素就换位置,直到大于前面的元素为止。//外层for控制将要插入的元素,内层for控制做比较的元素。$arr=[4,2,3,9,5,6];functioninsertsort($arr){$length=count($arr);for($i=1;$i<$length;$i++){for($j=$i-1;$j>=0;$j--){if($arr[$i]<$arr[$j]){$temp=$arr[$i];$arr[$i]=$arr[$j];$arr[$j]=$temp;}else{break;}}}return$arr;}$result=insertsort($arr);print_r($result); ...
代码星球 代码星球·2020-04-08

php算法----直接插入排序

算法引入扑克牌是我们几乎每个人都玩过的游戏。平时我们开始的时候一般都是一个人发牌,其他人都是一边摸牌,一边理牌,假如你摸上的第一张牌是5,第二张牌是3,自然而然的我们把3插到5的前面;第三张牌是4,查到3和5的中间;第四张牌是6,放到5的后面;第五张牌是2,插到3的前面;……。最后当我们摸完所有的牌时,手上的牌都是从小到大(点数)排好序的。 <?php//利用for循环把元素1插入到数组[2,3,4,5]头部//思路就是把前面数组元素的值赋给后面的数组元素的值,既所有元素的位置向后挪动一下,然后索引0得位置就空出来了可以放插入的元素了functionarr_push(array&$arr,$insert){$count=count($arr);for($i=$count;$i>0;$i--){$arr[$i]=$arr[$i-1];}$arr[0]=$insert;}$arr=[2,3,4,5];arr_push($arr,1);echo'<pre>';print_r($arr);//直接插入排序//思路假设第一个元...

php算法之冒泡排序

一、冒泡排序  原理:对一组数据,比较相邻数据的大小,将值小数据在前面,值大的数据放在后面。 (以下都是升序排列,即从小到大排列)  举例说明: $arr=array(6,3,8,2,9,1);  $arr有6个数据,按照两两比较大小如下,注意 比较轮数和每轮比较次数   第一轮排序:    第一次比较 6和3比较结果:3  6  8 2 9 1       第二次比较 6和8比较结果:3  6  8  2 9 1     第三次比较 8和2比较结果:3  6  2 8  9 1     第四次比较 8和9比较结果:3  6 2  8 9  1 ...
代码星球 代码星球·2020-04-08

机器学习-- 入门demo1 k临近算法

1、k-近邻法简介 k近邻法(k-nearestneighbor,k-NN)是1967年由CoverT和HartP提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。   2、距离度量我们已经知道k-近邻算法根据特征比较,然后提取样本集中特征最相似数据(最邻近)的分类标签。那么,如何进行比较呢?比如,我们还是以表1.1为例,怎么判断红色圆点标记的电影所属的类别呢?如下图所示。   我们可以从散点图大致推断,这个红色圆点标记的电影可能属于动作片,因为距离已知的那两个动作片的圆点更近。k-近邻算法用什么方法进行判...

拆入算法排序

 直接插入排序(InsertionSort)序是一种最简单的插入排序。为简化问题,我们下面只讨论升序排序。插入排序:每一趟将一个待排序的记录,按照其关键字的大小插入到有序队列的合适位置里,知道全部插入完成。 动态效果示意图:以上的过程,其实就是典型的直接插入排序,每次将一个新数据插入到有序队列中的合适位置里。很简单吧,接下来,我们要将这个算法转化为编程语言。假设有一组无序序列R0,R1,...,RN-1。(1)我们先将这个序列中下标为0的元素视为元素个数为1的有序序列。(2)然后,我们要依次把R1,R2,...,RN-1插入到这个有序序列中。所以,我们需要一个外部循环,从下标1扫描到N-1。(3)接下来描述插入过程。假设这是要将Ri插入到前面有序的序列中。由前面所述,我们可知,插入Ri时,前i-1个数肯定已经是有序了。所以我们需要将Ri和R0~Ri-1进行比较,确定要插入的合适位置。这就需要一个内部循环,我们一般是从后往前比较,即从下标i-1开始向0进行扫描。...
代码星球 代码星球·2020-04-07

冒泡算法排序

 冒泡排序是一种交换排序。什么是交换排序呢?答曰:两两比较待排序的关键字,并交换不满足次序要求的那对数,直到整个表都满足次序要求为止。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名冒泡排序。动态效果示意图:假设有一个大小为N的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。 1#-*-coding:utf-8-*-2#@Time:2018/12/2512:263#@Author:Endless-cloud4#@Site:5#@File:冒泡算法.py6#@Software:PyCharm7'''8冒泡算法的原理就是,从头到尾比对,如果前面比后面大,那么把大的放在后面,小的放在前面910'''11defmpmath(input_list):#定义函数,参数输入列表12ifinput_list==0:...
代码星球 代码星球·2020-04-07

程序员必备的八种数据结构

数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如果所示: 数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始注意:代码部分我都选用了python或者go例如下面这段代码就是将数组的第一个元素赋值为1data:=[1]int{1}优点:1.按照索引查询元素速度快2.按照索引遍历数组方便缺点:1.数组的大小固定后就无法扩容了2.数组只能存储一种类型的数据3.添加,删除的操作慢,因为要移动其他的元素适用场景:频繁查询,对存储空间要求不大,很少增加和删除的情况栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈栈的结构就像一个集装箱,越先放进去的东西越晚才能拿出来,所以栈常用于实现递归功能方面的场景,例如斐波那契数列 队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端操取出元素,...

分布式的两种算法

这种算法非常的简单,就是根据服务器台数的余数进行分散,求得整数值的hash值,再除以服务器的台数,根据其余数来选择服务器,将server的hash值与server的总台数进行求余,即hash%N。但是在这种算法对缓存命中率的影响下:我们假设有8台服务器,运行中突然down了一台,则求余的底数变成了7,那么其产生的结果就完全变了一般地,我们从数学上归纳之:有N台服务器,变成了N-1台服务器,所以命中率在服务器down的短期内,急剧下降至1/(N-1),所以服务器越多,则down机的后果越严重为了解决上述取模算法遇到的问题,我们可以使用另一种分布式算法,即一致性hash算法,所谓的一致性hash算法,就是把服务器的各个节点放在钟表的各个时刻上,同时,我们也将要存储的key也映射到钟表的某个时刻上,该key延钟表顺时针走,碰到第一个比他小的节点之后,则key就落在这台服务器上补充:利用crc32()函数可以将key值转换成整数当某个节点down后,只影响该节点顺时针之后的1个节点,而其他节点不受影响我们通过上图看到,6号节点down后,所有的压力都转移到7号节点上,造成了7号节点服务器的压力...
代码星球 代码星球·2020-04-07

朴素贝叶斯算法,点进来了解了解。

 还请大家多多指点,一起进步喔。贝叶斯方法是以贝叶斯原理为基础,使用概率统计的知识对样本数据集进行分类。由于其有着坚实的数学基础,贝叶斯分类算法的误判率是很低的。贝叶斯方法的特点是结合先验概率和后验概率,即避免了只使用先验概率的主管偏见,也避免了单独使用样本信息的过拟合现象。贝叶斯分类算法在数据集较大的情况下表现出较高的准确率,同时算法本身也比较简单。朴素贝叶斯法(NPC)是基于贝叶斯定理与特征条件独立假设的分类方法。NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响,这也是缺点所在。先认识一下朴素贝叶斯的优缺点:优点:朴素贝叶斯算法假设了数据集属性之间是相互独立的,因此算法的逻辑性十分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素贝叶斯的分类性能不会有太大的差异。换句话说就是朴素贝叶斯算法的健壮性比较好,对于不同类型的数据集不会呈现出太大的差异性。当数据集属性之间的关系相对比较独立时,朴素贝叶斯分类算法会有较好的效果。缺点:属性独立性的条件同时也是朴素贝叶斯分类器的不足之处。数据集属性的独立性在很多情况下是很难满...

XGBoost算法原理以及实现

 XGBoost算法是由GBDT算法演变出来的,GBDT算法在求解最优化问题的时候应用了一阶导技术,而XGBoost则使用损失函数的一阶导和二阶导,不但如此,还可以自己定义损失函数,自己定义损失函数前提是损失函数可一阶导和二阶导。XGBoost算法原理:(务必保证先学习决策树算法)其实算法的原理就是在一颗决策树的基础上不断地加树,比如在n-1颗树地基础上加一棵树变成n颗树的同时算法的精确率不断提高、效果提升。基础理解:损失函数:l(yi,yi^)=(yi-yi^)**2【这里损失函数先以方差损失作为示例、因为比较好算和符号表达毕竟这个也很不错;当然损失函数可以更改】如何最优化的求解?:F*(x)=argminE(x,y)(L(y,F(x)))最终,集成算法的表示:yi^=sum(fk(xi));其中,k=1~K;fk属于Fyi0^=0yi1^=f1(xi)=yi0^+f1(xi)yi2^=f1(xi)+f2(xi)=yi1^+f2(xi)…yin^=sum(fk(xi))=yi{n-1}^+fn(xi);其中,k=1~n。推导过程:在样本中着手计算,样本的真实值...

梯度提升树算法GBDT

 梯度提升树算法实际上是提升算法的扩展版,在原始的提升算法中,如果损失函数为平方损失或者指数损失,求解损失函数的最小值问题会非常简单,但如果损失函数为更一般的函数(如绝对值函数),目标值的求解就会相对复杂许多。所以,梯度提升算法诞生,也就是在第m轮基础模型中,利用损失函数的负梯度值作为该轮基础模型损失值(残差)的近似,利用这个近似值构建下一轮基础模型。GBDT(梯度提升树)属于一种有监督的集成学习算法,可用于分类问题的识别和预测问题的解决。该集成算法体现了三方面的优势,分别是提升Boosting、梯度Gradient、决策树DecisionTree。提升是指将多个弱分类器通过线下组合实现强分类器的过程。梯度是指算法在Booting过程中求解损失函数时增强了灵活性和便捷性。决策树是指算法所使用的弱分类器为CART决策树(该决策树简单直观通俗易懂)随机森林实质上是利用Bootstrap抽样技术生成多个数据集,然后通过这些数据集构造多颗决策树,进而运用投票或者平均的思想实现分类和预测问题的解决,但是随机性会导致树与树之间并没有太多的相关性,往往会导致随机森林算法在拟合效果上遇到瓶颈...
代码星球 代码星球·2020-04-07

提升树AdaBoost算法【自适应增强算法(集成学习算法)】

 回忆多元线性回归算法:多元线性回归的构造实质上是将输入特征X进行加权运算,即y=a0+a1x1+a2x2+a3x3+…+apxp=a0+sum(ai*xi)(其中、i=1~p)提升算法与线性回归模型的思想类似,所不同的是该算法实现了多颗基础决策树f(x)的加权运算,最经典的是AdaBoost算法(是一个迭代算法),即:F(x)=sum(a[m]*f[m](x))=f[m-1](x)+a[m]*fm(其中,m为1~M)自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器,同时在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。其中、F(x)是由M颗基础决策树构成的最终提升树,Fm-1表示经过m-1轮迭代后的提升树,a[m]为第m颗基础决策树所对应的权重,fm为第m颗基础决策树。此外,每一颗决策树的生成并不像随机森林那样,而是基于前一颗基础决策树的分类结果对样本设置不同的权重。如果在前一颗基础决策树中将样本点预测错误,就会增大该样本点的权重,否则会相应降低样本点的权重,进而再构...

LTS秘钥协商算法分析

1、根据RCF文档说法在1-RTT中有两种密钥协商算法(1-RTTECDHE和1-RTTPSK )和4中0-RTT密钥协商方式(0-RTTPSK,0-RTTECDH,0-RTTECDHE-PSK ,0-RTTECDH-ECDHE) 首先看ECDH密钥的协商:      计算存在两种方法:       第一种:密钥生成算法ECDH_Generate_key输出一个公钥和私钥对(ECDH_pub_key,ECDH_pri_key),ECDH_pri_key需要秘密的保存,ECDH_pub_key可以公开发送给对方。      第二种:密钥协商算法ECDH_Computer_key,以对方的公钥最为自己的私钥输入,计算一个key。这样双方计算出来的key是一致的‘这种算法存在明显的漏洞,攻击者可以将发送给对方的公钥截获,使用ECDH_Generate_key计算出...

java实现 排序算法(鸡尾酒排序&选择排序&插入排序&二分插入排序)

1、鸡尾酒排序算法源程序代码:packagecom.SuanFa;publicclassCocktial{   publicstaticvoidmain(String[]args){      //TODOAuto-generatedmethodstub      cooktailSortcook=newcooktailSort();      int[]A={1,2,3,8,4,0,5,34,12,67,35,9,45,443,454,242,343};      intn=A.length;      cook.cooktailSort(A,n);      System.out.println("...
首页上一页...111112113114115...下一页尾页