- •"Алгоритмдеу және бағдарламалау негіздері" пәні бойынша
- •"Алгоритмдеу және бағдарламалау негіздері" пәні бойынша
- •1. Пәннің оқу бағдарламасы - syllabus
- •1.1. Оқытушы жөнінде мәліметтер:
- •1.2. Пән бойынша мәліметтер:
- •1.3. Осыған дейінгі пәндер тізімі: Информатика, Математикалық талдау, Алгебра және геометрия, Математикалық логика.
- •1.4. Шектес пәндер тізімі: Сандық әдістер, Бағдарламалау тілі, Компьютерде тәжірибе
- •1.5. Пән мақсаты:
- •1.6. Пән бойынша берілген тапсырмаларды орындау және тапсыру графигі
- •11. Рашбаев ж.М. Массивті реттеу алгоритмдерін программалау. Оқу және методикалық әдебиеттер жөніндегі Республикалық баспа кабинеті. Алматы-1991 ж.
- •1.8. Бағалау ақпараттары
- •1.9. Курс саясаты және процедурасы
- •2. Пән бойынша оқу-әдістемелік кешен материалдары
- •2.1. Курстың тақырыптық жоспары
- •2.2. Дәріс сабақтар
- •1 Дәріс тақырыбы: Алгоритмдер. Алгоритмдерді талдау. Алгоритмдер құру.
- •2 Дәріс тақырыбы: Программа құру тілі. Программа құрылымы. Енгізу және шығару командалары.
- •3 Дәріс тақырыбы: Есептің қойылымы. Математикалық моделін тұрғызу. Алгоритмін құру. Есепті компьютерде шешу. Проектіні тексеру.
- •4 Дәріс тақырыбы: Циклдік алгоритм. Цикл түрлері. Цикл құрылымы.
- •5 Дәріс тақырыбы: Берілгендердің символдық типі. Жолдық тип.
- •6 Дәріс тақырыбы: Берілгендердің фундаментальді типі. Массив, жазба және жиынның қойылымы.
- •7 Дәріс тақырыбы: Рекурсивті алгоритмдер.
- •Мұндай рекурренттік қатынас п- факториалды санының рекурсивтік есептеу алгоритмін шамалайды.
- •8 Дәріс тақырыбы: Қосалқы программа. Функция. Процедуралық тип.
- •9 Дәріс тақырыбы: Ақпараттық құрылым. Сызықты тізім.
- •10 Дәріс тақырыбы: Ақпараттық құрылымдар. Стектер, кезектер.
- •1 Сурет
- •2 Сурет
- •4 Сурет
- •5 Сурет
- •11 Дәріс тақырыбы: Тізбекті үлестіру. Байланысқан үлестіру.
- •12 Дәріс тақырыбы: Бірбағытталған және екібағытталған байланысқан тізімдер. Көрсеткіштер.
- •13 Дәріс тақырыбы: Ақпараттық құрылым. Ағаш. Ағаштардың қойылымы.
- •14 Дәріс тақырыбы: Көпбайланысқан құрылымдар. Жадыны динамикалық бөлу.
- •15 Дәріс тақырыбы: Ішкі сұрыптау алгоритмдері: таңдау, қосу. Тікелей таңдауға талдау.
- •16 Дәріс тақырыбы: Ішкі сұрыптау алгоритмдері: Екілік қосылымға талдау жасау.
- •17 Дәріс тақырыбы: Көпіршікті және шейкерлік сұрыптауды талдау.
- •18 Дәріс тақырыбы: Бөліп алу көмегімен сұрыптау.
- •19 Дәріс тақырыбы: Медиананы табу.
- •20 Дәріс тақырыбы: Сызықты іздеу.
- •21 Дәріс тақырыбы: Екілік іздеу.
- •22 Дәріс тақырыбы: Қатарда іздеу. Кнут - Моррис - Пратт алгоритмі.
- •23 Дәріс тақырыбы: Қатарда іздеу. Боуер-Мура алгоритмі.
- •24 Дәріс тақырыбы: Жолды өңдеу алгоритмі. Рабин алгоритмі.
- •25 Дәріс тақырыбы: Қайталанбалы алгоритм.
- •26 Дәріс тақырыбы: Қайталанбалы алгоритм. Аттың жүрісі туралы есеп.
- •27 Дәріс тақырыбы: Программалаудың кейбір фундаментальді әдістері. Программаны құрастырудың технологиясы және таралуы.
- •28 Дәріс тақырыбы: Есептеуді тиімдеу. Программаны жөндеу және тестілеу әдістемесі.
- •29 Дәріс тақырыбы:
- •30 Дәріс тақырыбы: Объектіге-бағытталған программалау.
- •2.3. Зертханалық сабақ жоспарлары
- •Алгоритм. Қасиеттері. Алгоритм қойылымы.
- •2.4. Оқытушы жетекшілігімен жүргізілетін студенттердің өзбетіндік жұмысы
- •Орындаушы тәжірибе аяқталғаннан кейін шығыс ақпаратын немесе екі хабардың бірін береді.
- •65387 Санында – 5 цифр !
- •Тақырыбы: Ағаш. Ағашты қалыптастыру. Қалыпты ағашты құру.
- •Ноталардың дыбысталу жиілігі
- •Студенттердің өзбетіндік жұмыс жоспары
- •Тақырыбы: Берілгендер. Берілгендер типі, тұрақты және айнымалы. Өрнектер.
- •Тақырыбы: Динамикалық ақпаратты құрылым. Ағаш.
- •Тақырыбы: Ішкі жолдарды іздеу. Текстке сөз енгізу.
- •Тақырыбы: Ішкі сұрыптау алгоритміне программа құру.
- •Тақырыбы: Сұрыптау алгоритмі
- •Тақырыбы: Массивті сұрыптау алгоритмінің таралымы
- •Тақырыбы: Файлдық тип. Тексттік файлдар.
- •Тақырыбы: Файлмен жұмыс
- •Тақырыбы: Кіру және шығу файлдарымен жұмыс.
- •Тақырыбы: Файлдарды сұрыптау және последовательностей
- •Тақырыбы: Кнут-Морис- Пратта алгоритмін қолдану
- •Тақырыбы: Поиск подстроки в строке
- •Тақырыбы: Манипулирование строками
- •Тақырыбы: Рекурсивті алгоритмдердің таралымы. Лабиринт есебі.
- •Тақырыбы: Рекурсивті алгоритмдер құрастыру.
- •2 Мысал:
- •Тақырыбы: Мәтіндік режимде экранды басқару. Crt модулін қою.
- •2 Мысал: Күн жүйесінің динамикалық моделі.
- •2.6. Курс бойынша жазба жұмыстарының тақырыптамалары
- •Курстық жұмыс және проектілер тақырыптамалары
- •Алгоритм дегеніміз -
- •B) Тізбектелген, циклдық, тармақталу
- •Мазмұны
- •"Алгоритмдеу және бағдарламалау негіздері" пәні бойынша
22 Дәріс тақырыбы: Қатарда іздеу. Кнут - Моррис - Пратт алгоритмі.
Кнут-Моррис-Пратт Алгоритм (КМП) кіруге
X=x[1]x[2]... x[n]
сөзін алады және l[1]... l[n] натурал сандар жиымын толтыра отырып, оны солдан оңға қарай әріптен кейін әріпті қарайды, мұнда
l[i]=сөздің ұзындығы l(x[1]...х[i])
(1 функциясы алдыңғы тармақта анықталды). Сөздермен: l[i] x[1]...x[i] сөзінің ең үлкен басының ұзындығы және сонымен бір мезгілде оның соңы болып табылады.
Мұның бәрінің шағын сөзді іздеуге қандай қатысы бар?
Басқаша айтқанда, А сөзі В сөзінің шағын сөзі болып табылатынын анықтау үшін КМП алгоритмін қалай пайдалану қажет?
Шешім. КМП алгоритмін A#B сөзіне қолданамыз, мұнда # - А-да да В-да да кездеспейтін арнайы әріп. А сөзі жиымда сандар арасында 1 А сөзінің ұзындығына тең сан болғанда ғана В сөзінің сөз асты болып табылады.
l[1]...l[i] кестесін толтыру алгоритмін суреттеу.
Шешім. l[1]...l[i] мәнінің бірінші і мән табылды деп аламыз. Біз сөздің кезекті әрпін оқимыз (яғни x[i+1]) және l[i+1] есептеуіміз қажет.
Басқаша айтқанда, бізді Z сөзінің басы және сонымен бір мезгілде оның соңы болатын
x[1]...x[i+1,
қызықтырады, одан біз ең ұзынын алуымыз қажет. Басы қайдан алынады? Олардың әрқайсысы (босын есептемегенде) x[i+1] әрпін көшіріп жазу арқылы Z' кейбір сөзінен алынады. Z' сөзі x[1]...x[i] сөзінің басы мен аяғы болып табылады. Алайда, x[1]...x[i] сөзінің басы мен аяғы болып табылатын кез келген сөз жарамды болмайды, олардан кейін x[i+1] әрпінің болуы тиіс.
Z сөзін іздеудің осындай рецептін аламыз. x[1]...x[i] сөзінің соңы болып табылатын барлық басын іздейміз. Олардың арасынан соңынан x[i+1] әрпі келетін лайықтысын таңдаймыз. Лайықтылардың арасынан ең ұзынын таңдап аламыз. Оның соңына х[i+1] қосып жаза отырып, ізделіп отырған Z сөзін аламыз. Енді біз әзірлеген дайындамаларды пайдалану және осы сөздің бірмезгілде басы мен соңы болып табылатын барлық сөздерді алдыңғы бөлімнен оған 1 функцияны қайталап қолдана отырып алуға болатынын еске түсіру қажет.
Алынатыны:
i:=1; 1[1]:=0;
{ l[1]..l[i] кестесі дұрыс толтырылған}
while i <> n do begin
len:= l[i]
{len - x[1]..x[i] сөзінің оның соңы болып табылатын басының ұзындығы; барлық ең ұзын басы қолайсыз болып шықты}
while (x[len+1]<>х[i+1]) and (len>0) do begin
{басы сәйкес келмейді, оған 1 функцияны қолданамыз}
len:=l[len];
end;
{сәйкес келетінін таптық немесе жоқ екеніне көз жеткіздік}
if x[len+1]=x[i+1] do begin
{х[1]..x[len] – ең ұзын сәйкес клеетін басы}
l[i+1]:=len+1;
end else begin
{сәйкес келетіні жоқ}
l[i+1]:= 0;
end;
i:=i+1;
end;
Алгоритмде қазір ғана келтірілген амалдардың саны С кейбір константы үшін Cn басым болмайтынын дәлелдеу.
Шешім. Бұл толық айқын емес: әрбір кезекті әріпті өңдегеннен кейін ішкі циклда көптеген итерацияларды қажет етуі мүмкін. Алайда әрбір мұндай итерация len-ді кем дегенде 1-ге азайтады, және бұл жағдайда l[i+1] l[i]-нен едәуір кем болады. Екінші жағынан, і-ні бір бірлікке көбейткен кезде l[i] 1-ден артық емеске өсуі мүмкін, сондықтан ол жиі және бірден кеміте алмайды - әтпесе кемітудің орны өсумен толтырылмайды.
l[i+1]<l [i] - (i-қадамдағы итерациялар саны)+1
теңсіздігін барынша дәл жазуға болады
немесе
(i-қадамдағы итерациялар саны)<= l[i]-l[i+1]+1
Осы теңсіздікті барлық і бойына қосу және итерациялардың ортақ саны үшін жоғарыдан баға алу қалады.
Осы алгоритмді п ұзындықтағы Х сөзі m ұзындықтағы Ү сөзінің сөз асты болып табылатынын анықтау үшін пайдаланатын боламыз. (жоғарыда суреттелген # арнайы бөліктегішінің көмегімен мұны қалай жасауға болады). Бұл ретте амалдар саны және қолданылатын жады да C(n+m}-нен артық болмайды. Cn артық емес жадымен қалай айналып өтуге болады (егер ізделіп отырған үлгі қысқа, ал оны іздеп отырған сөз ұзын болса не едәуір кем болуы мүмкін).
Шешім. А#В сөзіне КМП алгоритмін қолданамыз. Бұл ретте: l[1],...,l [n] есептелген мәндерін п ұзындықты Х сөзі үшін шығарамыз. Одан әрі біз қазіргі і үшін тек қана l[i] мәнін есте қалдырамыз – одан басқа және l[1]...l[n] кестесінен басқа бізге есептеу үшін ештеңе керек емес.
Практикада Х және Ү сөздері қатар орналаспауы мүмкін, сондықтан Х сөзін және содан кейін Ү сөзін қарауды түрлі циклдер түрінде ресімдеген ыңғайлы. Бұл сондай-ақ бөліктегішпен болатын қиындықтан құтқарады.
Сәйкес алгорит жазу (тексеруші, X=x[1]...x[n] сөзі Y=y[1]...y[m] сөзінің кіші сөзі бола ма]
Шешім. Алдымен l[1]...l[n] кестесін бұрынғыша есептейміз. Содан кейін мынадай программаны жазамыз:
j:=0; len:=0;
{len – Х сөзінің ең жоғарғы басының ұзындығы сонымен қатар y[1]..j[j] сөзінің соңы болып табылатын ұзындығы}
while (len<>n) and (j<>m) do begin
while (x[len+1]<>у[j+1]) and (len>0) do begin
{басы сәйкес келмейді, оған 1 функцияны қолданамыз}
len: = l[len];
end;
{сәйкес келетінін таптық немесе жоқ екеніне көз жеткіздік}
if x[len+1]=y[j+1] do begin
{x[1]..x[len] – ең ұзын сәйкес келетін басы}
len:=len+1;
end else begin
{сәйкес келетіні жоқ}
len:=0;
end;
j:=j+1;
end;
{егер len=n, X сөзі кездеседіь; әйтпесе бізХ-ты кездестіре алмай Ү сөзінің соңына жеттік}
