十大编程算法助程序员走上高手之路

算法一:快速排序算法快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来。快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。算法步骤:1 从数列中挑出一个元素,称为 "基准"(pivot),2 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。3 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。递归的最底部情形,是数列的大小是零或一,也就是永远都已经被...

JAVA智能设备基于OpenGL的3D开发技术 之AABB碰撞检测算法论述

摘要:无论是PC机的3D还是智能设备应用上,碰撞检测始终是程序开发的难点,甚至可以用碰撞检测作为衡量3D引擎是否完善的标准。现有许多3D碰撞检测算法,其中AABB碰撞检测是一种卓有成效而又经典的检测算法,本文将为读者详细论述AABB碰撞检测的各各技术点。关键词:J2ME;OpenGL;JSR-184;M3G;CLDC2.0;3D引擎;Swerve引擎;AABB碰撞检测;对于移动终端有限的运算能力,几乎不可能检测每个物体的多边形和顶点的穿透,那样的运算量对手机等设备来讲是不可完成的,所以移动设备上使用的碰撞检测不可能使用太精确的检测,而且对于3D碰撞检测问题,还没有几乎完美的解决方案。目前只能根据需要来取舍运算速度和精确性达到目地。第二部分、J2ME技术:1、体系结构为满足消费者和嵌入式市场不断发展和多样化的需求,SUN公司的J2ME平台采用模块化、可扩展的设计。这种设计是通过三层软件模型来实现的,这三层都构建于智能设备的操作系统之上。J2ME体系结构依照各种设备的特性,将架构分为简表、配置、虚拟机三层,这使J2ME可在每一类设备的限制下工作。2、J2ME3D开发包JSR184标准为ja...

HMM模型和Viterbi算法

1、简介  隐含马尔可夫模型并不是俄罗斯数学家马尔可夫发明的,而是美国数学家鲍姆提出的,隐含马尔可夫模型的训练方法(鲍姆-韦尔奇算法)也是以他名字命名的。隐含马尔可夫模型一直被认为是解决大多数自然语言处理问题最为快速、有效的方法。2、马尔可夫假设  随机过程中各个状态St的概率分布,只与它的前一个状态St-1有关,即P(St|S1,S2,S3,…,St-1)=P(St|St-1)。  比如,对于天气预报,硬性假定今天的气温只与昨天有关而和前天无关。当然这种假设未必适合所有的应用,但是至少对以前很多不好解决的问题给出了近似解。3、马尔可夫链  符合马尔可夫假设的随机过程称为马尔可夫过程,也称为马尔可夫链。 图:马尔可夫链   在这个马尔可夫链中,四个圈表示四个状态,每条边表示一个可能的状态转换,边上的权值是转移概率。隐含马尔可夫链是上述马尔可夫链的一个扩展:任一时刻t的状态St是不可见的。所以观察者没法通过观察到一个状态序列S1,S2,S3,…,ST来推测转移概率等参数。但是隐含马尔可夫模型在每个时刻t会输出一个符号Ot,而且Ot和St相关且仅和St相关。这称为独立输...
代码星球 代码星球·2021-02-15

词性标注算法之CLAWS算法和VOLSUNGA算法

背景知识 一、基于规则的词性标注方法1.原理  利用事先制定好的规则对具有多个词性的词进行消歧,最后保留一个正确的词性。2.步骤  ①对词性歧义建立单独的标注规则库  ②标注时,查词典,如果某个词具有多个词性,则查找规则库,对具有相同模式的歧义进行排歧,否则保留。  ③程序和规则库是独立的两部分。3.例子  TAGGIT系统 二、基于统计的词性标注方法1、原理  先对部分进行手工标注,然后对新的语料使用统计方法进行自动标注。2、语言模型  (1)一个语言句子的信息量 一个句子s=w1w2……wn的信息量量可以用熵来表示:H=-∑p(w1,w2,…,wn)logp(w1,w2,…,wn),概率p(s)的大小反映了这个词串在该语言中的使用情况。  (2)n元语法模型/①一元语法,wi的出现独立于历史  p(w1,w2,…,wn)=p(w1)*p(w2)*p(w3)…p(wn)②二元语法,wi的出现决定于wi-1  p(w1,w2,…,wn)=p(w1)*p(w2|w1)*p(w3|w2)…p(wn|wn-1)③三元语法,wi的出现决定于wi-1,wi-2  p(w1,w...

基于统计的自动分词算法

  简介:利用字与字间、词与词间的同现频率作为分词的依据,不一定需要建立好的词典。需要大规模的训练文本用来训练模型参数。优缺点:不受应用领域的限制;但训练文本的选择将影响分词结果。   对于任意一个语句,首先按语句中词组的出现顺序列出所有在语料库中出现过的词组;将上述词组集中的每一个词作为一个顶点,加上开始与结束顶点,按构成语句的顺序组织成有向图;再为有向图中每两个直接相连的顶点间的路径赋上权值,如A→B,则AB间的路径权值为B的费用(若B为结束顶点,则权值为0);此时原问题就转化成了单源最短路径问题,通过动态规划解出最优解即可。 (1)获取候选词   获取句子中可能出现的所有词作为候选词,但要满足下列条件:如果是长度大于1的词,则必须在词典中出现;如果是长度等于1,即为单字,可以不在词典中出现。(2)构造前趋词  假定字符串从左到右进行扫描,可以得到w1,w2,…,wi-1,wi,….等若干候选词,如果wi-1的尾字根wi的首字邻接,就称wi-1为wi的前趋词。比如上面例中,候选词“有”就是候选词“意见”的前趋词,“意见”和“见”都是...

基于规则的自动分词算法

所谓中文分词,就是将中文语句中的词汇切分出来。中文文本自动分词算法从20世纪80年代以来就一直是研究热点。分词技术作为自然语言处理的基础环节,同时也是关键环节之一,它的质量好坏直接影响到后续处理步骤的效果。本文将讨论三种基于规则的中文分词算法,分别是正向最大匹配法、逆向最大匹配法、双向匹配法,介绍其要点及优缺点,并代码实现。 (1)简介:事先人工建立好分词词典和分词规则库,基于字符串匹配进行分词,要求有足够大的词表为依据。(2)优缺点:当分词词典所收容的词较少时,覆盖率有限导致分词的正确率低。(3)算法:正向最大匹配法、逆向最大匹配法、双向匹配法。  一、主要原理切分出单字串,然后和词库进行比对,如果是一个词就记录下来,否则通过增加或者减少一个单字,继续比较,一直还剩下一个单字则终止。二、算法描述/设MaxLen表示最大词长,D为分词词典。①从待切分语料中按正向取长度为MaxLen的字串str,令Len=MaxLen;②把str与D中的词相匹配;③若匹配成功,则认为该字串为词,指向待切分语料的指针向前移Len个汉字(字节),返回到①;④若不成功:如果Len...

算法导论(Introduction to Algorithms)exercises 5.1-3代码实现Unblased_random

intblased_random(){//返回1的概率为0.1,返回0的概率为0.9;returnrand()%10>8?1:0;}intunblased_random(){//等概率返回1,0;inta=0,b=0;for(;a==b;a=blased_random(),b=blased_random());returna;}voidtest_of_unblased_random(){//测试unblased_random;intnum_1=0;intnum_0=0;for(inti=0;i<1000000;i++)unblased_random()==1?num_1++:num_0++;cout<<"num_0:"<<ends<<num_0<<endl;cout<<"num_1:"<<ends<<num_1<<endl;} 思路:两次调用blased_random();产生序列0,1;1,0概率相同即(p*(1-p),(1-p)*p);返回序列首位即可;...

算法导论(Introduction to Algorithms)5.1-2代码实现

1intrandom_01(){//等概率返回0,1;23returnrand()%2;4}5intrandom_ab(inta,intb){//等概率返回区间[a,b]的整数;6intm=b-a;7intn=1;8for(;pow(2,n)-1<m;n++);//获取表示M所需的位数;9intres;10do{11res=0;//每次循环开始将res置零;12for(inti=0;i<n;i++){13res+=random_01()*pow(2,i);14}15}while(res>m);//不断循环,直到得到res的值小于等于m;16returnres+a;17}18voidtest_of_random_ab(){//测试random_ab;19intm=0;20inta[5]={0};21for(inti=0,k=0;i<100;i++){//统计4,5,6,7,8出现的次数;22k=random_ab(4,8);//函数的调用;23if(k==4)24a[k-4]++;25elseif(k==5)26a[k-4]++;27elseif(k==6)28a...

接口限流算法

 限流限流顾名思义,提前对各个类型的请求设置最高的QPS阈值,若高于设置的阈值则对该请求直接返回,不再调用后续资源。限流需要结合压测等,了解系统的最高水位,也是在实际开发中应用最多的一种稳定性保障手段。应用场景:如秒杀、抢购、发帖、评论、恶意爬虫等。 限流算法的三种实现实际应用时,我们不大可能在单机执行限流,下面的实现也并非线程安全。实际限流可以考虑在Nginx层对请求限流,或者如果真的要自己在业务方实现一套限流策略的话,可以考虑基于Redis实现分布式限流策略。并且在实际应用中,可能还会基于不同的维度进行限流,如用户id,请求IP等,实际应用需要考虑的东西更多。 计数器计数器法是限流算法里最简单也是最容易实现的一种算法。假设一个接口限制一分钟内的访问次数不能超过100个,维护一个计数器,每次有新的请求过来,计数器加一,这时候判断,如果计数器的值小于限流值,并且与上一次请求的时间间隔还在一分钟内,允许请求通过,否则拒绝请求,如果超出了时间间隔,要将计数器清零。importtimeclassCounterLimter:def__init__(self,int...
代码星球 代码星球·2021-02-14

【机器学习】K-Means聚类算法原理

 原文链接:K-Means聚类算法原理作者:刘建平Pinard K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体方法。包括初始化优化K-Means++,距离计算优化elkanK-Means算法和大数据情况下的优化MiniBatchK-Means算法。    K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。    如果用数据表达式表示,假设簇划分为(C1,C2,...Ck)(C1,C2,...Ck),则我们的目标是最小化平方误差E:E=∑i=1k∑x∈Ci||x−μi||22E=∑i=1k∑x∈Ci||x−μi||22     其中μiμi是簇CiCi的均值向量,有时也称为质心,表达式为:μi=1|Ci|∑x∈Cixμi=1|Ci|∑x∈Cix     如果我们想直接求上式的最小值并不容易,这是一个...

机器学习】K-近邻算法(KNN)

 K-近邻算法(KNN)概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。Cover和Hart在1968年提出了最初的邻近算法。KNN是一种分类(classification)算法,它输入基于实例的学习(instance-basedlearning),属于懒惰学习(lazylearning)即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方...

负载均衡算法-java实现

出处:  Java代码实现负载均衡五种算法  前言:    负载均衡是为了解决并发情况下,多个请求访问,把请求通过提前约定好的规则转发给各个server。其中有好几个种经典的算法。在用java代码编写这几种算法之前,先来了解一下负载均衡这个概念。 1.概念  负载,从字面意思可以分析,是指后端server可以承受的压力。这个一方面是服务器的性能,另一方面就是代码的质量了。  均衡,就是说把服务部署在多态server,如何调度这些资源。根据服务器性能不同,进行一个权衡。  当web访问量增加,服务器性能不同,更好的去利用服务器,我们需要负载均衡算法。 2.几种负载均衡算法简介主要的负载均衡算法是图中这些,在代码实现之前,我们先简单回顾一下他们的概念。 轮询法:  轮询算法按顺序把每个新的连接请求分配给下一个服务器,最终把所有请求平分给所有的服务器。  优点:绝对公平 &n...

时间轮算法 — 转

出处: 那些惊艳的算法们(三)——时间轮    自然界中定时任务无处不在,太阳每天东升西落,候鸟的迁徙,树木的年轮,人们每天按时上班,每个月按时发工资、交房租,四季轮换,潮涨潮落,等等,从某种意义上说,都可以认为是定时任务。大概很少有人想过,这些“定时”是怎样做到的。当然,计算机领域的同学们可能对此比较熟悉,毕竟工作中的定时任务也是无处不在的:每天凌晨更新一波数据库,每天9点发一波邮件,每隔10秒钟抢一次火车票。。。  至于怎么实现的?很简单啊,操作系统的crontab,spring框架的quartz,实在不行Java自带的ScheduledThreadPool都可以很方便的做到定时任务的管理调度。  当你熟练的敲下“**9**?”等着神奇的事情发生时,你是否想过背后的“玄机”?大概去年的时候,业务需要实现一个时间调度的工具,定时生成报表,同组的哥们儿想了一个取巧的办法:  1.启动时从DB读取cron表达式解析,算出该任务下次执行的时间。  2.下次执行的时间-当前时间=时间差。  3.向ScheduleThreadPool线程池中提交一个延迟上面算出来...
代码星球 代码星球·2021-02-13

grep之字符串搜索算法Boyer-Moore由浅入深(比KMP快3-5倍)

这篇长文历时近两天终于完成了,前两天帮网站翻译一篇文章“为什么GNUgrep如此之快?”,里面提及到grep速度快的一个重要原因是使用了Boyer-Moore算法作为字符串搜索算法,兴趣之下就想了解这个算法,发现这个算法一开始还挺难理解的,也许是我理解能力不是很好吧,花了小半天才看懂,看懂了过后就想分享下,因为觉得这个算法真的挺不错的,以前一直以为字符串搜索算法中KMP算很不错的了,没想到还有更好的,Boyer-Moore算法平均要比KMP快3-5倍。下面是我对该算法的理解,参考了一些关于该算法的介绍,里面每一张图都画的很认真,希望能讲清楚问题,有什么错误、疑问或不懂的地方麻烦大家一定要提出来,共同学习进步!下面正文开始。在用于查找子字符串的算法当中,BM(Boyer-Moore)算法是目前被认为最高效的字符串搜索算法,它由BobBoyer和JStrotherMoore设计于1977年。一般情况下,比KMP算法快3-5倍。该算法常用于文本编辑器中的搜索匹配功能,比如大家所熟知的GNUgrep命令使用的就是该算法,这也是GNUgrep比BSDgrep快的一个重要原因,具体推荐看下我最近的...

编程面试的10大算法概念汇总

a:link{text-decoration:none}a:visited{text-decoration:none}a:hover{text-decoration:none}a:active{text-decoration:none}嘿,第一次翻译文章,在ProgramCreek看到的,原文章名为Top10AlgorithmsforCodingInterview,对于我这个明年即将直奔BAT(目前想法,以后不一定)但基础知识又差的小程序媛而言有点价值,就拿来翻译了下,并发表在伯乐在线。文章本身只是总结介绍简单概念,起个抛砖引玉的作用,具体深入了解需要自己慢慢学习,关键是文章中及末尾给出出了很多非常优秀的参考资料,可以继续深入掌握。下面是正文,有啥想吐槽的请直接评论在下面。以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念。由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍。本文将从Java的角度看问题,包含下面的这些概念:1.字符串2.链表3.树4.图5.排序6.递归vs.迭代7.动态规划8.位操作9.概率问题10.排列组合1.字符串如果...
首页上一页...56789...下一页尾页