免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

漫畫:如何優(yōu)化 “字符串匹配算法”?

:2020年02月18日 腳本之家
分享到:

說起“字符串匹配”,恐怕算得上是計(jì)算機(jī)領(lǐng)域應(yīng)用最多的功能之一,為了滿足這一需求,聰明的計(jì)算機(jī)科學(xué)家們發(fā)明了許多巧妙的算法。在上一篇漫畫中,我們介紹了BF算法和RK算法,沒看過的小伙伴可以先補(bǔ)補(bǔ)...

說起“字符串匹配”,恐怕算得上是計(jì)算機(jī)領(lǐng)域應(yīng)用最多的功能之一,為了滿足這一需求,聰明的計(jì)算機(jī)科學(xué)家們發(fā)明了許多巧妙的算法。

在上一篇漫畫中,我們介紹了BF算法RK算法,沒看過的小伙伴可以先補(bǔ)補(bǔ)課:

漫畫:什么是字符串匹配算法?

今天,我們來介紹一種性能大大優(yōu)化的字符串匹配算法。

BF算法是如何工作的?

正如同它的全稱BruteForce一樣,BF算法使用簡(jiǎn)單粗暴的方式,對(duì)主串和模式串進(jìn)行逐個(gè)字符的比較。

比如給定主串和模式串如下:

它們的比較過程是什么樣的呢?

第一輪,模式串和主串的第一個(gè)等長子串比較,發(fā)現(xiàn)第0位字符一致,第1位字符一致,第2位字符不一致:

第二輪,模式串向后挪動(dòng)一位,和主串的第二個(gè)等長子串比較,發(fā)現(xiàn)第0位字符不一致:

第三輪,模式串繼續(xù)向后挪動(dòng)一位,和主串的第三個(gè)等長子串比較,發(fā)現(xiàn)第0位字符不一致:

以此類推,一直到第N輪:

當(dāng)模式串挪動(dòng)到某個(gè)合適位置,逐個(gè)字符比較,發(fā)現(xiàn)每一位字符都是匹配時(shí),比較結(jié)束:

壞字符規(guī)則

“壞字符” 是什么意思?就是指模式串和子串當(dāng)中不匹配的字符。

還以上面的字符串為例,當(dāng)模式串和主串的第一個(gè)等長子串比較時(shí),子串的最后一個(gè)字符T就是壞字符:

當(dāng)檢測(cè)到第一個(gè)壞字符之后,我們有必要讓模式串一位一位向后挪動(dòng)和比較嗎?并不需要。

因?yàn)橹挥?strong>模式串與壞字符T對(duì)齊的位置也是字符T的情況下,兩者才有匹配的可能。

不難發(fā)現(xiàn),模式串的第1位字符也是T,這樣一來我們就可以對(duì)模式串做一次“乾坤大挪移”,直接把模式串當(dāng)中的字符T和主串的壞字符對(duì)齊,進(jìn)行下一輪的比較:

壞字符的位置越靠右,下一輪模式串的挪動(dòng)跨度就可能越長,節(jié)省的比較次數(shù)也就越多。這就是BM算法從右向左檢測(cè)的好處。

接下來,我們繼續(xù)逐個(gè)字符比較,發(fā)現(xiàn)右側(cè)的G、C、G都是一致的,但主串當(dāng)中的字符A,是又一個(gè)壞字符:

我們按照剛才的方式,找到模式串的第2位字符也是A,于是我們把模式串的字符A和主串中的壞字符對(duì)齊,進(jìn)行下一輪比較:

接下來,我們繼續(xù)逐個(gè)字符比較,這次發(fā)現(xiàn)全部字符都是匹配的,比較公正完成:

  1. //在模式串中,查找index下標(biāo)之前的字符是否和壞字符匹配

  2. private

  3. static

  4. int

  5. findCharacter

  6. (

  7. String

  8. pattern

  9. ,

  10. char

  11. badCharacter

  12. ,

  13. int

  14. index

  15. )

  16. {

  17. for

  18. (

  19. int

  20. i

  21. =

  22. index

  23. -

  24. 1

  25. ;

  26. i

  27. >=

  28. 0

  29. ;

  30. i

  31. --){

  32. if

  33. (

  34. pattern

  35. .

  36. charAt

  37. (

  38. i

  39. )

  40. ==

  41. badCharacter

  42. ){

  43. return

  44. i

  45. ;

  46. }

  47. }

  48. //模式串不存在該字符,返回-1

  49. return

  50. -

  51. 1

  52. ;

  53. }

  54. public

  55. static

  56. int

  57. boyerMoore

  58. (

  59. String

  60. str

  61. ,

  62. String

  63. pattern

  64. )

  65. {

  66. int

  67. strLength

  68. =

  69. str

  70. .

  71. length

  72. ();

  73. int

  74. patternLength

  75. =

  76. pattern

  77. .

  78. length

  79. ();

  80. //模式串的起始位置

  81. int

  82. start

  83. =

  84. 0

  85. ;

  86. while

  87. (

  88. start

  89. <=

  90. strLength

  91. -

  92. patternLength

  93. )

  94. {

  95. int

  96. i

  97. ;

  98. //從后向前,逐個(gè)字符比較

  99. for

  100. (

  101. i

  102. =

  103. patternLength

  104. -

  105. 1

  106. ;

  107. i

  108. >=

  109. 0

  110. ;

  111. i

  112. --)

  113. {

  114. if

  115. (

  116. str

  117. .

  118. charAt

  119. (

  120. start

  121. +

  122. i

  123. )

  124. !=

  125. pattern

  126. .

  127. charAt

  128. (

  129. i

  130. ))

  131. //發(fā)現(xiàn)壞字符,跳出比較,i記錄了壞字符的位置

  132. break

  133. ;

  134. }

  135. if

  136. (

  137. i

  138. <

  139. 0

  140. )

  141. {

  142. //匹配成功,返回第一次匹配的下標(biāo)位置

  143. return

  144. start

  145. ;

  146. }

  147. //尋找壞字符在模式串中的對(duì)應(yīng)

  148. int

  149. charIndex

  150. =

  151. findCharacter

  152. (

  153. pattern

  154. ,

  155. str

  156. .

  157. charAt

  158. (

  159. start

  160. +

  161. i

  162. ),

  163. i

  164. );

  165. //計(jì)算壞字符產(chǎn)生的位移

  166. int

  167. bcOffset

  168. =

  169. charIndex

  170. >=

  171. 0

  172. ?

  173. i

  174. -

  175. charIndex

  176. :

  177. i

  178. +

  179. 1

  180. ;

  181. start

  182. +=

  183. bcOffset

  184. ;

  185. }

  186. return

  187. -

  188. 1

  189. ;

  190. }

  191. public

  192. static

  193. void

  194. main

  195. (

  196. String

  197. []

  198. args

  199. )

  200. {

  201. String

  202. str

  203. =

  204. "GTTATAGCTGGTAGCGGCGAA"

  205. ;

  206. String

  207. pattern

  208. =

  209. "GTAGCGGCG"

  210. ;

  211. int

  212. index

  213. =

  214. boyerMoore

  215. (

  216. str

  217. ,

  218. pattern

  219. );

  220. System

  221. .

  222. out

  223. .

  224. println

  225. (

  226. "首次出現(xiàn)位置:"

  227. +

  228. index

  229. );

  230. }

好后綴規(guī)則

“好后綴” 又是什么意思?就是指模式串和子串當(dāng)中相匹配的后綴。

讓我們看一組新的例子:

對(duì)于上面的例子,如何我們繼續(xù)使用“壞字符規(guī)則”,會(huì)有怎樣的效果呢?

從后向前比對(duì)字符,我們發(fā)現(xiàn)后面三個(gè)字符都是匹配的,到了第四個(gè)字符的時(shí)候,發(fā)現(xiàn)壞字符G:

接下來我們?cè)谀J酱业搅藢?duì)應(yīng)的字符G,但是按照壞字符規(guī)則,模式串僅僅能夠向后挪動(dòng)一位:

這時(shí)候壞字符規(guī)則顯然并沒有起到作用,為了能真正減少比較次數(shù),輪到我們的好后綴規(guī)則出場(chǎng)了。由于好后綴規(guī)則的實(shí)現(xiàn)細(xì)節(jié)比壞字符規(guī)則要難理解得多,所以我們這里只介紹一個(gè)大概思路:

我們回到第一輪的比較過程,發(fā)現(xiàn)主串和模式串都有共同的后綴“GCG”,這就是所謂的“好后綴”。

如果模式串其他位置也包含與“GCG”相同的片段,那么我們就可以挪動(dòng)模式串,讓這個(gè)片段和好后綴對(duì)齊,進(jìn)行下一輪的比較:

顯然,在這個(gè)例子中,采用好后綴規(guī)則能夠讓模式串向后移動(dòng)更多位,節(jié)省了更多無謂的比較。

[我要糾錯(cuò)]
[編輯:王振袢 &發(fā)表于江蘇]
關(guān)鍵詞: 說起 字符串匹配 恐怕 得上 計(jì)算機(jī)

來源:本文內(nèi)容搜集或轉(zhuǎn)自各大網(wǎng)絡(luò)平臺(tái),并已注明來源、出處,如果轉(zhuǎn)載侵犯您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)聯(lián)系小編,我們會(huì)及時(shí)審核處理。
聲明:江蘇教育黃頁對(duì)文中觀點(diǎn)保持中立,對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或者完整性不提供任何明示或暗示的保證,不對(duì)文章觀點(diǎn)負(fù)責(zé),僅作分享之用,文章版權(quán)及插圖屬于原作者。

點(diǎn)個(gè)贊
0
踩一腳
0

您在閱讀:漫畫:如何優(yōu)化 “字符串匹配算法”?

Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發(fā)布查詢平臺(tái)保留所有權(quán)利

蘇公網(wǎng)安備32010402000125 蘇ICP備14051488號(hào)-3技術(shù)支持:南京博盛藍(lán)睿網(wǎng)絡(luò)科技有限公司

南京思必達(dá)教育科技有限公司版權(quán)所有   百度統(tǒng)計(jì)

主站蜘蛛池模板: 国产成人综合久久亚洲精品 | 中国精品久久 | 欧洲在线| 亚洲欧美日韩在线不卡中文 | 巨胸喷奶水www久久久 | 国产亚洲sss在线观看 | dy888午夜国产午夜精品 | 国产呦萝资源网站 | 亚洲精品成人网久久久久久 | 国产精品1| 天天曰天天干 | 一级一黄在线观看视频免费 | 人人草视频在线观看 | 国产精品视频免费看 | 丝袜美女网| 经典三级第一页 | 女性一级全黄生活片在线播放 | 国产日本久久久久久久久婷婷 | 精品国产品欧美日产在线 | 欧美性猛交xxxxxxxx软件 | 精品在线视频一区 | 色在线影院 | 九九精品视频在线 | 97国产视频 | 三级伦理片高清在线观看播放 | 久久亚洲欧美 | 欧美亚洲香蕉 | 九九精品视频在线 | 欧美日韩综合高清一区二区 | 白洁的性荡生活全文 | 夜夜躁狠狠躁日日躁视频 | 亚洲成人动漫在线观看 | 在线亚洲观看 | 在线观看视频www | 成人国产精品一级毛片视频 | 欧美bbbbxxxx | 一级韩国aa毛片免费观看 | youjizzxxxx18日本 yy3341殇情影院理论片 | 最近的中文字幕在线看 | 午夜小视频在线观看 | 国产精品合集一区二区 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產(chǎn)品享最低成本,有需要聯(lián)系,
  • 卡爾蔡司鏡片優(yōu)惠店,鏡片價(jià)格低
  • 蘋果原裝手機(jī)殼