Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

๋ผ๋นˆ-์นดํ”„(Rabin-Karp) ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ž์—ด

๋ผ๋นˆ-์นดํ”„(Rabin-Karp) ์•Œ๊ณ ๋ฆฌ์ฆ˜

2023. 4. 9. 22:12

1. ๊ฐœ๋… โšฝ

  ๋ผ๋นˆ-์นดํ”„(Rabin-Karp) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ํ•ด์‹ฑ(Hashing)์„ ์ด์šฉํ•œ ๋ฌธ์ž์—ด ๋งค์นญ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž๋“ค๊ณผ ํŒจํ„ด์˜ ๋ฌธ์ž๋“ค์„ ์ผ์ผ์ด ๋น„๊ตํ•˜๋Š” ๋Œ€์‹ ์— ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

2. ๋™์ž‘๋ฐฉ์‹(์—ฐ์Šต์šฉ) ๐Ÿ€

๋™์ž‘ ๋ฐฉ์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  2. ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  3. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  4. ์ผ์น˜ํ•˜๋ฉด ํŒจํ„ด๊ณผ ์ฐพ์€ ๋ฌธ์ž์—ด์„ 1:1 ๋น„๊ตํ•œ๋‹ค.
    ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ํ•œ ์นธ ๋’ค๋กœ ์˜ฎ๊ฒจ์„œ 3๋ฒˆ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ๋‹ค.

  ํ•ด์‹œ๊ฐ’์ด ๊ฐ™๋”๋ผ๋„ 1:1 ๋งค์นญ์„ ํ†ตํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ํŒจํ„ด๊ณผ ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ์ ˆ์ฐจ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ•ด์‹œ๊ฐ’์ด ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ๋ฌด์กฐ๊ฑด ๊ฐ™์€ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ๋ณด์žฅํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋™์ž‘๋ฐฉ์‹์„ ์ดํ•ดํ•ด ๋ณด์ž. '4 1 2 3 5'๋ผ๋Š” ๋ฌธ์ž์—ด๊ณผ '1 2 3'์ด๋ผ๋Š” ํŒจํ„ด์ด ์ฃผ์–ด์กŒ๋‹ค๊ณ  ํ•˜์ž.

  ํ•ด์‹œํ•จ์ˆ˜์€ ๋ฌธ์ž์—ด์„ 10์ง„์ˆ˜๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•˜์ž. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒจํ„ด '1 2 3'์˜ ํ•ด์‹œ๊ฐ’์€ 123์ด ๋˜๊ณ  '4 3 1'์˜ ํ•ด์‹œ๊ฐ’์€ 431์ด ๋  ๊ฒƒ์ด๋‹ค.

  ์œ„์—์„œ ์‚ดํŽด๋ณธ ๋™์ž‘๋ฐฉ์‹ ์ด์šฉํ•˜์—ฌ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์•„๋ณด์ž.

1. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’(412) != ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’(123)

2. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’(123) == ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’(123)

3. 1:1 ๋งค์นญ ๋น„๊ต

  ํ•ด์‹œ๊ฐ’๋„ ์ผ์น˜ํ•˜๊ณ  1:1 ๋งค์นญ๋„ ์„ฑ๋ฆฝํ•˜๋ฏ€๋กœ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

3. ๋™์ž‘๋ฐฉ์‹(์‹ค์ „์šฉ) ๐Ÿ

  ์œ„์˜ ๋ฐฉ์‹์œผ๋กœ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด์‹œ๊ฐ’์ด ๋„ˆ๋ฌด ์ปค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๋ผ๋นˆ-์นดํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ํ•ด์‹œ ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  ํ•ด์‹œ ํ•จ์ˆ˜๋Š” '๊ฐ ๋ฌธ์ž์˜ ์•„์Šคํ‚ค์ฝ”๋“œ ๊ฐ’์— 2์˜ ์ œ๊ณฑ ์ˆ˜๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๊ณฑํ•˜์—ฌ ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ'์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ž์—ด์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ํ•ด์‹œ ๊ฐ’์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค.

  ์˜ˆ๋ฅผ ๋“ค์–ด 'aba'์˜ ํ•ด์‹œ ๊ฐ’์€ '(97 * 2^2) + (98 * 2^1) + (97 * 2^0) = 388 + 196 + 97 = 681', 'bab'์˜ ํ•ด์‹œ๊ฐ’์€ '(98 * 2^2) + (97 * 2^1) + (98 * 2^0) = 392 + 194 + 98 = 684'๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค.

  ๋ฌธ์ž์—ด 'ababacab'์™€ ํŒจํ„ด 'baca'๋ฅผ ์ด์šฉํ•˜์—ฌ ์‹ค์ œ ์ ์šฉ์„ ํ•ด๋ณด์ž. ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’์€ '(98 * 2^3) + (97 * 2^2) + (99 * 2^1) + (97 * 2^0) = 1467'์ด๋‹ค.

1. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’ : (97 * 2^3) + (98 * 2^2) + (97 * 2^1) + (98 * 2^0) = 1460

ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’(1467)๊ณผ ๋ถˆ์ผ์น˜

2. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’ : (98 * 2^3) + (97 * 2^2) + (98 * 2^1) + (97 * 2^0) = 1465

ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’(1467)๊ณผ ๋ถˆ์ผ์น˜

3. ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’ : (97 * 2^3) + (98 * 2^2) + (97 * 2^1) + (99 * 2^0) = 1461

ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’(1467)๊ณผ ๋ถˆ์ผ์น˜

4) ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’ : (98 * 2^3) + (97 * 2^2) + (99 * 2^1) + (97 * 2^0) = 1467

ํŒจํ„ด์˜ ํ•ด์‹œ๊ฐ’(1467)๊ณผ ์ผ์น˜

5. 1:1 ๋งค์นญ ๋น„๊ต

  ํ•ด์‹œ๊ฐ’๋„ ์ผ์น˜ํ•˜๊ณ  1:1 ๋งค์นญ๋„ ์„ฑ๋ฆฝํ•˜๋ฏ€๋กœ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ์ฐพ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

4. Rolling Hash โšพ

  Rolling Hash๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋น„๊ตํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’์„ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. Rolling Hash๋ž€ Sliding Window์™€ ๊ฐ™์ด ๋ฌธ์ž์—ด์„ ํ›‘์œผ๋ฉด์„œ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฐฉ๋ฒ•์€ ์ค‘๋ณต๋˜๋Š” ํ•ด์‹œ๊ฐ’์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ์—…๋ฐ์ดํŠธ๋˜๋Š” ๋ถ€๋ถ„๋งŒ ํ•ด์‹œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. (Sliding Window์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด๋‹ค.)

  ์œ„์—์„œ ์‚ฌ์šฉํ•œ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’์€ '2 * (์ด์ „ ๋ฌธ์ž์—ด์˜ ํ•ด์‹œ๊ฐ’ - ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฌธ์ž์˜ ๊ฐ’) + ์ƒˆ๋กœ ๋“ค์–ด์˜จ ๋ฌธ์ž์˜ ๊ฐ’'์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. '์ด์ „์˜ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•œ ๋ฐฉ์‹'๊ณผ 'Rolling Hash๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐฉ์‹'์„ ๋น„๊ตํ•˜๋ฉด์„œ ์‚ดํŽด๋ณด์ž.

[๊ธฐ์กด ๋ฐฉ์‹]

์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด : ababacab

  1. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : abab
    ํ•ด์‹œ๊ฐ’ : (97 * 2^3) + (98 * 2^2) + (97 * 2^1) + (98 * 2^0) = 1460
  2. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : baba
    ํ•ด์‹œ๊ฐ’ : (98 * 2^3) + (97 * 2^2) + (98 * 2^1) + (97 * 2^0) = 1465
  3. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : abac
    (97 * 2^3) + (98 * 2^2) + (97 * 2^1) + (99 * 2^0) = 1461
  4. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : baca
    (98 * 2^3) + (97 * 2^2) + (99 * 2^1) + (97 * 2^0) = 1467

[Rolling Hash๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹]

์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด : ababacab

  1. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : abab
    ํ•ด์‹œ๊ฐ’ : (97 * 2^3) + (98 * 2^2) + (97 * 2^1) + (98 * 2^0) = 1460
  2. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : baba
    ํ•ด์‹œ๊ฐ’ : 2 * (1460 - (97 * 2^3)) + 97 = 1465
  3. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : abac
    ํ•ด์‹œ๊ฐ’ : 2 * (1460 - (98 * 2^3)) + 99 = 1461
  4. ๋น„๊ตํ•  ๋ฌธ์ž์—ด : baca
    ํ•ด์‹œ๊ฐ’ : 2 * (1460 - (97 * 2^3)) + 97 = 1467

 

5. MOD & ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๐Ÿˆ

  ์ •ํ™•ํ•œ ํ•ด์‹œ๊ฐ’์˜ ์ผ์น˜ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํ•ด์‹œ๊ฐ’์€ ๋™์ผํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. (๋” ์•ˆ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.)

 

6. ๊ตฌํ˜„(JAVA) ๐ŸŽฑ

public static void main(String[] args) {
    String str = "ababacab";
    String pattern = "baca";

    int findIdx = 0;
    boolean isFind = false;

    int strLen = str.length();
    int patternLen = pattern.length();
    int power = 1;


    int compareStrHash = 0;
    int patternHash = 0;
    for(int i = 0; i <= strLen - patternLen; i++) {
        // ์ฒซ ๋น„๊ต ๋ฌธ์ž์—ด๊ณผ ํŒจํ„ด ํ•ด์‹œ๊ฐ’ ๊ตฌํ•˜๊ธฐ
        if(i == 0) {
            for(int j = 0; j < patternLen; j++) {
                compareStrHash += str.charAt(patternLen - 1 - j) * power;
                patternHash += pattern.charAt(patternLen - 1 - j) * power;
                if(j < patternLen - 1) {
                    power *= 2;
                }
            }
        }
        else {
            compareStrHash = 2 * (compareStrHash - str.charAt(i - 1) * power) 
                            + str.charAt(patternLen - 1 + i); 
        }

        // ํ•ด์‹œ๊ฐ’์ด ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ // 1:1 ๋งค์นญ ๋น„๊ต
        if(compareStrHash == patternHash) {
            for(int j = 0; j < patternLen; j++) {
                if(str.charAt(i + j) != pattern.charAt(j)) {
                    break;
                }

                if(j == patternLen - 1) {
                    isFind = true;
                    findIdx = i;
                }
            }
        }

        if(isFind) {
            break;
        }
    }

    if(isFind) {
        System.out.println(findIdx + "๋ฒˆ์งธ์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.");
    }
    else {
        System.out.println("์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.");
    }
    // 3๋ฒˆ์งธ์—์„œ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.
}

 

7. ์‹œ๊ฐ„๋ณต์žก๋„ ๐ŸŽณ

  ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ N์ด๊ณ  ํŒจํ„ด์˜ ๊ธธ์ด๊ฐ€ M์ด๋ผ๊ณ  ํ•  ๋•Œ, ์ตœ์•…์˜ ๊ฒฝ์šฐ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(NM)์„ ๊ฐ€์ง„๋‹ค. ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰์— ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๊ณ  ํ•ญ์ƒ ํ•ด์‹œ ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  ํ•˜์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” O(NM) ๋ณด๋‹ค ์ ๊ฒŒ ์†Œ์š”๋œ๋‹ค.

 

ํ•ด๋‹น ๊ธ€์€
๋‚˜๋™๋นˆ ๋‹˜์˜ '31. ๋ผ๋นˆ ์นดํ”„(Rabin-Karp) ์•Œ๊ณ ๋ฆฌ์ฆ˜',
๋ณ„์ค€ ๋‹˜์˜ 'Rabin-karp(๋ผ๋นˆ ์นดํ”„) ์•Œ๊ณ ๋ฆฌ์ฆ˜',
๊ธฐ์–ตํ•˜๊ณ ์‹ถ์€๊ฒƒ๋“ค ๋ธ”๋กœ๊ทธ์˜ '[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ผ๋นˆ ์นดํ”„(Rabin-Karp)(๋ฌธ์ž์—ด ํƒ์ƒ‰)(Rolling Hash)'
๋ฅผ ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

'๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ > ๋ฌธ์ž์—ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋ณด์ด์–ด-๋ฌด์–ด(Boyer-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜  (1) 2023.04.10
    '๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ž์—ด' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ๋ณด์ด์–ด-๋ฌด์–ด(Boyer-Moore) ์•Œ๊ณ ๋ฆฌ์ฆ˜
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”