J**aScript中**结构与算法(四):串(BF)

时间:2016.04.25 发布人:y15257829791

J**aScript中**结构与算法(四):串(BF)

已解决问题

谷歌y15257829791用户在2016.04.25提交了关于“诺基亚J**aScript中**结构与算法(四):串(BF)”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2025-03-03T05:27:28。希望大家能够帮助她。

详细问题描述及疑问:期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !

希望以下的回答,能够帮助你。

第1个回答

用户名:yangyiqazaqaz  

  这篇文章主充装要介绍了J**aScript中**结构与算法(四):串(BF),串是由零个或多个字符组成的有限序列,又叫做字符串,本文着重讲解了BF(BruteForce)算法,需要的朋友可以参考下

  串是由零个或多个字符组成的有限序列,又叫做字符串

  串的逻辑结构和线性表很相似的,不同的是串针对是是字符集,所以在操作上与线性表还是有很大区别的。线性表更关注的是单个东件元元素的操作CURD,串则守注查找子串的位置,替换等操作。

  当然不同的高名历易罪弱生日大持声外级语言对串的基本操作都有不同的定义方法,但是总的来说操作的本质都是相似的。比如j**ascrript查找就是indexOf,去空白就是trim,转化大小写toLowerC渐修强火济岩棉作志清ase/toUpper服谈助慢居电Case等等

  这里主要讨论下建控脸长有字符串模式匹配的几种经典石段决径心钟体岩的算法:BF、BM、KMP

 群言感 BF(BruteForce)算法

  Brute-Forc盟造e算法的基本思想:

  极而境练责条从目标串s的第一个字符起使杀造宁是富费晶和模式串t的第一个字符进行比较,若相等,则继续逐个比较后续字符,否则从是半呼洋干某句串s的第二个字符起再重新述官罪还量入和串t进行比较。

  依此类推,直至串t中的每个字符依次和串s的一个连续的字符序列相等,则称模式匹配成功,此时串t的比医厂权社溶标为渐第一个字符在串s中的位置就是t在s中的位置,否则模式匹配不成功

  可见BF算法是一种暴力算法,又称为朴素匹配算法或蛮力算法。

  主串**CA**ABCF

  子串ABC

  在主串中找出子串的位置,对应了其实就是j**ascript的indexOf查找方法的实现了

  ?

123456789101112131415161718192021命因密缩京马222324252627varsourceStr="**CA**ABC系层音危基许言够权侵F";varsearchStr="ABC";functionBF_Ordinary在我衣杂断兰销(sourceStr,searchStr){varsourceLength=sourceStr.length;varsearchLength=searchStr.length;varpadding=sourceLength-searchLength;//循环的次数//**CA**ABCF=>ABC=>搜索9次for(vari=0;i<=padding;i++){//如果满足了第一个charAt是相等的//开始子循环检测//其中sourceStr的取值是需要叠加i的值if(sourceStr.charAt(i)==searchStr.charAt(0)){//匹配成功的**varcomplete=searchLength;for(varj=0;j<searchLength;j++){if(sourceStr.charAt(i+j)==searchStr.charAt(j)){--completeif(!complete){returni;}}}}}return-1;}

  BF算法就是简单粗暴,直接把**CA**ABCF母串的每一个字符的下表取出来与模式串的第一个字符匹配,如果相等就进去字串的再次匹配

  这里值得注意:

  1:最**循环的次数sourceLength-searchLength,因为我们匹配的母串至少要大于等于子串

  2:在子串的继续匹配中,母串的起点是需要叠加的(i+j)

  3:通过一个条件判断是否完全匹配complete,**CA**ABCF中,我们在A**的时候就需要跳过去

  上面是最简单的一个算法了,代码上还有更优的处理,比如在自串的匹配上可以采取取反的算法

  优化算法(一)

  ?

1234567891011121314151617functionBF_Optimize(sourceStr,searchStr){varmainLength=sourceStr.length;varsearchLength=searchStr.length;varpadding=mainLength-searchLength;for(varoffset=0;offset<=padding;offset++){varmatch=true;for(vari=0;i<searchLength;i++){//取反,如果只要不相等if(searchStr.charAt(i)!==sourceStr.charAt(offset+i)){match=false;bre**;}}if(match)returnoffset;}return-1;}

  我们不需要判断为真的情况,我们只要判断为假的情况就可以了,当子匹配结束后match没有被修改过的话,则说明此匹配是完全匹配

  以上2种方法我们都用到了子循环,我们能否改成一个循环体呢?

  其实我们可以看到规律,主串每次都只会递增+1,子串每次匹配也是从头开始匹配,所以我们可以改成一个while,控制下标指针就可以了

  优化算法(二)

  ?

1234567891011121314151617181920functionBF_Optimize_2(sourceStr,searchStr){vari=0,j=0;while(i<sourceStr.length){//两字母相等则继续if(sourceStr.charAt(i)==searchStr.charAt(j)){i++;j++;}else{//两字母不等则角标后退重新开始匹配i=i-j+1;//i回退到上次匹配首位的下一位j=0;//j回退到子串的首位}if(j==searchStr.length){returni-j;}}}

  i就是主串的下标**,j就是子串的下标**

  当主串子串相等的时候,就进入了子串的循环模式,当子循环的次数j满足子串长度时,就验是完全匹配

  当主串子串不相等的时候,就需要把主串的下标往后移一位,当然i的时候,因为可能经过子串的处理,所以需要i-j+1,然后复位子串

  具体我们可以看看代码比较

  基于BF算法的四种结构,for/while/递归

  ?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133<!doctypehtml>由于电脑性能的不断提脯测试的**量的大小,可能会导致得到的结果不太准确;<scripttype="text/j**ascript">///////////暴力算法////普通版/////////functionBF_Ordinary(sourceStr,searchStr){varsourceLength=sourceStr.length;varsearchLength=searchStr.length;varpadding=sourceLength-searchLength;//循环的次数//**CA**ABCF=>ABC=>搜索9次for(vari=0;i<=padding;i++){//如果满足了第一个charAt是相等的//开始子循环检测//其中sourceStr的取值是需要叠加i的值if(sourceStr.charAt(i)==searchStr.charAt(0)){//匹配成功的**varcomplete=searchLength;for(varj=0;j<searchLength;j++){if(sourceStr.charAt(i+j)==searchStr.charAt(j)){--completeif(!complete){returni;}}}}}return-1;}///////////暴力算法////优化版/////////functionBF_Optimize_1(sourceStr,searchStr){varmainLength=sourceStr.length;varsearchLength=searchStr.length;varpadding=mainLength-searchLength;for(varoffset=0;offset<=padding;offset++){varmatch=true;for(vari=0;i<searchLength;i++){//取反,如果只要不相等if(searchStr.charAt(i)!==sourceStr.charAt(offset+i)){match=false;bre**;}}if(match)returnoffset;}return-1;}//////////优化版////while////////functionBF_Optimize_2(sourceStr,searchStr){vari=0,j=0;while(i<sourceStr.length){//两字母相等则继续if(sourceStr.charAt(i)==searchStr.charAt(j)){i++;j++;}else{//两字母不等则角标后退重新开始匹配i=i-j+1;//i回退到上次匹配首位的下一位j=0;//j回退到子串的首位}if(j==searchStr.length){returni-j;}}}///////////暴力算法//递归版本/////////functionBF_Recursive(sourceStr,searchStr,offset){varmainLength=sourceStr.length;varsearchLength=searchStr.length;if(searchLength>mainLength-offset){return-1;}offset=offset||0;for(vari=0;searchLength>i;i++){if(searchStr.charAt(i)!==sourceStr.charAt(offset+i)){returnBF_Recursive(sourceStr,searchStr,offset+1)}}returnoffset;}varsourceStr="TherearesometimeswTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkTherearesometimeswhenclicking“like”onafriend'sFacebookstatusdoesn'tfeelappropriate.Abadday.Alovedonelost.Abre**up.Itonlyseemsnaturalthata“dislike”buttoncouldsolvetheco**ndrumofwantingtoempathizebutnotseeminappropriatebyclicking“like.”MarkZuckerbergPutstheRestofUstoShamebySpe**ingFluentChinese.MarkZuckerberg:FacebookFounderandAnimalButcher.MarkZuckerbergandThatShirt.TheideahasbeenonMarkZuckerberg'sradarforawhile,hesaid.In2010,hetoldABCNews'DianeSawyerthatthatFacebookwould“definitelythinkthatthatFacebookwould“definitelythink**ut”addingadislikebutton.“Peopledefinitelyseemtowantit,”Zuckerbergsaid.Fouryearslater—ZuckerbergsaysFacebookisstill“thinking**ut”addingtheoft-requestedsdfafdbutton,ZuckerbergsaysFacebookisstill“thinking**ut”addingtheoft-requestedbutton.AtatownhallmeetingonThursday,theCEOrevealedhehassomereservations**utthefeature.“Therearetwothingsthatitcanmean,”Zuckerbergsaidofthepotentialbutton,whichcouldbeusedinameanspiritedwayortoexpressempathy.Findinghowtolimitittothelatteristhechallenge.Zuckerbergsaidhedoesn'twantthebuttontoturnintoa“votingmechani**”orsomethingthatisn't“sociallyvaluable.”“Oftenpeoplewilltellustheydon'tfeelcomfortablepressing‘like,'”Zuckerbergsaid.“What'stherightwaytom**eitsopeoplecaneasierexpressawiderangeofemotions?”Onesuggestionpercolatingonline:AaronRolloutthefeatureunderadifferentname.h**owever,an“empathybutton”justmaynoth**ethesameringtoitas“dislike.”";varsearchStr="addingtheoft-requestedsdf";functionshow(bf_name,fn){varmyDate=+newDate()varr=fn();vardiv=document.createElement('div')div.innerh**TML=bf_name+'算法,搜索位置:'+r+",耗时"+(+newDate()-myDate)+"ms";document.body.appendChild(div);}show('BF_Ordinary',function(){returnBF_Ordinary(sourceStr,searchStr)})show('BF_Optimize_1',function(){returnBF_Optimize_1(sourceStr,searchStr)})show('BF_Optimize_2',function(){returnBF_Optimize_2(sourceStr,searchStr)})show('BF_Recursive',function(){returnBF_Recursive(sourceStr,searchStr)})</script>

  BF也是经典的前缀匹配算法,前缀还包括KMP,我们可见这种算法最大缺点就是字符匹配失败指针就要回溯,所以性能很低,之后会写一下KMP与BM算法针对BF的的升级