n.
Мұнда реттелген тізбектегі кілттердің бірдей мәндері бар жазулар бір-бірімен қатар орындалады. Сұрыптау әдістері 2 категорияға бөлінеді:
- массивтерді сұрыптау (ішкі сұрыптау)
- тізбектелген файлдарды сұрыптау (сыртқы сұрыптау).
Массивтер ішкі оперативті жадыда орналасады. Оған кез келген уақытта тез кіруге болады. Ал сыртқы сұрыптау реттеуге тиісті мәліметтер көлемі өте үлкен болғанда мәліметтердің оперативті жадыға симай қалғанда қолданылады.
Таңдау көмегімен сұрыптау.
А массивінде мәліметтердің n элементі сақталған және бұл массив бойынша n-1 жүріс етеді. 0-ші жүрісте ең кіші элемент таңдалады. Ол кейіннен А0 элементпен айырбасталады. Келесі жүрісте тізімнің А1 элементінен бастап реттелмеген бөлігі қарастырылады. Мұнда ең кіші элемент тауып алынады да А1-де сақталады. Ары қарай А2 ... Аn-1 тізіміндегі ең кіші элемент ізделеді. Табылған мән А2-мен ауысады. Осылайша, n-1 жүріс өтеді. Соңында тізімнің реттелмеген аяғы 1 элементке дейін қысқарады. Сол элемент ең үлкен болып табылады.
Мысалға, 50,20,40,75,35 массив берілген.
0-жүріс. 20-ны таңдаймыз. Оны А0-мен ауыстырамыз (А0=50).
20,50,40,75,35.
1-жүріс. 35 таңдаймыз. Оны А1-мен орын ауыстырамыз.
20,35,40,75,50.
2-жүріс. 40 таңдаймыз. Оны А2-мен орын ауыстырамыз.
20,35,40,75,50.
3-жүріс. 50 таңдаймыз. Оны А3-пен орын ауыстырамыз.
20,35,40,50,75.
Соңғы қалған 75 саны ең үлкен элемент сұрыпталып шыққанда:
20,35,40,50,75.
Сұрыптау – массив өлшеміне ғана тәуелді салыстырулардың белгіленген санына ие болуы керек. i-ші жүрісте (A… A)-ге дейінгі элементтердің салыстырулар саны (n-1-(i+1)+1)=n-i-1 тең болады.
Салыстырулардың жалпы саны мына формуламен анықталады:
Алгоритмнің күрделілігі – О(n) тең болады.
Ауыстыру арқылы сұрыптау.
Ауыстыру арқылы сұрыптау. N элементтен тұратын а массивін айырбастау арқылы сұрыптау үшін немесе көпіршік әдісімен сұрыптау үшін n-ші жүріс қажет. Әрбір жүрісте көршілес екі элемент салыстырылады және егер 1-сі үлкен болса немесе 2-не тең болса, онда бұл элементтер орындарымен ауысады. әрбір жүрістің аяғында ең кіші элемент ішкі тізімнің жоғарғы жағына көтеріліп отырады. Бұл қайнап жатқан судың ішіндегі ауаның көбікшесіне ұқсас. Сондықтан көпіршік әдісі деп аталады.
Мысал. Массив:
50,20,40,75,35
0-жүріс. 50 мен 20салыстырылады.
20,50,40,75,35
1-жүріс. 50 мен 40 салыстырылады
20,40,50,75,35
2-жүріс. 50 мен 70 реттелген, сондықтан қалады.
20,40,50,70,35
3-жүріс.75 пен 35 салыстырылады.
20,40,50,35,75
4-жүріс. 50 мен 35 салыстырылады
20,40,35,50,75
5-жүріс. 40 пен 35 салыстырылады
20,35,40,50,75
20 мен 30 реттелген
20,35,40,50,75 болып реттеледі.
Массивтегі жүрістер саны минимальды немесе максимальды элемент қай жерде орналасқанына байланысты. Мұнда бірінен кейін бірі келетін жүрістердің бағытын ауыстыру арқылы жылдамдатуға болады. Мұндай алгоритм Шейкер сұрыптауы деп аталады.
Есептеу күрделілігі. Массив реттелген болған жағдайда бүкіл тізім бойынша 1 ғана жүріс өтеді. Мұнда тиімділігі О(n)-ға тең. Ал ең тиімсіз жағдайда i-1 жүріс орындалады және i-ші жүрісте n-i-1 салыстыру жүргізіледі. Ең тиімсіз жағдайда тиімділігі О(n2) тең. Жалпы жағдайда таңдау арқылы сұрыптау көбікше арқылы сұрыптауға қарағанда ауыстырылатын сан аздығымен тиімді болады. Шейкер сұрыптау алгоритмі элементтердің барлығы немесе көпшілігі сұрыпталған жағдайда пайдаланған тиімді.
Дәріс 4.
Қою арқылы сұрыптау. Тез сұрыптау
Мақсаты: Қою арқылы сұрыптау әдісімен танысу. Тез сұрыптау әдісімен танысу. Сұрыпталған элементтерді біріктіру әреекттерін орындау.
Қою арқылы сұрыптау – келесі процеске ұқсас. Карточкаларға аттарды жазып, карточкаларды алфавит бойынша өзіне керекті орынға қыстырып қою арқылы реттеу. Мысалға:
50,20,40,75,35 массивін қыстыру арқылы сұрыптау керек.
50 элементінен бастаймыз. 20-ны 0 позициясына қыстыру, 50-ді 1 позициясына жылжыту.
40-ты 1 позициясына қыстыру, 50-ді 2 позицияға жылжыту.
75-ті 3 позициясына қыстыру.
35-ті 1 позициясына қыстыру, қалғандарын оңға қарай жылжыту.
Есептеу күрделілігі: жалпы салыстырулар саны -ге тең. Ең жақсы жағдайда, яғни тізім реттелген жағдайда күрделілігі О(n)-ге , ал жаман жағдайда О(n2)-ге тең.
Бинарлық қоюлар арқылы сұрыптау.
Бұл жай енгізулермен сұрыптаудың жақсартылған варианты. Жаңа элементті қосуға қажетті дайын тізбек реттелген болып, енгізу орнын неғұрлым жылдам табуға негізделген. Ол үшін дайын тізбектің ортаңғы элементі ізделіп, ары қарай ортасынан бөлу қашан енгізу орыны анықталғанша жалғаса беретін бинарлық іздеу жүргізіледі.
Есептеу күрделілігі: Енгізу орыны табылады егер, al<=item<=ar болса. Соңында іздеу интервалы 1 ге тең болуы керек; бұл дегеніміз I элементтерден тұратын интервал ортасынан (log2i) рет бөлінеді деген сөз.
Салыстырулардың минимальды саны барлық элементтер кері ретпен орналасқанда, ал максимальды саны олардың осы кезде реттелген болғанында талап етіледі.
Тез сұрыптау
Тез сұрыптау әдісі – күнделікті тәжірибеден алынған.
Мысалы: Аттары бойынша алфавиттік карточкалар жиынын қандай да бір әріпке қатысты, мысалы К, екі кіші жиынға бөлуге болады. Барлық К-дан кіші немесе тең тең болатын бір жиынға, К-дан үлкен болатын бір жиынға бөлеміз. Одан кейін әрбір жиын тағы да екіге бөлінеді т.с.с. Тез сұрыптау алгоритмінде орталық элементті анықтап, сол арқылы бөлу әдісі қолданылады. Яғни, алғашқы массив екіге бөлінеді. Орталық элементтен үлкен және орталық элементтен кіші. Тура осы әрекет алынған массивтің 2 бөлігіне де жүргізіледі. Осылайша бөліне береді. Әрбір бөлікте бір ғана қалғанша жалғастырамыз.
Сұрыптау принципі:
Массивтің орталық элементі таңдап алынады. Массивтің барлық элементтері солдан оңға және оңнан солға қарай қарап өтіледі.
І. Солдан оңға қарай қозғалғанда A[scan up] деген элементті іздейміз және бұл элемент орталық элементтен үлкен болуы керек, оның позициясын есімізге сақтап аламыз. Оңнан солға қарай қозғалғанда A[scan down] деген элементті іздейміз. Ол элемент орталық элементтен кіші немесе тең болады. Позициясын есте сақтаймыз. Табылған элементтердің орындарын ауыстырамыз және scan up және scan down индекстері қиылысқанша іздеуді жалғастырамыз.
1-этапты орындап болғаннан кейін алғашқы масситің элементтері орталық элементке бөлінеді.
2-этапта 1-этаптың әрекеттері массивтің оң жақ және сол жақ бөліктері үшін жеке-жеке орындалады.
3-этапта осы әрекеттердің барлығы 4 бөлігі үшін жеке-жеке орындалады.
4-этапта 4 бөлігі жеке-жеке орындалады.
Есептеу күрделілігі. Тиімділік анализі кей жағдайда ғана мүмкін болады. Айталық, массив элементтер саны n=2 (K=log2n) 1-сканерлеуде n-1 салыстыру жүргізіледі. Оның нәтижесінің өлшемі өлшемді ішкі тізім пайда болады. Өңдеудің келесі фазасында әрбір ішкі тізім үшін n/2 салыстыру қажет болады. Осылайша, бөлу процесі табылған ішкі тізімдер тек бір ғана элементтер тұрғанша К жүрістен кейін аяқталады. Мұндағы салыстырулардың жалпы саны мына формуламен анықталады: n*k=n*log2n. Жалпы түрдегі тізім үшін есептеу күрделілігі – О(n log2n) тең болады. Ал ең нашар жағдайда орталық элемент ең кіші элемент болғанда есептеу күрделігі O(n2) тең болады.
Сұрыпталған тізбектерді біріктіру
Екі А жіне В реттелген тізімдер берілген. Оның ұзындықтары сәйкесінше m және n. Біріктіру нәтижесінде ұзындығы m және n болатын С реттелген тізімін алу қажет. әрбір элемент бойынша біріктіру жүргізіледі. Ағымдағы өткізу нүктесі әрбір тізімнің басына орналасады. Ағымдағы нүктедегі мәндер салыстырылады. Нәтижесінде солардың кішісі массивке көшіріледі. Тізбектегі мән өңделіп болғаннан кейін келесі санға бір қадам жасалады да, салыстыру жалғастырылады.
Тізімдер алғашында реттелген болғандықтан элементтер шығатын массивке сұрыпталған ретпен көшіріледі. Тізбектің біреуі аяқталғаннан кейін келесі тізбектің қалған бөліктері яғни элементтері шығтын массивке көшіріле салады.
Сұрыпталған тізбектерді біріктіру алгоритмі
Бір тізбек немесе тізбектің екеуі де біткенше келесі әрекеттерді орындау керек. Яғни, егер 1-тізбектің 1-элементі 2-тізбектің элементіне тең немесе кіші болса, онда оны шығатын тізбекке жазып қойып, 1-тізбектің келесі элементіне көшу керек. Әйтпесе, шығатын тізбекке 2-тізбектің элементін жазып, 2-тізбектің келесі элементіне көшу керек. Одан кейін шығатын тізбектің келесі элементіне көшу керек.
Егер біреуі аяғына дейін өңделмесе, онда сол қалдықты шығатын тізбекке көшіру керек.
Дәріс 5.
Тізімдерде іздеу әректтерін жүргізу
Мақсаты: Тізбектерде элементті іздеу ұғымын енгізу.
Іздеу (поиск) екіге бөлінеді:
Тізбектеліп іздеу.
Бинарлық іздеу.
Тізбектеліп іздеу. Тізбектеліп іздеудің мағынасы элементтерді тізбекпен таңдап алуды және элементтерді кілт мәнімен салыстырудан тұрады.
Функция парамертлер ретінде массивті, элементтер санын және кілт мәнін алады. Сәйкес элементтің индексін қайталайды, егер іздеу сәтсіз болса, -1 мәнін береді. Тізбектеліп іздеу кез келген тізбек үшін қолайлы, тізбектеліп іздеудің орталық тиімділігі O(n) тең болады.
Бинарлық іздеу.
Бинарлық іздеулер тек қана реттелген тізімдер үшін ғана қолданылады. Мысалы элементтер тұратын массив берілсін. Тізімнің басындағы және соңындағы элементтердің индекстері мынадай low=0 high=n-1 дейін болады. Бинарлық іздеудің алгоритмі:
Массивтің ортаңғы элементінің индексін табу: mid=(low+high)/2.
Орталық элементтің мәнін кілтпен салыстыру «Key». Егер салыстыру нәтижесінде сәйкестік бар болса, онда mid индексін кілтті табу үшін қолданамыз. Егер орталық элемент мәні кілттен кіші болса, онда қарастырылып отырған тізімнің оң жағындағы бөлігінде іздеу жүргіземіз. Егер керісінше үлкен болса, онда сол жақтағы бөлігінде іздеу жүргіземіз.
Егер ізделіп отырған элемент тізімде жоқ болса, онда үзу индикаторын береміз.
Мысалға: Бүтін сандар тұратын А массиві берілсін. 33 кілті берілген элементі бар табу керек.
Мысал элементтері: А
-
0
|
1
|
2
|
3
|
4
|
5
|
6
|
7
|
8
|
-7
|
3
|
5
|
8
|
12
|
16
|
23
|
33
|
55
|
Low=0
High=8
mid=4
33>A(mid) 0 1 2 3 4 5 6 7 8
-
mid
Low=5
High=8
mid=6
33>A(mid)
0 1 2 3 4 5 6 7 8
-
mid
Low=7
High=8
mid=7
33=A(mid)
Сонда тізбектеліп іздеуде 8 салыстыру, ал бинарлық іздеуде 3 салыстыру жүргізіледі.
Дәріс 6.
Файлдар және сыртқы тасымалдаушылардағы мәліметтер мен операциялар.
Мақсаты: Файлдар және сыртқы тасымалдаушылардағы мәліметтер мен операциялар жүргізу ұғымын қалыптастыру. Балансталған көп жолдық бірігу, табиғи бірігу арқылы сұрыптау, сыртқы сұрыптау амалдарын түсіндіру.
Көптеген қосымшаларда дисктердегі файлдарда орналасқан мәліметтерге кіру қажет болады. Мәліметтердің ұлкен жиындары жадыға бір уақытта сыйғызуға мүмкін емес миллиондаған жазулардан тұруы мүмкін. Оларды басқару үшін сыртқы сұрыптау мен іздеу алгоритмдері қажет.
Аппаратты тұрғыдан алғанда файл жазулары дискте сақталатын, белгілі ұзындықтағы мәліметтер блоктарын құрайды. Логикалық тұрғыдан алғанда жазулар файлда тізбектеліп орналасады.
Файлдық жүйе жекелеген жазуларға, сондай-ақ, барлық файлға толығымен кіруді жүзеге асыруға мүмкіндік береді.
Сыртқы сұрыптау
Файлдар түрінде ұйымдастырылған мәліметтерді сұрыптау сыртқы сұрыптау деп аталады. Егер файл оперативті жадыда сыймайтындай үлкен болса, онда сұрыптау - өте үлкен проблема. Барлық мәліметтерді бір массивте сақтауға болмайтындықтан, оларды сақтау үшін уақытша файлдарды қолдану керек.
Тура біріктіру арқылы сұрыптау екі реттелген тізімді біріктіретін жай біріктіру әдісін қолданады. Басты идеясы біртіндеп үлкейетін элементтер түрінде файл ұйымдастырылатынында, яғни жазулар тізбегі r1<=r2<=…<=rn жазулар тізбегі. Мысалға, 3 деген ұзындықтағы сериялармен ұйымдастырылған бүтін сандар тізбегі:
7 15 29 7 11 13 16 22 31 5 12
Мұнда соңы 3 тен кем ұзындықта болуы мүмкін, бірақ оның жазулары да сұрыпталған.
Сұрыптау алгоритмі
FC 5,15,35,30,20,45,35,5,65,75,40,50,60,70,30,40,25,10,45,55
Файлды екіге бөлеміз. Оның элементтерін сәйкесінше екіге бөлеміз. Осылайша, әрбір жаңа файлда элементтер тізімі пайда болады.
Ішкі тізімдерді салыстырамыз. Яғни, FA файлынан және FB файлынан бір-бір элементтен таңдап алып, жай біріктіру алгоритмін пайдалана отырып, қайтадан FC файлына жазамыз. Осылайша, барлық элементе қайтадан FC файлға ауысқанша жалғастырамыз.
FА 5,35,20,35,65,40,60,30,25,45
FВ 15,30,45,5,75,50,70,40,10,55
FC 5,15,30,35,20,45,5,35,65,75,40,50,60,70,30,40,10,25,45,55
Бір қадамды қайталап, FА және FВ файлдарына екі элементті серияларды жазып шығарамыз.
FА 5,15,20,45,65,75,60,70,10,25
FВ 30,35,5,35,40,50,30,40,45,55
FА және FВ файлдарындағы екі элементті серияларды FC файлына 4 элементті серияға біріктіреміз. Мұнда реттелген тізімдерді біріктіру алгоритмін пайдаланамыз.
FC 5,15,30,35, 5,20,35,45
40 50 65 75 30 40 60 70 10 25 45 55
FС файлын екіге бөлетін қадамды FА және FВ файлында сәйкесінше 4 8 т.с.с элементтер серияларын құрай отырып және сериялардың әрбір жұптарын біріктіре отырып қайталаймыз. Процесс FА және FВ файлдары бір-бір реттелген тізімнен тұрғанда және олар FC сұрыпталған файлына соңғы рет бірікенде аяқталады.
Түзу бірігу сұрыптау анализі.
Сұрыптау бір элементі ішкі тізімдердің жүрістер сериясынан тұрады, әрбір жүрісте ішкі тізімнің ұзындығы екі еселенеді. Ол үшін log2n жүріс қажет болады. Түзу бірігу арқылы сұрыптау 2n log2n мәліметтерді қарауды талап етеді, сондықтан оның күрделілік реті O(n log 2n).
Табиғи бірігу арқылы сұрыптау
Түзу бірігу арқылы сұрыптауда алғашқы ұзындығы бірге тең болатын реттелген сериялар пайдаланылады да, олар әрбір жүріс сайын екі еселеніп отырады. Ең аяғында сериялар файлдардың барлығын қамтиды да сұрыпталу аяқталады. Мұның бір кемшілігі қысқа сериялар мен жұмыста көп уақыт кетеді. Мұндай сұрыптауды салыстырмалы түрде ұзын сериялардан бастасақ, алгоритмнің тиімділігі неғұрлым артады. Әрбір ретте неғұрлым екі серия бірігетін сұрыпталу әдісі Табиғи бірігу деп аталады.
Сұрыптау алгоритмі
Алғашқыда FC алғашқы файлды және алғашқы ұзындықтағы реттелген серияларды жасау үшін оперативті жадыдағы буфер керек:
Алғашқы файлдың мәліметтері буферге блок бойынша оқылады.
Әрбір блок сұрыпталудың кез келген алгоритмі арқылы сұрыпталады да (мысалы, тез сұрыпталу), кезек-кезек FB және FA файлдарына көшіріліп отырады.
FC файлы біткен кезде қайтадан уақытша FА және FВ файлындағы мәліметтер блоктары қайтадан біріге бастайды.
Осылайша, сұрыптау жай бірігуге ұқсас жалғаса береді.
Алгоритм анализі:
Мұнда әрбір жүрістен сериялардың саны екі есе қысқарады. Сондықтан жіберулердің жалпы саны ең жаман жағдайда n log2n тең болады. Ал жалпы жағдайда одан да аз болады.
Балансталған көп жолдық бірігу
Тізбектелген сұрыпталуға кететін шығын жүрістің санына прорпорционал болады. Шығынды азайтудың бір жолы екі уақытша немесе одан да көп файлдарды пайдалану R сериялы бірігу n уақытша файлдарға бөлінгенде ішкі тізімдерден тұратын тізбек құрайды. Екінші жүріс бұл санды дейін қысқартады. Ал үшінші жүріс дейін қысқартады. Осылайша к жүрістен кейін бөлік қалады. n элементі N жүрісті бірігу мен сұрыптауда жүрістің жалпы саны k=logNn (N-жол, n-элементтер саны) тең болады. Әрбір жүрісте қайта жазудың n операциясы жүретін болғандықтан ең жаман жағдайда операцияның жалпы саны M=n logNn болады.
Дәріс 7.
Мәтіндерге тізбектеліп кіретін мәліметтердің сызықтық құрылымдық типтері.
Мақсаты: Мәтіндерге тізбектеліп кіретін мәліметтердің сызықтық құрылымдық типтері ұғымы. Байланған сызықтық тізімдер түсініктерін енгізу.
Байланған сызықтық тізімдер
Тізім дегеніміз – сандары өзгеруі мүмкін элементтердің жиынтығы. Ол шынжырдағы шығыршық іспеттес. Тізімнің ұзындығы жаңа шығыршықтар қосу арқылы көбеюі мүмкін. Жаңа элементтер тізімге тізімнің бір жерін үзіп, соған жаңа элемент қосып, қайтандан жалғау арқылы кіргізуі мүмкін. Элементтер тізіміне сол сияқты тізімді үзіп, бір шығыршықты алып қайта жалғап қойған сияқты алынып тасталады. Тізімдер үш түрлі болады:
1. Бір байланысты.
2. Циклық
3. Екі байланысты
Бір байланысты сызықтық тізім.
Бір байланысты сызықтық тізім екі әдіспен жүзеге асуы мүмкін:
1-массивтер негізінде
2-көрсеткіштер көмегімен
Тізімді массив негізінде жүзеге асыруда тізім элементтері массивінің қатарлас ұяшықтарында орналасады. Бұлай берілуі тізімнің мазмұнын жеңіл қарап, оның аяғына жаңа элементтер қосуға мүмкіндік береді. Бірақ жаңа элементті тізімнің ортасына қосу қажет болғанда оған арнап кейінгі элементтердің барлығын массивтің аяғына қарай бір позиция жылжытып, бір орын ашу керек. Сол сияқты массив элементін алып тастау үшін де босаған ұяшықты жою үшін элементтің барлығын солға қарай жылжыту керек болады. Бірақ бұлай істеудің бірнеше кемшіліктері бар:
Тізімді массив негізінде жүзеге асыру орындалмас бұрын тізімнің максималды өлшемін көрсетуді талап етеді.
Массив негізіндегі тізімдерді жүзеге асыру компьютер жадысының үлкен көлемін қажет етеді. Тізімді жүзеге асыру үшін тізімнің ең үлкен мүмкін мөлшеріне жететіндей етіп жады көлемін бөлу қажет.
Көрсеткіштер көмегімен жүзеге асыру. Тізімді сақтау үшін жадының үзіліссіз аймағын пайдаланудан босатады. Сондықтан бұл жағдайда элементтерді қосқанда немесе өшіргенде элементтер ары-бері жылжытуды қажет етпейді. Алайда, бұл жағдайда көрсеткіштерді сақтайтын қосымша жады керек болады. Тізімнің әрбір бөлігі – мәліметтер өрісінен және тізімдегі келесі элементтерді көрсететін көрсеткіштен тұрады.
Байланған тізімнің құрылымы келесі түрде берілуі мүмкін:
head
ptr rear NULL
-
Dann1
|
Next
|
|
Dann2
|
Next
|
|
Dann N-1
|
next
|
|
dannN
|
next
|