交换排序---快速排序算法(Javascript版)

快速排序是对冒泡排序的一种改进。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,最终达到整个数据变成有序序列。假设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为基准数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。一趟快速排序的算法是:1)设置两个变量low、high,排序开始的时候:low=0,high=N-1;2)以第一个数组元素作为基准数据,赋值给base,即base=A[0];3)从high开始向前搜索,即由后开始向前搜索(high--),找到第一个小于base的值A[high],将A[high]和A[low]互换;4)从low开始向后搜索,即由前开始向后搜索(low++),找到第一个大于base的A[low],将A[low]和A[high]互换;5)重复第3、4步,...

交换排序---冒泡排序算法Javascript版)

比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 functionsort(elements){for(vari=0;i<elements.length-1;i++){for(varj=0;j<elements.length-i-1;j++){if(elements[j]>elements[j+1]){varswap=elements[j];elements[j]=elements[j+1];elements[j+1]=swap;}}}}varelements=[3,1,5,7,2,4,9,6,10,8];console.log('before:'+elements);sort(elements);console.log('after:'+elements); 效率:时间复杂度:最好:O(n),最坏:O(n^2),平均:O(n^2)。...

选择排序---堆排序算法Javascript版)

排序分为两个过程:1.建堆。堆实质上是完全二叉树,必须满足:树中任一非叶子结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。堆分为:大根堆和小根堆,升序排序采用大根堆,降序排序采用小根堆。如果是大根堆,则通过调整函数将值最大的节点调整至堆根。2.将堆根保存于尾部,并对剩余序列调用调整函数,调整完成后,再将最大跟保存于尾部-1(-1,-2,...,-i),再对剩余序列进行调整,反复进行该过程,直至排序完成。 以下代码在nodejs中执行通过//调整函数functionheadAdjust(elements,pos,len){//将当前节点值进行保存varswap=elements[pos];//定位到当前节点的左边的子节点varchild=pos*2+1;//递归,直至没有子节点为止while(child<len){//如果当前节点有右边的子节点,并且右子节点较大的场合,采用右子节点//和当前节点进行比较if(child+1<len&&elements[child]<elements[child+1]){child+=1;}/...

选择排序---直接选择排序算法Javascript版)

在要排序的一组数列中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。functionsort(elements){for(i=0;i<elements.length;i++){//将当前位置作为关键位置(最小位置)varkey=i;//找出剩余的数列中最小值的位置作为关键位置for(varj=i+1;j<elements.length;j++){if(elements[j]<elements[key]){key=j;}}//最小值的位置不是当前位置时,用最小值替换当前位置的值if(key!=i){varswap=elements[i];elements[i]=elements[key];elements[key]=swap;}}}varelements=[10,9,8,7,6,5,4,3,2,1,0];console.log('before:'+elements);sort(elements);console.log('af...

插入排序---希尔插入排序算法Javascript版)

取一个小于n的整数作为第一个增量,把序列分组。所有距离为增量的倍数的元素放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量(第二个<第一个)重复上述的分组和排序,直至所取的增量=1,即所有元素放在同一组中进行直接插入排序为止。 一般的初次取序列的一半为增量,以后每次减半,直到增量为1。 以下代码在nodejs中执行通过。functionshellInsertSort(elements,di){//从增量的所在位置开始for(vari=di;i<elements.length;i++){//升序if(elements[i]<elements[i-di]){//取出增量位置的元素作为被插入元素(哨兵)varguard=elements[i];varj=i-di;elements[i]=elements[j];//向前,将增量的倍数的位置作为同一组比较及进行直接插入法while(j>=0&&guard<elements[j]){elements[j+di]=elements[j];j-=di;}//插入elemen...

插入排序---直接插入排序算法Javascript版)

将n个元素的数列分为已有序和无序两个部分。数列:{a1,a2,a3,a4,…,an}将该数列的第一元素视为有序数列,后面都视为无序数列:{{a1},{a2,a3,a4,…,an}}将无序数列中的元素插入到有序数列的对应位置,插入前通过比大小的方式找到其在有序数列中的对应位置。 代码:以下代码在nodejs环境中执行通过。functionsort(elements){//假设第0个元素是一个有序的数列,第1个以后的是无序的序列,//所以从第1个元素开始将无序数列的元素插入到有序数列中for(vari=1;i<elements.length;i++){//升序if(elements[i]<elements[i-1]){//取出无序数列中的第i个作为被插入元素varguard=elements[i];//记住有序数列的最后一个位置,并且将有序数列位置扩大一个varj=i-1;elements[i]=elements[j];//比大小,找到被插入元素所在的位置while(j>=0&&guard<elements[j]){elements[j+1...

Merkle Tree算法详解

转载自:http://blog.csdn.net/yuanrxdu/article/details/22474697MerkleTree是Dynamo中用来同步数据一致性的算法,MerkleTree是基于数据HASH构建的一个树。它具有以下几个特点:1、数据结构是一个树,可以是二叉树,也可以是多叉树(本BLOG以二叉树来分析)2、MerkleTree的叶子节点的value是数据集合的单元数据或者单元数据HASH。3、MerkeTree非叶子节点value是其所有子节点value的HASH值。为了更好的理解,我们假设有A和B两台机器,A需要与B相同目录下有8个文件,文件分别是f1f2f3....f8。这个时候我们就可以通过MerkleTree来进行快速比较。假设我们在文件创建的时候每个机器都构建了一个MerkleTree。具体如下图:从上图可得知,叶子节点node7的value=hash(f1),是f1文件的HASH;而其父亲节点node3的value=hash(v7,v8),也就是其子节点node7node8的值得HASH。就是这样表示一个层级运算关系。root节点的value其实是所...
代码星球 代码星球·2021-02-25

用到的一些算法收集

卷积:staticintfilter0(uint8_t*src,uint8_t*dst,intw,inth){doublestart,end;inti=1;intj=1;if(w>WIDTH||h>HEIGHT)return1;start=now_ms();for(i=1;i<h-1;++i){for(j=1;j<w-1;++j){intindex=j+i*w;uint8_tlu=src[index-1-w];uint8_tlm=src[index-1];uint8_tld=src[index-1+w];uint8_tmu=src[index-w];uint8_tmm=src[index];uint8_tmd=src[index+w];uint8_tru=src[index+1-w];uint8_trm=src[index+1];uint8_trd=src[index+1+w];intsum=lu+lm+ld+mu+mm+md+ru+rm+rd;dst[index]=(uint8_t)sum/9+1;}}end=now_ms();printf("filter%f...
代码星球 代码星球·2021-02-24

从零开始入门 K8s | 调度器的调度流程和算法介绍

/导读:Kubernetes作为当下最流行的容器自动化运维平台,以声明式实现了灵活的容器编排,本文以v1.16版本为基础详细介绍了K8s的基本调度框架、流程,以及主要的过滤器、Score算法实现等,并介绍了两种方式用于实现自定义调度能力。Kubernetes作为当下最主流的容器自动化运维平台,作为K8s的容器编排的核心组件kube-scheduler将是我今天介绍的主角,如下介绍的版本都是以 release-1.16 为基础,下图是kube-scheduler的主要几大组件:PolicyScheduler的调度策略启动配置目前支持三种方式,配置文件/命令行参数/ConfigMap。调度策略可以配置指定调度主流程中要用哪些过滤器(Predicates)、打分器(Priorities)、外部扩展的调度器(Extenders),以及最新支持的SchedulerFramwork的自定义扩展点(Plugins)。InformerScheduler在启动的时候通过K8s的informer机制以List+Watch从kube-apiserver获取调度需要的数据例如:Pods、N...

【教程】5分钟在PAI算法市场发布自定义算法

在人工智能领域存在这样的现象,很多用户有人工智能的需求,但是没有相关的技术能力。另外有一些人工智能专家空有一身武艺,但是找不到需求方。这意味着在需求和技术之间需要一种连接作为纽带。今天PAI正式对外发布了“AI市场”以及“PAI自定义算法”两大功能,可以帮助用户5分钟将线下的spark算法或是pyspark算法发布成算法组件,并且支持组件发布到AI市场供更多用户使用。有了以上功能,算法开发者和算法需求双方可以基于PAI的开放框架和平台实现算法交易,实现生态和PAI的共融。使用SQL、SPARK2.0、PYSPARK2.03种算法框架自行开发出的算法上传到PAI-STUDIO中,运行产生的费用按照PAI资源成本价收取,费用为1元/计算时。1.控制台说明首先进入PAI控制台,找到Studio-可视化建模下的“算法发布”功能。2.开发算法代码基于本地调试文档https://help.aliyun.com/document_detail/126887.html,开发算法包。本文使用官方提供的pyspark案例介绍,请前往https://help.aliyun.com/document_deta...

ALS算法实现用户音乐打分预测

很多人在决定是否看一部电影之前都会去豆瓣看下评分作为参考,看完电影也会给一个自己的分数。每个人对每个商品或者电影或是音乐都有一个心理的分数,这个分数标明用户是否对这个内容满意。作为内容的提供方,如果可以预测出每个用户对于内容的心理分数,就能更好的理解用户,并给用户提供好的内容推荐。今天就介绍下如何通过ALS矩阵分解算法实现用户对于音乐或者电影的评分预测。ALS算法是基于模型的推荐算法,基本思想是对稀疏矩阵进行模型分解,评估出缺失项的值,以此来得到一个基本的训练模型。然后依照此模型可以针对新的用户和物品数据进行评估。ALS是采用交替的最小二乘法来算出缺失项的,交替的最小二乘法是在最小二乘法的基础上发展而来的。从协同过滤的分类来说,ALS算法属于User-ItemCF,也叫做混合CF,它同时考虑了User和Item两个方面。我们通过音乐打分这个案例介绍下交替最小二乘法的原理,首先拿到的原始数据是每个听众对每首歌的评分矩阵A,这个评分可能是非常稀疏的,因为不是每个用户都听过所有的歌,也不是每个用户都会对每首歌评分。ALS矩阵分解会把矩阵A分解成两个矩阵的相乘,分别是X矩阵和Y矩阵,矩阵A=矩...

从分布式一致性算法到区块链共识机制

/摘要: 本文将从传统的分布式一致性问题说起,再次重温我们需要面对的问题挑战、已有的理论研究、以及相应的一致性算法,并简要分析这些一致性算法的适用性与局限性,以及这些传统一致性算法与崭新的区块链技术的结合。另外,将从区块链中一致性问题的全新视角“人的可信”出发,重点阐述公有链领域中的共识算法与机制。分布式一致性是一个很“古典”的话题,即在分布式系统中,如何保证系统内的各个节点之间数据的一致性或能够就某个提案达成一致。这个问题想必对于很多技术同学而言并不陌生,几乎在所有的分布式系统中都会遇到,比如hdfs、mq、zookeeper、kafka、redis、elasticsearch等。然而这个问题却历久弥新,随着分布式网络的蓬勃发展与复杂化,对于该问题解法的探索也一直在进行中。而近年来,随着区块链技术的兴起,特别是开放网络中的公有链与有权限网络中的联盟链的蓬勃发展,一致性问题再次得到关注,并从新的视角来审视该问题。本文将从传统的分布式一致性问题说起,再次重温我们需要面对的问题挑战、已有的理论研究、以及相应的一致性算法,并简要分析这些一致性算法的适用性与局限性,以及这些传统一致性...

机器学习算法中GBDT和XGBOOST的区别有哪些?

转自:https://www.zhihu.com/question/41354392作者:wepon链接:https://www.zhihu.com/question/41354392/answer/98658997来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。最近赞忽然多了起来,我猜是校招季来了吧。但如果面试官问你这个问题,我建议不要按我的回答来,背答案不如自己理解透了,况且我这是十分得五分的答案。最初的GBDT发展到现在的XGBoost,改进是一点一滴来的,是一篇篇论文的积累,很多方法并非XGBoost第一次提出,当然也不是说XGBoost没改进,可以说XGBoost把算法和系统实现都做得淋漓尽致。所以如果不是为了速成,不是为了校招,建议把经典的论文拿出来读一读,相信对算法的理解能更进一层。最近实习刚好在组内分享了GBDT,所以有了这番感悟,看了更多资料,发现自己理解还是有偏差,附上我做的ppt,若再有偏差,欢迎跟我邮件交流:http://wepon.me/files/gbdt.pdf 以下原答案:---------------------...

Boost算法(GDBT,AdaBoost,XGBoost)原理及实践

在上一篇博客里,我们讨论了关于Bagging的内容,其原理是从现有数据中有放回抽取若干个样本构建分类器,重复若干次建立若干个分类器进行投票,今天我们来讨论另一种算法:提升(Boost)。简单地来说,提升就是指每一步我都产生一个弱预测模型,然后加权累加到总模型中,然后每一步弱预测模型生成的的依据都是损失函数的负梯度方向,这样若干步以后就可以达到逼近损失函数局部最小值的目标。下面开始要不说人话了,我们来详细讨论一下Boost算法。首先Boost肯定是一个加法模型,它是由若干个基函数及其权值乘积之和的累加,即 其中b是基函数,beta是基函数的系数,这就是我们最终分类器的样子,现在的目标就是想办法使损失函数的期望取最小值,也就是 一下子对这M个分类器同时实行优化,显然不太现实,这问题也太复杂了,所以人们想了一个略微折中的办法,因为是加法模型,所以我每一步只对其中一个基函数及其系数进行求解,这样逐步逼近损失函数的最小值,也就是说 那聪明的你一定想到了,要使损失函数最小,那就得使新加的这一项刚好等于损失函数的负梯度,这样不就一步一步使得损失函数最快下降了吗?没错,就...

K-Means 聚类算法原理分析与代码实现

转自穆晨阅读目录前言现实中的聚类分析问题-总统大选K-Means聚类算法K-Means性能优化二分K-Means算法小结回到顶部      在前面的文章中,涉及到的机器学习算法均为监督学习算法。      所谓监督学习,就是有训练过程的学习。再确切点,就是有"分类标签集"的学习。      现在开始,将进入到非监督学习领域。从经典的聚类问题展开讨论。所谓聚类,就是事先并不知道具体分类方案的分类(允许知道分类个数)。      本文将介绍一个最为经典的聚类算法-K-Means聚类算法以及它的两种实现。回到顶部      假设M国又开始全民选举总统了,目前Mr.OBM的投票率为48%(投票数占所有选民人数的百分比),而Mr.MKN的为47%,而剩下的一部分出于【种种原因】没有投票。 &...
首页上一页12345...下一页尾页