ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

Поиск подстроки Π² строкС

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π’ Π½Π°ΡΡ‚оящСС врСмя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ инкапсулированы Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ высокоуровнСвыС языки программирования. Но ΡΡ‚ΠΎΠΈΡ‚ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡΠ°ΠΌΡ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅, ΠΈ Π΅ΡΠ»ΠΈ основной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ поиска. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ поиска… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Поиск подстроки Π² строкС (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠœΠΈΠ½ΠΈΡΡ‚Π΅Ρ€ΡΡ‚Π²ΠΎ образования ΠΈ Π½Π°ΡƒΠΊΠΈ Российской Π€Π΅Π΄Π΅Ρ€Π°Ρ†ΠΈΠΈ Π€Π“Π‘ΠžΠ£ Π’ΠŸΠž «Π‘аратовский государствСнный унивСрситСт ΠΈΠΌ. Π.Π“. Π§Π΅Ρ€Π½Ρ‹ΡˆΠ΅Π²ΡΠΊΠΎΠ³ΠΎ»

ΠšΠ°Ρ„Π΅Π΄Ρ€Π° матСматичСской ΠΊΠΈΠ±Π΅Ρ€Π½Π΅Ρ‚ΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… Π½Π°ΡƒΠΊ ΠšΠ£Π Π‘ΠžΠ’ΠΠ― Π ΠΠ‘ΠžΠ’Π Поиск подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ Π‘Π°Ρ€Π°Ρ‚ΠΎΠ², 2011

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

Поиск ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ — ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½Ρ‹Ρ… использований ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, ΠΈ Π±Ρ‹ΡΡ‚Ρ€Ρ‹ΠΉ поиск Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΠΌΡ‹Ρ… ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… Π·Π°Π΄Π°Ρ‡ поиска ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Однако эта Π·Π°Π΄Π°Ρ‡Π° являСтся Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ Π²Π°ΠΆΠ½ΠΎΠΉ. Данная функция встроСна Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ тСкстовыС Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ сущСствСнно ускоряСт процСсс поиска ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π·Π°ΠΌΠ΅Π½Ρƒ) Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ².

Π’ Π½Π°ΡΡ‚оящСС врСмя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ инкапсулированы Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ высокоуровнСвыС языки программирования. Но ΡΡ‚ΠΎΠΈΡ‚ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ стандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΄Π°Π»Π΅ΠΊΠΎ Π½Π΅ ΡΠ°ΠΌΡ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΈ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅, ΠΈ Π΅ΡΠ»ΠΈ основной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅, Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ поиска. Π’Π°ΠΊΠΆΠ΅ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π±Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ поиска Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ся ΠΎΠ΄Π½ΠΈΠΌΠΈ тСкстовыми Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ ΠΈ Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Алгоритмы поиска ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ поисковыми Ρ€ΠΎΠ±ΠΎΡ‚Π°ΠΌΠΈ ΠΏΡ€ΠΈ индСксации страниц, ΠΈ ΠΎΡ‚ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΠΈ нахоТдСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов Π² Ρ‚СкстС html зависит Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Π‘ΠΏΠ°ΠΌ-Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Ρ… сСрвисов Ρ‚Π°ΠΊΠΆΠ΅ занимаСтся поиском Π² Ρ‚СкстС писСм ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Ρ„Ρ€Π°Π·, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: «ΠœΠΈΠ»Π»ΠΈΠΎΠ½ Π·Π° Ρ‡Π°Ρ», «Π“олосуй Π·Π° Π˜Π²Π°Π½ΠΎΠ²Π°!». Π”Π° Π΄Π°ΠΆΠ΅ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ Π½Π΅Ρ†Π΅Π½Π·ΡƒΡ€Π½Ρ‹Ρ… слов ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² MMORPG (massively multiplayer online role-playing game — ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ ролСвая ΠΎΠ½Π»Π°ΠΉΠ½-ΠΈΠ³Ρ€Π°) являСтся ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ примСнСния Π΄Π°Π½Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ. ВсС это Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ ΠΎΠ± Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅.

ЦСль курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅ΡΡ‚ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· основных Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅. Π Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ нСсколько практичСских Π·Π°Π΄Π°Ρ‡ Π½Π° Π΄Π°Π½Π½ΡƒΡŽ Ρ‚Π΅ΠΌΡƒ.

Π—Π°Π΄Π°Ρ‡ΠΈ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹: привСсти основныС опрСдСлСния ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅, Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΡƒΡŽ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΡΡ‚ΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

1. Алгоритмы поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅

1.1 ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ опрСдСлСния ΠΈ ΠΏΠΎΠ½ΡΡ‚ия ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘Ρ‚Ρ€ΠΎΠΊΠ° (слово) — это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°ΠΊΠΎΠ², Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, ΠΈΠ· Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ мноТСства, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π°Π»Ρ„Π°Π²ΠΈΡ‚ΠΎΠΌ.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π”Π»ΠΈΠ½Π° строки — количСство Π·Π½Π°ΠΊΠΎΠ² Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅.

Π‘Π»ΠΎΠ²Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ΡΡ Π±ΡƒΠΊΠ²Π°ΠΌΠΈ латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ — слово Π΄Π»ΠΈΠ½Π½ΠΎΠΉ, гдСая Π±ΡƒΠΊΠ²Π° слова. Π‘ΡƒΠ΄Π΅ΠΌ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ строки .

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘Π»ΠΎΠ²ΠΎ, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰Π΅Π΅ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹, называСтся пустым. ΠŸΡƒΡΡ‚ΠΎΠ΅ слово ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ обозначаСтся Π±ΡƒΠΊΠ²ΠΎΠΉ. .

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘Π»ΠΎΠ²ΠΎ называСтся прСфиксом слова, Ссли Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ слово, Ρ‡Ρ‚ΠΎ. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ само слово являСтся прСфиксом для самого сСбя, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ найдСтся Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ слово, Ρ‡Ρ‚ΠΎ .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: слово asd являСтся прСфиксом слова asdqwe.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘Π»ΠΎΠ²ΠΎ называСтся суффиксом слова, Ссли Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ слово, Ρ‡Ρ‚ΠΎ. Аналогично, слово являСтся суффиксом самого сСбя.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: слово qwe являСтся суффиксом слова asdqwe.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘Π»ΠΎΠ²ΠΎ называСтся подстрокой строки, Ссли найдутся Ρ‚Π°ΠΊΠΈΠ΅ строки ΠΈ, Ρ‡Ρ‚ΠΎ. ΠŸΡ€ΠΈ этом называСтся Π»Π΅Π²Ρ‹ΠΌ, Π° — ΠΏΡ€Π°Π²Ρ‹ΠΌ ΠΊΡ€Ρ‹Π»ΠΎΠΌ подстроки. ΠŸΠΎΠ΄ΡΡ‚Ρ€ΠΎΠΊΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ ΡΠ°ΠΌΠΎ слово. Иногда ΠΏΡ€ΠΈ этом слово Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ Π² ΡΠ»ΠΎΠ²ΠΎ. Π‘Ρ€Π΅Π΄ΠΈ всСх Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ слова Π² ΡΠ»ΠΎΠ²ΠΎ, Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ с Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠ΅ΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ своСго Π»Π΅Π²ΠΎΠ³ΠΎ ΠΊΡ€Ρ‹Π»Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈΠ»ΠΈ Π³Π»Π°Π²Π½Ρ‹ΠΌ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ. Для обозначСния вхоТдСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ .

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: слова asd ΠΈ qwe ΡΠ²Π»ΡΡŽΡ‚ΡΡ подстроками слова ryrqwetrasdyrt.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° — Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ объСма Ρ€Π°Π±ΠΎΡ‚Ρ‹, выполняСмой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, объСм Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ измСряСтся абстрактными понятиями Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ ΠΏΡ€ΠΎΡΡ‚ранства, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ рСсурсами. Π’. Π΅. ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° — это количСство Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, ΠΈ ΠΎΠ±ΡŠΠ΅ΠΌ Ρ€Π°ΡΡ…ΠΎΠ΄ΡƒΡŽΡ‰Π΅ΠΉΡΡ ΠΏΡ€ΠΈ этом памяти. Π£Ρ‡Π΅Ρ‚ памяти ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ вСдСтся ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Ρ…. ВрСмя ΠΆΠ΅ рассчитываСтся Π² ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΅Π΄ΠΈΠ½ΠΈΡ†Π°Ρ… Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта ΠΎΡ†Π΅Π½ΠΊΠ° Π±Ρ‹Π»Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠΉ для процСссоров с Ρ€Π°Π·Π½ΠΎΠΉ частотой.

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π΅ характСристики слоТности Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² — врСмСнная ΠΈ Π΅ΠΌΠΊΠΎΡΡ‚ная.

ВрСмСнная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ подсчитываСтся Π² ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹Ρ… процСссором ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ…: количСство арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, сравнСний ΠΈ ΡΡΡ‹Π»ΠΎΠΊ.

Емкостная ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ опрСдСляСтся объСмом Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠΉ процСссором памяти: количСство ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, элСмСнтов массивов ΠΈ ΡΡ‚Ρ€ΠΎΠΊ.

Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° оцСниваСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ подсчСта Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ для выполнСния ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ Π² Ρ…ΠΎΠ΄Π΅ экспСримСнта.

1.2 ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅

1.2.1 Алгоритм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска Алгоритм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска — самый ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ. ΠŸΡƒΡΡ‚ΡŒ — строка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся поиск, Π° — искомоС слово, ΠΈ. Π’ΠΎΠ³Π΄Π° для поиска подстроки (слова) Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сравнСниС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ подстроки, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅ΠΉΡΡ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, Π΄Π»ΠΈΠ½ΠΎΠΉ. И ΠΏΡ€ΠΈ совпадСнии вывСсти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΉ подстроки.

Π‘Ρ‚ΠΎΠΈΡ‚ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ это самый Π½Π΅ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ.

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π²Π° Ρ†ΠΈΠΊΠ»Π°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Ρ†ΠΈΠΊΠ» зависит ΠΎΡ‚, Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΈ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Π»ΡƒΡ‡ΡˆΠ΅ΠΌ случаС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ сравнСний, Π½ΠΎ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС это сравнСний. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ этих сравнСний явно лишниС. НапримСр, ΠΏΡ€ΠΈ поискС подстроки aabbc, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ нСсоотвСтствиС Π² ΠΏΡΡ‚ΠΎΠΌ символС (совпало Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅), Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ сравнСниС со ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ символа исходной строки, Ρ‡Ρ‚ΠΎ явно Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ. На Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстро, Π½ΠΎ Π΅ΡΠ»ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ объСмом Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚, Ρ‚ΠΎ ΠΆΠ΄Π°Ρ‚ΡŒ придСтся довольно Π΄ΠΎΠ»Π³ΠΎ.

1.2.2 Алгоритм Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ° Алгоритм Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ° прСдставляСт собой ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска. Π•Π³ΠΎ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‡Π΅Ρ€Ρ‚ΠΎΠΉ являСтся ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ…Π΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ — ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ массива Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΡƒΡŽ Π±ΠΈΡ‚ΠΎΠ²ΡƒΡŽ строку фиксированной Π΄Π»ΠΈΠ½Ρ‹.

ΠŸΡƒΡΡ‚ΡŒ — строка, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ выполняСтся поиск, Π° — искомоС слово. И ΠΈ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΠΌ «ΠΎΠΊΠΎΡˆΠ΅Ρ‡ΠΊΠΎ» Π΄Π»ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ двигаСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎ ΡΡ‚Ρ€ΠΎΠΊΠ΅, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа. Π‘ΡƒΠ΄Π΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ слова Π΄Π»ΠΈΠ½Ρ‹. Π’ΠΎΠ³Π΄Π° Π·Π°Π΄Π°Ρ‡Π° сводится ΠΊ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ чисСл, Ρ‡Ρ‚ΠΎ, нСсомнСнно, быстрСС. И Π΅ΡΠ»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ слова ΠΈΠ· «ΠΎΠΊΠΎΡˆΠ΅Ρ‡ΠΊΠ°» Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ искомого ΠΎΠ±Ρ€Π°Π·Ρ†Π°, Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ эти Π΄Π²Π΅ строки Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌ посимвольноС сравнСниС.

Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ выполняСт Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ ΠΈΡΠΊΠΎΠΌΠΎΠΌΡƒ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρƒ (шагов) ΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ ΠΏΠΎ Π²ΡΠ΅ΠΌΡƒ тСксту (шагов), стало Π±Ρ‹Ρ‚ΡŒ, ΠΎΠ±Ρ‰Π΅Π΅ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΅ΡΡ‚ΡŒ. Π—Π΄Π΅ΡΡŒ Π½Π΅ ΡƒΡ‡ΠΈΡ‚ываСтся врСмя Π½Π° Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ сама идСя Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° построСна Π½Π° ΡƒΡΠ»ΠΎΠ²ΠΈΠΈ, Ρ‡Ρ‚ΠΎ Ρ…Π΅Ρˆ-функция Π±ΡƒΠ΄Π΅Ρ‚ Π»Π΅Π³ΠΊΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒΡΡ, ΠΈ Π²Ρ€Π΅ΠΌΡ этого вычислСния Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚Π°ΠΊΠΎΠΉ Π»Π΅Π³ΠΊΠΎ вычисляСмой Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ функция, которая считаСт сумму ΠΊΠΎΠ΄ΠΎΠ² символов слова Π² «ΠΎΠΊΠΎΡˆΠ΅Ρ‡ΠΊΠ΅». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΏΡ€ΠΈ сдвигС «ΠΎΠΊΠΎΡˆΠ΅Ρ‡ΠΊΠ°» Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт Π²ΠΏΡ€Π°Π²ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π½ΠΎΠ²ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ всю сумму. Достаточно просто Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа Π΄ΠΎ ΡΠ΄Π²ΠΈΠ³Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π½ΠΎΠ²ΠΎΠ³ΠΎ символа, попавшСго Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ подсчитанного значСния суммы со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ искомого слова ΠΏΡ€ΠΈ ΠΈΡ… ΠΏΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΠΎΠΌ нСсоотвСтствии Π½Π΅ ΡΠ»ΠΈΡˆΠΊΠΎΠΌ вСроятно, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚. Π¨ΠΈΡ€ΠΎΠΊΠΎΠ΅ распространСниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π Π°Π±ΠΈΠ½Π° Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ», ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΎΠ½ Ρ‡Π°ΡΡ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… поиска ΠΏΠ»Π°Π³ΠΈΠ°Ρ‚Π°.

1.3 Π­Ρ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ Алгоритм ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ° ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°ΠΌΠΈ с Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠΈΠΌΠΈ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚Π°ΠΌΠΈ, поэтому ΠΎΠ½ΠΈ годятся для использования ΠΏΡ€ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ класса Π·Π°Π΄Π°Ρ‡. Однако эти Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ эффСктивными ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Как Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅, ΠΎΠ½ΠΈ Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π½Π΅Π½ΡƒΠΆΠ½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ класс Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ появились Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ исслСдования Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска. Π˜ΡΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ способы Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΠΎ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ Π²ΠΎ Π²Ρ€Π΅ΠΌΡ сканирования. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π°Π½Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ вовсС.

Однако эти Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ‡ΡƒΡ‚ΡŒ большС Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚ ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ врСмя ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Но ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ сравнСния становится Π² Ρ€Π°Π·Ρ‹ мСньшС, ΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ зависимости этих Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΡ‚ Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ строки. [5]

1.3.1 Алгоритм ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° Π”Π°Π½Π½Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±Ρ‹Π» ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ Π² 1977 Π³ΠΎΠ΄Ρƒ ΡƒΡ‡Π΅Π½Ρ‹ΠΌΠΈ ΠšΠ½ΡƒΡ‚ΠΎΠΌ, ΠŸΡ€Π°Ρ‚Ρ‚ΠΎΠΌ ΠΈ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ‚ Π½ΠΈΡ… ΠœΠΎΡ€Ρ€ΠΈΡΠΎΠΌ. ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΈΠΌΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ выполняСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ искомой строки. На Π΅Ρ‘ ΠΎΡΠ½ΠΎΠ²Π΅ создаСтся прСфикс-функция, которая инкапсулируСт свСдСния ΠΎ Ρ‚ΠΎΠΌ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† совпадаСт сам с ΡΠΎΠ±ΠΎΠΉ послС сдвигов. Π’. Π΅. прСфиксной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π·Ρ†Π° называСтся функция, такая Ρ‡Ρ‚ΠΎ

. (1)

Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρ€Π°Π²Π½ΠΎ Π΄Π»ΠΈΠ½Π΅ наибольшСго прСфикса ΠΎΠ±Ρ€Π°Π·Ρ†Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся истинным суффиксом строки. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΡ€Π΅Ρ„ΠΈΠΊΡΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΎΠ±Ρ€Π°Π·Ρ†Π° ababababca, ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ Π½Π° Ρ€ΠΈΡ. 1.

Рис. 1. Π˜Π»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ для ΠΎΠ±Ρ€Π°Π·Ρ†Π° P = ababababca ΠΈ q = 8.

Бмысл прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, Ρ‚. Π΅. Ссли ΠΏΡ€ΠΈ поискС совпала подстрока abcasdqtabc (ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π»), Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΡƒΠΆΠ΅ с Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ³ΠΎ символа (ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ ΠΈ Ρ‚Π°ΠΊ совпадут). ΠœΠ΅Ρ‚ΠΎΠ΄ КМП ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ искомой строки, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: Π½Π° Π΅Π΅ ΠΎΡΠ½ΠΎΠ²Π΅ создаСтся прСфикс-функция. ΠŸΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ идСя: Ссли прСфикс (ΠΎΠ½ ΠΆΠ΅ ΡΡƒΡ„фикс) строки Π΄Π»ΠΈΠ½Π½ΠΎΠΉ большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа, Ρ‚ΠΎ ΠΎΠ½ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈ ΠΏΡ€Π΅Ρ„икс подстроки Π΄Π»ΠΈΠ½Π½ΠΎΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, провСряСтся прСфикс ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ подстроки, Ссли ΠΆΠ΅ Ρ‚ΠΎΡ‚ Π½Π΅ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, Ρ‚ΠΎ ΠΏΡ€Π΅Ρ„икс Π΅Π΅ ΠΏΡ€Π΅Ρ„икса, ΠΈ Ρ‚. Π΄. ДСйствуя Ρ‚Π°ΠΊ, находится наибольший искомый прСфикс [4, 5, 7].

ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π΄Π°Π½Π½ΠΎΠΉ прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ. Π’.ΠΊ. присвоСниС прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ происходит Ρ€Π°Π·, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π°Π±ΠΎΡ‚Π° этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ самого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Ρ‚Π°ΠΊΠΆΠ΅ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎ ΠΈ Ρ€Π°Π²Π½ΠΎ .

1.3.2 Алгоритм Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° Алгоритм Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π°, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ двумя ΡƒΡ‡Π΅Π½Ρ‹ΠΌΠΈ — Π‘ΠΎΠΉΠ΅Ρ€ΠΎΠΌ ΠΈ ΠœΡƒΡ€ΠΎΠΌ Π² 1977 Π³ΠΎΠ΄Ρƒ, считаСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ быстрым срСди Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… для поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ этого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€Π΅Π΄ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ искомой строки, ΠΎΠ±Ρ€Π°Π·Π΅Ρ† сравниваСтся с ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹ΠΌ тСкстом Π½Π΅ Π²ΠΎ Π²ΡΠ΅Ρ… позициях — Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ Π΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°.

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° состоит ΠΈΠ· Π΄Π²ΡƒΡ… этапов. На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС строится Ρ‚Π°Π±Π»ΠΈΡ†Π° смСщСний для искомого ΠΎΠ±Ρ€Π°Π·Ρ†Π°. Π”Π°Π»Π΅Π΅ совмСщаСтся Π½Π°Ρ‡Π°Π»ΠΎ строки ΠΈ ΠΎΠ±Ρ€Π°Π·Ρ†Π° ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ символа ΠΎΠ±Ρ€Π°Π·Ρ†Π°. Если послСдний символ ΠΎΠ±Ρ€Π°Π·Ρ†Π° ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΅ΠΌΡƒ символ строки Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† сдвигаСтся ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ строки Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ смСщСний, ΠΈ ΡΠ½ΠΎΠ²Π° проводится сравнСниС, начиная с ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ символа ΠΎΠ±Ρ€Π°Π·Ρ†Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, ΠΏΡ€ΠΈ совпадСнии символов, проводится сравнСниС прСдпослСднСго символа ΠΎΠ±Ρ€Π°Π·Ρ†Π° ΠΈ Ρ‚. Π΄. Если всС символы ΠΎΠ±Ρ€Π°Π·Ρ†Π° совпали с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ символами строки, Ρ‚ΠΎ Π½ΡƒΠΆΠ½Π°Ρ подстрока Π½Π°ΠΉΠ΄Π΅Π½Π°. Если ΠΆΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ (Π½Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ) символ ΠΎΠ±Ρ€Π°Π·Ρ†Π° Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ символом строки, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† сдвигаСтся Π½Π° ΠΎΠ΄ΠΈΠ½ символ Π²ΠΏΡ€Π°Π²ΠΎ ΠΈ ΡΠ½ΠΎΠ²Π° начинаСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ символа.

Π’Π°Π±Π»ΠΈΡ†Π° смСщСний строится Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… основаниях: сдвиг искомого ΠΎΠ±Ρ€Π°Π·Ρ†Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Ρ†Π° Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅. Если Π΄Π°Π½Π½Ρ‹ΠΉ символ строки встрСчаСтся Π² ΠΎΠ±Ρ€Π°Π·Ρ†Π΅, Ρ‚ΠΎ ΠΎΠ½ ΡΠ΄Π²ΠΈΠ³Π°Π΅Ρ‚ся Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ символ строки совпал с ΡΠ°ΠΌΡ‹ΠΌ ΠΏΡ€Π°Π²Ρ‹ΠΌ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ этого символа Π² ΠΎΠ±Ρ€Π°Π·Ρ†Π΅. Если ΠΆΠ΅ искомая строка Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ этого символа, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† пСрСмСщаСтся Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ, Ρ€Π°Π²Π½ΡƒΡŽ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π΅, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ ΠΎΠ±Ρ€Π°Π·Ρ†Π° накладываСтся Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ строки. Π’Π΅Π»ΠΈΡ‡ΠΈΠ½Π° смСщСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа искомой строки зависит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚ ΠΏΠΎΡ€ΡΠ΄ΠΊΠ° символов Π² Π½Π΅ΠΉ самой, поэтому Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ смСщСний ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΈ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ массива, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ символу ΠΈΠ· ΠΈΡΠΊΠΎΠΌΠΎΠΉ строки соотвСтствуСт смСщСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ послСднСго символа [6, 8].

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. ΠŸΡƒΡΡ‚ΡŒ сущСствуСт Π°Π»Ρ„Π°Π²ΠΈΡ‚ ΠΈΠ· ΠΏΡΡ‚ΠΈ символов: q, w, e, r, t ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π·Ρ†Π° «qwwqr» Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ «qwteeqewqrwqwwqr». Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ схСмы ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ всС этапы выполнСния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°. Π’Π°Π±Π»ΠΈΡ†Π° смСщСний Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ.

q

w

e

r

t

Начало поиска.

q

w

t

e

e

q

e

w

q

r

w

q

w

w

q

r

q

w

w

q

r

Π’Π°ΠΊ ΠΊΠ°ΠΊ послСдний символ искомой строки Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ символом исходной строки, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† смСщаСтся Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ смСщСний, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ символу «e» — Π½Π° 5 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ.

q

w

t

e

e

q

e

w

q

r

w

q

w

w

q

r

q

w

w

q

r

ПослСдниС Ρ‚Ρ€ΠΈ символа искомой строки совпали ΠΏΡ€ΠΈ Π½Π°Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ, Π° Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚Ρ‹ΠΉ символ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π», Π·Π½Π°Ρ‡ΠΈΡ‚, происходит сдвиг ΠΎΠ±Ρ€Π°Π·Ρ†Π° Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° ΠΎΠ΄Π½Ρƒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

q

w

t

e

e

q

e

w

q

r

w

q

w

w

q

r

q

w

w

q

r

Π‘Π½ΠΎΠ²Π° Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ послСдний символ искомой строки, выполняСтся сдвиг Π½Π° 2 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π²ΠΏΡ€Π°Π²ΠΎ.

q

w

t

e

e

q

e

w

q

r

w

q

w

w

q

r

q

w

w

q

r

Π•Ρ‰Ρ‘ Ρ€Π°Π· выполняСтся сдвиг Π²ΠΏΡ€Π°Π²ΠΎ Π½Π° 2 ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ.

q

w

t

e

e

q

e

w

q

r

w

q

w

w

q

r

q

w

w

q

r

Π’ ΡΠΎΠΎΡ‚вСтствии со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ смСщСния для символа q Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅Ρ‚ся сдвиг Π½Π° 1 ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ.

q

w

t

e

e

q

e

w

q

r

w

q

w

w

q

r

q

w

w

q

r

Алгоритм считаСтся самым быстрым Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ поиска, хотя Π΅Π³ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² Ρ…ΡƒΠ΄ΡˆΠ΅ΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½Ρ‹ΠΌ, Π½ΠΎ Π²Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ этого Ρ…ΡƒΠ΄ΡˆΠ΅Π³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΊΡ€Π°ΠΉΠ½Π΅ ΠΌΠ°Π»Π°. А Π² ΡΡ€Π΅Π΄Π½Π΅ΠΌ ΠΆΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈΠ½Π΅ΠΉΠ½ΡƒΡŽ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ΠΎΡ‚ ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΉ строки.

подстрока строка Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

2. РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π’ ΠΊΡƒΡ€ΡΠΎΠ²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅. Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска прСдставлСн Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ А, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ° Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’ ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π“.

ВСстированиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π½Π° ΠŸΠš:

ΠŸΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ Intel® Atom™ CPU N455 с Ρ‚Π°ΠΊΡ‚ΠΎΠ²ΠΎΠΉ частотой 1.66 Π“Π“Ρ†

1024 Мб ΠžΠ—Π£ ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Microsoft Visual Studio 2008.

ВсС Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π±Ρ‹Π»ΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² ΠΎΠ΄Π½ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для запуска любого ΠΈΠ· ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

2.1 ОписаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π° ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ WindowsFormApplication Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ программирования C# Π² ΡΡ€Π΅Π΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Microsoft Visual Studio 2008.

ΠŸΡƒΡΡ‚ΡŒ Π΄Π°Π½ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ тСкстовый Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡ‚ΠΈ всС вхоТдСния ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°. Π”Π°Π½Π½ΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ поиск подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ прСдлагаСтся Π½Π° Π²Ρ‹Π±ΠΎΡ€ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска: Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π°.

ПослС выполнСния поиска Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ выводится количСство Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора, Π·Π°Ρ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° ΠΏΠΎΠΈΡΠΊ. И ΠΎΠΊΠ½ΠΎ с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ поиска, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π»ΠΈΠ±ΠΎ сообщСниС ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅, Π»ΠΈΠ±ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π° всСх Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ искомого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ тСкстС. Листинг ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° прилоТСния прСдставлСн Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π”.

2.2 ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ПослС запуска прилоТСния открываСтся основноС ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (рис. 2.1), Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ нСсколько элСмСнтов:

ΠΊΠ½ΠΎΠΏΠΊΠ° «Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» поиска»;

ΠΊΠ½ΠΎΠΏΠΊΠ° «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск»;

Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²;

ΠΏΠΎΠ»Π΅, для Π²Π²ΠΎΠ΄Π° искомого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°.

Но Π²ΡΠ΅ эти элСмСнты, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» поиска», Π² Ρ†Π΅Π»ΡΡ… Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ использования, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π΄ΠΎ Π²Ρ‹Π±ΠΎΡ€Π° тСкстового Ρ„Π°ΠΉΠ»Π°.

Рис. 2.1. ОсновноС ΠΎΠΊΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠŸΡ€ΠΈ ΠΊΠ»ΠΈΠΊΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» поиска», открываСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ (рис. 2.2) с Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ тСкстовых Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ «.txt». Π€ΠΈΠ»ΡŒΡ‚Ρ€ Π½ΡƒΠΆΠ΅Π½ для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π·Π»ΠΎΠ½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ», Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰Π΅ΠΉΡΡ тСкстовым. Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ Ρ„Π°ΠΉΠ» «Π’ыступлСниС ΠŸΡƒΡ‚ΠΈΠ½Π°. txt».

Рис. 2.2. Π”ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти искомый Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΠΎΠ»Π΅ ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска. Π’Π²Π΅Π΄Π΅ΠΌ Π² ΠΎΠΊΠ½ΠΎ тСкст: «Π£Π²Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ России!» ΠΈ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° (рис. 2.3).

Рис. 2.3. Π’Ρ‹Π±ΠΎΡ€ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ПослС наТатия Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск» ΠΏΠΎΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎ ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π²Π° ΠΎΠΊΠ½Π° «ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора» (рис. 2.4) ΠΈ «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска» (рис. 2.5).

Рис. 2.4. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора Рис. 2.5. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска Π’Π°ΠΊΠΆΠ΅ открываСтся Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π» ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ поиск (рис. 2.6).

Рис. 2.6. ВСкстовый Ρ„Π°ΠΉΠ» «Π’ыступлСниС ΠŸΡƒΡ‚ΠΈΠ½Π°. txt»

Если искомый Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ отсутствуСт, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ сообщСниС ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ поискС (рис. 2.7).

Рис. 2.7. НСудачный поиск

3. ВСстированиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² Π’ ΠΊΡƒΡ€ΡΠΎΠ²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ рассмотрСно Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅. Π‘Ρ‹Π»Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π° ΠΎΡ†Π΅Π½ΠΊΠ° ΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ Π΅ΠΌΠΊΠΎΡΡ‚Π½ΠΎΠΉ слоТности. Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ· состоял Π² ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΈ количСства Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ выполнялся поиск Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ.

Π‘Ρ‹Π»ΠΎ составлСно случайным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ 10 Ρ€Π°Π· Ρ‚Ρ€ΠΈ тСкстовых Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΡΡ‚Ρ€ΠΎΡ‡Π½Ρ‹Ρ… Π±ΡƒΠΊΠ² латинского Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°, Π΄Π»ΠΈΠ½ΠΎΠΉ Π² 1000, 10 000 ΠΈ 100 000 символов. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· ΡΡ‚ΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ² выполнялся поиск подстроки, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ, состоящСм ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… шагов:

ВычислСниС случайной Π΄Π»ΠΈΠ½Ρ‹ подстроки Для тСкстового Ρ„Π°ΠΉΠ»Π°, Π΄Π»ΠΈΠ½ΠΎΠΉ 1000 символов Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ»Π°ΡΡŒ случайная Π΄Π»ΠΈΠ½Π° искомой подстроки ΠΎΡ‚ 10 Π΄ΠΎ 50 символов; для тСкстового Ρ„Π°ΠΉΠ»Π°, Π΄Π»ΠΈΠ½ΠΎΠΉ 10 000 символов случайная Π΄Π»ΠΈΠ½Π° подстроки ΠΎΡ‚ 100 Π΄ΠΎ 500 символов; ΠΈ Π΄Π»Ρ Ρ„Π°ΠΉΠ»Π°, Π΄Π»ΠΈΠ½ΠΎΠΉ 100 000 символов случайная Π΄Π»ΠΈΠ½Π° Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΠ»Π°ΡΡŒ ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ 1000 Π΄ΠΎ 5000 символов;

ВычислСниС случайной ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π½Π°Ρ‡Π°Π»Π° искомой подстроки Π² Ρ„Π°ΠΉΠ»Π΅ Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ тСкстового Ρ„Π°ΠΉΠ»Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ ΡΠ»ΡƒΡ‡Π°ΠΉΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ подстроки ΠΈΠ· Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ 0 Π΄ΠΎ S. Length-X.Length, Π³Π΄Π΅ S. Length — Π΄Π»ΠΈΠ½Π° тСкстового Ρ„Π°ΠΉΠ»Π° ΠΈ X. Length — Π΄Π»ΠΈΠ½Π° искомой подстроки.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ выполнял поиск ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ подстроки ΠΏΠΎ 10 Ρ€Π°Π·. И Π² ΠΈΡ‚ΠΎΠ³Π΅ выбирался Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ срСди всСх ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ.

Π’Π°ΠΊ ΠΊΠ°ΠΊ всС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ Π² Ρ€Π°Π²Π½Ρ‹Ρ… условиях, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ провСсти ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² поиска, ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… условиях ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ.

БрСднСстатистичСскиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ экспСримСнтов ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 1 ΠΈ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° Ρ€ΠΈΡ. 3. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎΠ±ΠΎ всСх экспСримСнтах прСдставлСн Π² Π’Π°Π±Π»ΠΈΡ†Π΅ 2, Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π•.

Π’Π°Π±Π»ΠΈΡ†Π° 1. БрСднСстатистичСскиС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² поиска

Алгоритм поиска

ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°, Ρ‚Π°ΠΊΡ‚Ρ‹ процСссора

1000 символов

10 тыс. символов

100 тыс. символов

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ

Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°

ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π°

Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π°

Рис. 3. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Из Π’Π°Π±Π»ΠΈΡ†Ρ‹ 2 Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° справился с ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ быстрСС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ…. Однако Π΅Π³ΠΎ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ растСт с ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π΄Π»ΠΈΠ½Ρ‹ исходной строки ΠΈ ΠΈΡΠΊΠΎΠΌΠΎΠΉ подстроки. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ с 1000 символами ΠΎΠ½ ΠΏΠΎΠΊΠ°Π·Π°Π» Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ².

Алгоритм ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ» Π·Π°Π΄Π°Ρ‡Ρƒ быстрСС Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ° ΠΈ ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска, ΠΎΠ΄Π½Π°ΠΊΠΎ сущСствСнно уступил Π‘ΠΎΠΉΠ΅Ρ€Ρƒ-ΠœΡƒΡ€Ρƒ. Но ΠΊ ΠΏΠ»ΡŽΡΡƒ этого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΌΠΎΠΆΠ½ΠΎ отнСсти ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ нСбольшой разброс Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹, нСзависимо ΠΎΡ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π§Ρ‚ΠΎ нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ΅ Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π°.

Алгоритм Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°, практичСски Π½Π΅ ΠΎΡ‚личаСтся ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ показатСлям ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска, Π½ΠΎ Π΅Π³ΠΎ простота ΠΈ ΠΌΠ°Π»Ρ‹Π΅ Ρ‚Ρ€ΡƒΠ΄ΠΎΠ·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ Π½Π° Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ, Π΄Π΅Π»Π°ΡŽΡ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ для использования Π² Π½Π΅ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. Π’Π°ΠΊΠΆΠ΅ стоит ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±ΠΎΠ»Π΅Π΅ эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Π°Π»Ρ„Π°Π²ΠΈΡ‚Π°Ρ…, Π³Π΄Π΅ случайныС совпадСния Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ практичСски ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚, Ρ‡Π΅Π³ΠΎ нСльзя ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ экспСримСнта.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ ΠΊΡƒΡ€ΡΠΎΠ²ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ Π±Ρ‹Π»ΠΈ рассмотрСны основныС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ ΠΈ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ ΠΈΡ… ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π°Π½Π°Π»ΠΈΠ·.

По ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° являСтся Π»ΡƒΡ‡ΡˆΠΈΠΌ ΠΏΠΎ Π²ΡΠ΅ΠΌ показатСлям. Однако нСльзя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ· Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² являСтся самым ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΡΡ‚ΠΈΡ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ² эффСктивно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… классах Π·Π°Π΄Π°Ρ‡. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ поиска для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС опрСдСлСния Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ.

Бписок ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… источников

1. Ахо А. Алгоритмы поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹. — Πœ.: «Π’ΠΈΠ»ΡŒΡΠΌΡ», 2000. — Π‘. 384.

2. Π‘Ρ€Π°ΠΉΠ°Π½ К. ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° программирования. — Π‘Пб: «ΠΠ΅Π²ΡΠΊΠΈΠΉ Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚», 2001. — Π‘. 381.

3. Π’ΠΈΡ€Ρ‚ Н. Алгоритмы ΠΈ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…. — Πœ.: «ΠœΠΈΡ€», 1989. — Π‘. 360.

4. ΠšΠ½ΡƒΡ‚ Π”. Алгоритм ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° // Π˜ΡΠΊΡƒΡΡΡ‚Π²ΠΎ программирования Π½Π° Π­Π’Πœ. — Πœ.: «ΠœΠΈΡ€», 1978. — Ρ‚.3. — Π‘. 356.

5. ΠšΠΎΡ€ΠΌΠ΅Π½ Π’., ЛСйзСрсон И., РивСст Π›., Π¨Ρ‚Π°ΠΉΠ½. Алгоритмы поиска подстроки // Алгоритмы: построСниС ΠΈ Π°Π½Π°Π»ΠΈΠ· — 2-e ΠΈΠ·Π΄Π°Π½ΠΈΠ΅. — Πœ.: «Π’ΠΈΠ»ΡŒΡΠΌΡ», 2005. — Π‘. 1019 — 1058.

6. Алгоритмы поиска подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ // «MyKod» [Π­Π». рСсурс]. URL: http://www.mykod.ru/

7. Алгоритм ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° // «Maximal» [Π­Π». рСсурс]. URL: http://e-maxx.ru/algo/prefix_function

8. Алгоритм Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° // «Π˜ΡΡ…ΠΎΠ΄Π½ΠΈΠΊΠΈ» [Π­Π». рСсурс]. URL: http://easylab.net.ua/poisk/algoritm-boyera-mura

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, А Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска

//Ѐункция ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска

public static string Posl (string x, string s)

{

//ОбъявлСниС строки с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ

string nom = «» ;

//Если искомая строка большС исходной — Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ пустого поиска

if (x.Length > s. Length) return nom;

//Π¦ΠΈΠΊΠ» ΠΏΠΎ ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΉ строкС

for (int i = 0; i < s. Length — x. Length+1; i++)

{

bool flag = true; //Π€Π»Π°Π³

int j = 0;

while ((flag == true) && (j < x. Length))

{

if (x[j] ≠ s[i + j]) flag = false;

j++;

}

//Если искомая строка совпала с Ρ‡Π°ΡΡ‚ΡŒΡŽ исходной

if (flag == true)

//Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ Π² ΡΡ‚Ρ€ΠΎΠΊΡƒ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ²

nom = nom + Convert. ToString (i) + «, «;

}

//Если Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

if (nom ≠ «»)

{

//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ послСднСй запятой ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°

nom = nom. Substring (0, nom. Length — 2);

}

//Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° поиска

return nom;

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π‘ РСализация Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°

//Π₯Сш-функция для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°

public static int Hash (string s)

{

int rez = 0;

for (int i = 0; i < s. Length; i++)

{

rez += (int)(s[i]);//Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠ² Π±ΡƒΠΊΠ²

}

return rez;

}

//Ѐункция поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π Π°Π±ΠΈΠ½Π°

public static string Rabina (string x, string s)

{

string nom = «» ;

//Если искомая строка большС исходной — Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ пустого поиска

if (x.Length > s. Length) return nom;

//ВычислСниС Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ искомой строки

int xhash = Hash (x);

//ВычислСниС Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ слова Π΄Π»ΠΈΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π·Ρ†Π° Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ S

int shash = Hash (s.Substring (0,x.Length));

for (int i = 0; i < s. Length — x. Length; i++)

{

//Если значСния Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚

if (xhash == shash)

{

bool flag = true; //Π€Π»Π°Π³

int j = 0;

while ((flag == true) && (j < x. Length))

{

if (x[j] ≠ s[i + j]) flag = false;

j++;

}

//Если искомая строка совпала с Ρ‡Π°ΡΡ‚ΡŒΡŽ исходной

if (flag == true)

nom = nom + Convert. ToString (i) + «, «;

}

//Π˜Π½Π°Ρ‡Π΅ вычислСниС Π½ΠΎΠ²ΠΎΠ³ΠΎ значСния послС сдвига

else shash = shash — (int) (s[i]) +

(int)(s[i + x. Length]);

}

//Если Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ

if (nom ≠ «»)

{

nom = nom. Substring (0, nom. Length — 2);

}

return nom;

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π’ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π°

//ΠŸΡ€Π΅Ρ„ΠΈΠΊΡ-функция для КМП

public static int[] PrefFunc (string x)

{

//Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ массива-Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π΄Π»ΠΈΠ½ΠΎΠΉ X

int[] res = new int[x.Length];

int i = 0;

int j = -1;

res[0] = -1;

//ВычислСниС прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

while (i < x. Length — 1)

{

while ((j >= 0) && (x[j] ≠ x[i]))

j = res[j];

i++;

j++;

if (x[i] == x[j])

res[i] = res[j];

else

res[i] = j;

}

return res;//Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

}

//Ѐункция поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ КМП

public static string KMP (string x, string s)

{

//ОбъявлСниС строки с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ

string nom = «» ;

if (x.Length > s. Length) return nom;

//Π’Ρ‹Π·ΠΎΠ² прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

int[] d = PrefFunc (x);

int i=0, j;

while (i < s. Length)

{

for (i = i, j = 0; (i < s. Length) &&

(j < x. Length); i++, j++)

while ((j >= 0) && (x[j] ≠ s[i]))

j = d[j];

if (j == x. Length)

nom = nom + Convert. ToString (i — j) + «, «;

}

if (nom ≠ «»)

{

//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ послСднСй запятой ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°

nom = nom. Substring (0, nom. Length — 2);

}

return nom;

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π“ Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π°

//Π’Π°Π±Π»ΠΈΡ†Π° символов искомой строки

public static char[] SymbolOfX;

//Π’Π°Π±Π»ΠΈΡ†Π° смСщСний для символов

public static int[] ValueShift;

//ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° — Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ смСщСний

public static void ShiftBM (string x)

{

int j;//Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ

int k = 0;//Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊ

bool fl;//Π€Π»Π°Π³

SymbolOfX = new char[x.Length]; //Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

ValueShift = new int[x.Length]; //Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ

//Π¦ΠΈΠΊΠ» ΠΏΠΎ ΠΈΡΠΊΠΎΠΌΠΎΠΉ строкС Π±Π΅Π· послСднСго символа

for (int i = x. Length-2; i >= 0; i—)

{

fl = false;//Π€Π»Π°Π³

j = 0;//ΠžΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅

while ((j

{

if (SymbolOfX[j] == x[i]) fl = true;

j++;

}

if (fl == false)

{

SymbolOfX[k] = x[i];

ValueShift[k] = x. Length — i — 1;

k++;

}

}

}

//Ѐункция поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π‘Πœ

public static string BM (string x, string s)

{

bool has, have;//Π€Π»Π°Π³ΠΈ

int l, j, i;//Π‘Ρ‡Π΅Ρ‚Ρ‡ΠΈΠΊΠΈ

//Π’Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ±Ρ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ смСщСний

Function.ShiftBM (x);

//ОбъявлСниС строки с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ

string nom = «» ;

if (x.Length > s. Length) return nom;

//Основной Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΉ строкС

for (i = 0; i < s. Length-x.Length+1; i++)

{

j = x. Length — 1;

have = true;

//ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° с ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ символа

while ((j >= 0)&&(have == true))

{

//Если Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ‚ символ искомой ΠΈ ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΉ

if (s[i + j] ≠ x[j])

{

have = false;

//Если это послСдний символ

if (j == x. Length-1)

{

l = 0;

has = false; //Π€Π»Π°Π³

//Поиск символа Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ смСщСний

while ((l < x. Length)&&(has == false))

{

//Если символ Π΅ΡΡ‚ΡŒ

if (s[i + j] == SymbolOfX[l])

{

has = true; //ИзмСнСниС Ρ„Π»Π°Π³Π°

//Π‘Π΄Π²ΠΈΠ³ Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ

i = i + ValueShift[l] - 1;

}

l++;

}

//Если Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ символ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ смСщСний

if (has == false)

//Π‘Π΄Π²ΠΈΠ³ Π½Π° Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ искомой строки

i = i + x. Length — 1;

}

}

j—;

}

if (have == true)

nom = nom + Convert. ToString (i) + «, «;

}

//Если строка Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π½Π΅ ΠΏΡƒΡΡ‚ая

if (nom ≠ «»)

{

//Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ послСднСй запятой ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»Π°

nom = nom. Substring (0, nom. Length — 2);

}

return nom;//Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° поиска

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π” Π Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Код Ρ„ΠΎΡ€ΠΌΡ‹:

using System;

using System.Collections.Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System.Windows.Forms;

using System. IO;

using Fuction;

using System. Diagnostics;

using System. Threading;

namespace KurgachevND_Kursovaya_1kurs

{

public partial class Form1: Form

{

public static string str,//ОбъявлСниС исходной строки

nom;//ОбъявлСниС строки с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ поиска

public Form1()

{

InitializeComponent ();

//ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ: «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск»

button3.Enabled = false;

//ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

radioButton1.Enabled = false;

radioButton2.Enabled = false;

radioButton3.Enabled = false;

radioButton4.Enabled = false;

label2.Text = «» ;

}

//Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ — ΠΊΠ»ΠΈΠΊ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π’Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» поиска»

private void button1_Click (object sender, EventArgs e)

{

//ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° исходной строки

str = «» ;

//Π€ΠΈΠ»ΡŒΡ‚Ρ€ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²

openFileDialog1.Filter = «Text files (*.TXT)|*.txt» ;

//ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° ΠΈΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°

openFileDialog1.FileName = «» ;

//Если Ρ„Π°ΠΉΠ» Π²Ρ‹Π±Ρ€Π°Π½

if (openFileDialog1.ShowDialog () == DialogResult. OK)

{

FileStream TextFile = new FileStream (openFileDialog1.FileName, FileMode. Open);

//Π—Π°ΠΏΠΈΡΡŒ ΠΈΠΌΠ΅Π½ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ Ρ„ΠΎΡ€ΠΌΡ‹

label2.Text = openFileDialog1.SafeFileName.Substring (0, openFileDialog1.SafeFileName.Length — 4);

//Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

TextFile.Close ();

using (StreamReader sr = new StreamReader (openFileDialog1.FileName, Encoding. Default))

{

//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ тСкста Π² ΡΡ‚Ρ€ΠΎΠΊΡƒ

str = sr. ReadToEnd ();

}

//Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ²

radioButton1.Enabled = true;

radioButton2.Enabled = true;

radioButton3.Enabled = true;

radioButton4.Enabled = true;

}

}

//Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ — ΠΊΠ»ΠΈΠΊ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск»

private void button3_Click (object sender, EventArgs e)

{

//Если ΠΎΠΊΠ½ΠΎ искомого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° пустоС — сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅

if (textBox1.Text == «»)

MessageBox.Show («ΠžΡ‚сутствуСт искомый Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚» ," Ошибка");

//Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ поиска искомого Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π°

else

{

//Если Π²Ρ‹Π±Ρ€Π°Π½ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ поиск

if (radioButton1.Checked == true)

{

Stopwatch stopWatch = new Stopwatch ();

//Π‘Ρ‚Π°Ρ€Ρ‚ счСтчика Ρ‚Π°ΠΊΡ‚ΠΎΠ²

stopWatch.Start ();

//Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска

nom = Function. Posl (textBox1.Text, str);

//ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° счСтчика Ρ‚Π°ΠΊΡ‚ΠΎΠ²

stopWatch.Stop ();

TimeSpan ts = stopWatch. Elapsed;

string elapsedTime = Convert. ToString (ts.Ticks);

//Π’Ρ‹Π²ΠΎΠ΄ сообщСния с ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎΠΌ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора

MessageBox.Show (elapsedTime, «ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора»);

//Если строка Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π½Π΅ ΠΏΡƒΡΡ‚ая

if (nom ≠ «»)

{

//Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° поиска

MessageBox.Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ встрСчаСтся с «+ nom + «-Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»);

//ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполнялся поиск System.Diagnostics.Process.Start (openFileDialog1.FileName);

}

//Π’Ρ‹Π²ΠΎΠ΄ сообщСния ΠΎ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌ поискС

else MessageBox. Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ Π²ΡΡ‚рСчаСтся Π² Ρ‚СкстС», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»);

}

//Если Π²Ρ‹Π±Ρ€Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°

if (radioButton2.Checked == true)

{

Stopwatch stopWatch = new Stopwatch ();

stopWatch.Start ();

//Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π Π°Π±ΠΈΠ½Π°

nom = Function. Rabina (textBox1.Text, str);

stopWatch.Stop ();

TimeSpan ts = stopWatch. Elapsed;

string elapsedTime = Convert. ToString (ts.Ticks);

MessageBox.Show (elapsedTime, «ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора»);

if (nom ≠ «»)

{

MessageBox.Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ встрСчаСтся с «+ nom + «-Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»); //ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполнялся поиск System.Diagnostics.Process.Start (openFileDialog1.FileName);

}

else MessageBox. Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ Π²ΡΡ‚рСчаСтся Π² Ρ‚СкстС», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»);

}

//Если Π²Ρ‹Π±Ρ€Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ КМП

if (radioButton3.Checked == true)

{

Stopwatch stopWatch = new Stopwatch ();

stopWatch.Start ();

//Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ КМП

nom = Function. KMP (textBox1.Text, str);

stopWatch.Stop ();

TimeSpan ts = stopWatch. Elapsed;

string elapsedTime = Convert. ToString (ts.Ticks);

MessageBox.Show (elapsedTime, «ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора»);

if (nom ≠ «»)

{

MessageBox.Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ встрСчаСтся с «+ nom + «-Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»); //ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ выполнялся поиск System.Diagnostics.Process.Start (openFileDialog1.FileName);

}

else MessageBox. Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ Π²ΡΡ‚рСчаСтся Π² Ρ‚СкстС», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»);

}

//Если Π²Ρ‹Π±Ρ€Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π‘Πœ

if (radioButton4.Checked == true)

{

Stopwatch stopWatch = new Stopwatch ();

stopWatch.Start ();

//Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π‘Πœ

nom = Convert. ToString (Function.BM (textBox1.Text, str));

stopWatch.Stop ();

TimeSpan ts = stopWatch. Elapsed;

string elapsedTime = Convert. ToString (ts.Ticks);

MessageBox.Show (elapsedTime," ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΡ‚ΠΎΠ² процСссора");

if (nom ≠ «»)

{

MessageBox.Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ встрСчаСтся с «+ nom + «-Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€Π°», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»); System.Diagnostics.Process.Start (openFileDialog1.FileName);

}

else MessageBox. Show («Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½Π΅ Π²ΡΡ‚рСчаСтся Π² Ρ‚СкстС», «Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска»);

}

}

}

//Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск», послС Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

private void radioButton1_CheckedChanged (object sender, EventArgs e)

{

button3.Enabled = true;

}

//Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск», послС Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

private void radioButton3_CheckedChanged (object sender, EventArgs e)

{

button3.Enabled = true;

}

//Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск», послС Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

private void radioButton2_CheckedChanged (object sender, EventArgs e)

{

button3.Enabled = true;

}

//Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ поиск», послС Π²Ρ‹Π±ΠΎΡ€Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

private void radioButton4_CheckedChanged (object sender, EventArgs e)

{

button3.Enabled = true;

}

}

}

Код Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ классов:

using System;

using System.Collections.Generic;

using System. Linq;

using System. Text;

using System. Collections;

namespace Fuction

{

public static class Function

{

//Ѐункция ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ поиска

public static string Posl (string x, string s)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ А

}

//ВычислСниС Ρ…Π΅Ρˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π Π°Π±ΠΈΠ½Π°

public static int Hash (string s)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘

}

//Ѐункция поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π Π°Π±ΠΈΠ½Π°

public static string Rabina (string x, string s)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π‘

}

//БоставлСниС прСфикс-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для КМП

public static int[] PrefFunc (string x)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’

}

//Ѐункция поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ КМП

public static string KMP (string x, string s)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’

}

//Π’Π°Π±Π»ΠΈΡ†Π° смСщСний для Π‘Πœ

public static void ShiftBM (string X)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π“

}

//Ѐункция поиска Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ Π‘Πœ

public static string BM (string X, string S)

{

прСдставлСна Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π“

}

}

}

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π• Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ экспСримСнтов Π’Π°Π±Π»ΠΈΡ†Π° 2. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ экспСримСнтов.

Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹

β„– ΠΎΠΏΡ‹Ρ‚Π°

Алгоритмы поиска

ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ

Π Π°Π±ΠΈΠ½Π°-ΠšΠ°Ρ€ΠΏΠ°

КМП

Π‘Πœ

Π’ Π’Π°Π±Π»ΠΈΡ†Π΅ 2 Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠšΠ½ΡƒΡ‚Π°-ΠœΠΎΡ€Ρ€ΠΈΡΠ°-ΠŸΡ€Π°Ρ‚Ρ‚Π° ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ ΠΊΠ°ΠΊ КМП, ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π‘ΠΎΠΉΠ΅Ρ€Π°-ΠœΡƒΡ€Π° ΠΊΠ°ΠΊ Π‘Πœ.

ΠšΡƒΡ€ΡΠΎΠ²Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° «ΠŸΠΎΠΈΡΠΊ подстроки Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅» Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° мною ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΈ Π½Π° Π²ΡΠ΅ источники, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ΡΡ Π² Ρ€Π°Π±ΠΎΡ‚Π΅, Π΄Π°Π½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ссылки.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ