์™œ ์šฐ๋ฆฌ๋Š” String Matching Algorithm์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ• ๊นŒ?

  • String Matching์€ ์šฐ๋ฆฌ๊ฐ€ ํ‰์†Œ์— ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    • ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ Text์™€ Pattern์ด ๋ฐฑ๊ณผ์‚ฌ์ „์ฒ˜๋Ÿผ ๋งŽ์€ ์–‘์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด?
    • Algorithm์ด ๋งค์šฐ ๋Š๋ ค์ง€๋Š”๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ์„ ๋œ String Matching Algorithm์ด ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  • DNA Pattern์„ ์ฐพ๋Š” ๊ณผ์ •์ด ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ž…๋‹ˆ๋‹ค.

Naive String Matching Algorithm

  • ๋‹จ์ˆœํžˆ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฌธ์ œ์ ์€ ์—†์„๊นŒ์š”?

  • ๊ฐ๊ฐ์˜ Pattern๊ณผ Text์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์„ ํ˜•์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๋Š” ๋ฌธ์ œ
  • Time Complexity : O(pattern_size * text_size)

Rabin-Karp Algorithm

  • 2์ฐจ์› ํŒจํ„ด ๋งค์นญ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ŠคํŠธ๋ง ๋งค์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ๋‹จ์ˆœํžˆ ๋ฌธ์ž ํ•˜๋‚˜ํ•˜๋‚˜ ๋น„๊ตํ•˜๊ธฐ ์ „์—?
    • ๋จผ์ € ๋ฌธ์ž์—ด์„ Hash๊ฐ’ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
    • ํŒจํ„ด Hash๊ฐ’๊ณผ ๋น„๊ตํ•˜์—ฌ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
  • ํŠน์ˆ˜ํ•œ Case๋ฅผ ์ œ์™ธํ•˜๋ฉด ํ‰๊ท  ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

๋งค๋ฒˆ ๋ฌธ์ž์—ด ์ „์ฒด๋ฅผ ๊ฐ€์ ธ์™€์„œ Hash๊ฐ’์„ ๊ณ„์‚ฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

๋ฌธ์ œ์ ์€ ์—†์„๊นŒ์š”?

  • Hash๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ญ์ƒ ํŒจํ„ด์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Time Complexity
    • ์ „์ฒ˜๋ฆฌ ์‹œ๊ฐ„ : O(m)
    • ์ตœ์•…์˜ ๊ฒฝ์šฐ : O((n-m+1)m)

KMP(Knuth-Morris-Pratt) Algorithm

  • ํŒจํ„ด์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ณ  ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐฐ์—ด์— ์ €์žฅ ๋ฐ ๋ณด์กฐ ํ•จ์ˆ˜๋กœ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์ „์ดํ•˜๋Š” Algorithm

๋ฌธ์ œ์ ์€ ์—†์„๊นŒ์š”?

  • Pattern์—์„œ prefix์™€ suffix๊ฐ€ Matching์ด ๋˜๋Š” ๋ถ€๋ถ„์ด ๋งŽ์ง€ ์•Š๋‹ค๋ฉด ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Time Complexity
    • ์ „์ฒ˜๋ฆฌ ์‹œ๊ฐ„ : O(m)
    • ์ตœ์•…์˜ ๊ฒฝ์šฐ : O((n-m+1)m)

Source Code

Reference