Кіріспе

Жолды іздеу алгоритмі

Компьютер ғылымында Рабин–Карп алгоритмі немесе Карп–Рабин алгоритмі – мәтіндегі үлгілік жолдың нақты сәйкестігін табу үшін хэш қолданатын жол іздеу алгоритмі. Бұл алгоритм мәтіннің үлгіге сәйкес келмейтін орналасуын жылдам сүзу үшін жылмалы хэшті пайдаланады, содан кейін қалған орналасуларда сәйкестікті тексереді. Осы идеяның жалпыламасы бір үлгіге бірнеше сәйкестікті табуға немесе бірнеше үлгіге сәйкес келетін сәйкестіктерді табуға қолданылуы мүмкін. Бір үлгіге бір ғана сәйкестікті табу үшін алгоритмнің күтілетін уақыты үлгі мен мәтіннің біріктірілген ұзындығына пропорционалды, бірақ ең нашар жағдайдағы уақыт күрделілігі екі ұзындықтың көбейтіндісін құрайды. Көптеген сәйкестіктерді табу үшін күтілетін уақыт кіріс ұзындықтарына пропорционалды, сонымен қатар барлық сәйкестіктердің біріктірілген ұзындығы пропорционалдықтан асатын болуы мүмкін. Алайда, Aho–Corasick алгоритмі нашар жағдайда бірнеше үлгілердің барлық сәйкестіктерін кіріс ұзындығы мен сәйкестіктер санына пропорционалды уақыт пен кеңістікте таба алады (сәйкестіктердің жалпы ұзындығының орнына). Алгоритмнің практикалық қолданылуы – плагиатты анықтау. Алгоритм бастапқы материалды ескере отырып, мәтіннен сөйлемдердің мысалдарын жылдам іздей алады, әріптердің регистрі мен тыныш белгілер сияқты егжей-тегжейлі мәліметтерді елемейді. Ізделінетін жолдардың көптігіне байланысты, жалғыз жолды іздеу алгоритмдері тиімсіз болады.

Шолу

Наивті тізбектерді салыстыру алгоритмі берілген үлгіні берілген мәтіннің барлық позицияларымен салыстырады. Әр салыстыруға үлгінің ұзындығына пропорционалды уақыт жұмсалады, ал позициялардың саны мәтіннің ұзындығына пропорционалды. Сондықтан, мұндай әдістің ең нашар жағдайдағы уақыты екі ұзындықтың көбейтіндісіне пропорционалды. Көптеген практикалық жағдайларда, сәйкессіздік анықталғанда әр позициядағы салыстыруды тоқтату арқылы бұл уақытты айтарлықтай қысқартуға болады, бірақ бұл идея жылдамдықтың кез келген деңгейде қамтамасыз етпейді. Бірнеше тізбектерді салыстыру алгоритмдері, соның ішінде Кнут-Моррис-Пратт алгоритмі және Бойер-Мур тізбегін іздеу алгоритмі, әр сәйкессіздіктен көбірек ақпарат алып, мәтіннің үлгіге сәйкес келмейтін позицияларын өткіріп жіберуге мүмкіндік бере отырып, тізбектерді салыстырудың ең нашар жағдайдағы уақытын азайтады. Рабин-Карп алгоритмі керісінше, әр позиция үшін жылдам шамамен тексеру үшін хэш-функцияны пайдаланып жылдамдығын арттырады, содан кейін осы шамамен тексеруден өткен позицияларда ғана нақты салыстыру жүргізеді. Хэш-функция – әрбір тізбекті сандық мәнге, яғни оның хэш-мәніне айналдыратын функция; мысалы, hash("сәлем") = 5 болуы мүмкін. Егер екі тізбек тең болса, олардың хэш-мәндері де тең болады. Жақсы жасалған хэш-функция үшін керісі де шамамен дұрыс: тең емес тізбектерде тең хэш-мәндері болуы өте сирек. Рабин-Карп алгоритмі мәтіннің әр позициясында сол позициядан басталатын және үлгінің ұзындығымен бірдей тізбектің хэш-мәнін есептейді. Егер бұл хэш-мәні үлгінің хэш-мәніне тең болса, ол сол позицияда толық салыстыру жүргізеді. Бұл жақсы жұмыс істеуі үшін хэш-функцияны көптеген жалған оң нәтижелер беретін хэш-функциялар тобынан кездейсоқ таңдау керек, яғни мәтіннің позициялары үлгімен бірдей хэш-мәніне ие, бірақ шын мәнінде үлгіге сәйкес келмейді. Бұл позициялар сәйкестік тудырмай, алгоритмнің жұмыс уақытын қажетсіз ұзартады. Сонымен қатар, қолданылатын хэш-функция жылдам жаңартылатын хэш-функция болуы керек, яғни мәтіннің әр позициясынан келесі позицияға хэш-мәнін жылдам жаңартуға болады. Әр позицияда хэш-функцияны бастапқы күйінен қайта есептеу тым баяу болады.