Лекция по програмиране: седем метода за сортиране с код, оценка на сложността и устойчивост
Зареждане на оценките…
Седем метода, събрани на едно място, и при всеки от тях три неща: идеята с едно изречение, готов код и честна оценка кога си струва да го използваш. Точно това се иска на изпит по алгоритми, където въпросът почти никога не е „как работи“, а „кой метод би избрал и защо“.
Подредбата не е случайна. Методите идват по нарастваща сложност на идеята, от най-простите, които всеки може да напише наизуст, до онези, които изискват дърво или рекурсия. Така материалът може да се чете и подред, като учебен път, и на парче, когато трябва само едно нещо.
Първо идват простите методи. Три на брой, с подробно обяснена идея и с показан механизъм на разделяне на масива на подредена и неподредена част. При първия от тях са дадени и трите оценки на времето, за най-добрия, най-лошия и средния случай, като средната е изведена чрез броя на инверсиите, което е любим изпитен въпрос. При третия са описани две отделни подобрения на основния алгоритъм, включително промяната на посоката на обхождане и запомнянето на индекса на последната размяна. Тези подобрения рядко се срещат в учебниците и правят отговора забележим.
После идват по-бързите. Тук материалът дава и историческа бележка кой и в коя година предлага подобрението, което първо сваля сложността под квадратична, плюс препоръчителните стойности на стъпката и редицата, която ги поражда, според Кнут.
Най-обемната част е посветена на бързото сортиране и тя е най-ценното в целия текст. Разгледани са двата различни подхода за разделяне на масива, всеки с обяснение как се движат индексите и къде спира процесът. После следва цял раздел по въпроса, който на изпит се задава винаги: как се избира разделящият елемент. Дадени са няколко възможни стратегии, обяснено е защо изборът е толкова важен и какво се случва с ефективността при лош избор. Прибавени са и две практически бележки от самия автор на метода, както и причината защо при малки подмасиви си струва да се премине към друг алгоритъм. Накрая е описано как рекурсията може да се замени с итерация чрез стек.
Накрая са методите с гарантирана сложност. При сортирането чрез сливане са изброени предимствата поред, включително последователният достъп до елементите и устойчивостта, и честно е посочен основният недостатък. При пирамидалното сортиране първо е дадено определението за пирамида с трите условия, които трябва да са изпълнени, после стъпките на алгоритъма една по една и накрая кодът.
През целия текст върви и една полезна линия: при всеки метод е казано устойчив ли е и при какъв размер на входа се препоръчва. Това превръща материала в таблица за избор, а не само в описание.
Какво получаваш. Готов код за всеки метод, който се компилира и се чете лесно. Оценки на сложността с обяснение откъде идват. Устойчивост и препоръки за приложение при всеки метод. И отделен, подробен раздел по най-трудния въпрос в темата, този за разделящия елемент.
Стилът е конспектен и технически, без излишни думи. Текстът е за учене с молив в ръка.
За какво служи. За подготовка за изпит по структури от данни и алгоритми. За курсова работа, в която трябва да се обоснове избор на метод. За бърза справка, когато трябва да се напише сортиране и да се прецени кое е подходящо. И за преговор на оценките на сложността преди колоквиум.
Понятия: сортиране, сортиране чрез вмъкване, пряка селекция, метод на мехурчето, сортировка на Шел, бързо сортиране, разделяй и владей, сортиране чрез сливане, пирамидална сортировка, пирамида, инверсия, устойчивост на метода, времева сложност, рекурсия и итерация, разделящ елемент, допълнителна памет.
Полза за преподавателя: готова структура на лекция или на упражнение, в която всеки метод идва с код, с оценка и с препоръка за приложение, тоест с готов материал за задача за сравнение между методи.
Полза за студента: сигурност, че по темата нищо не е пропуснато. След прочита се знае кои методи са устойчиви, кой кога се използва, откъде идват оценките на сложността и как се обосновава избор на метод.
Заключено съдържание
Купете материала за пълен достъп
Свързани материали
Пет подхода в проектирането на алгоритми – разделяй и владей, динамично програмиране, връщане назад, лакоми и вероятностни алгоритми
Материал, който събира пет различни начина за подхождане към една задача и показва защо всеки от тях се появява там, където предходният се проваля. Именно тази последователност държи изложението. Всеки нов подход не е представен сам за себе си, а като отговор на недостатък на предишния — така се вижда логиката, по която са възникнали. Темата обхваща основните подходи в проектирането на алгоритми и е събрана на седем страници. Първата част е за разделянето на подзадачи. Тя започва с трите стъпки на метода, а после веднага минава към конкретен пример — умножение на две многоразредни числа. Именно този пример е най-силната част. Показано е как обичайният начин изисква определен брой умножения, как едно преобразуване спестява едно от тях и как оттам сложността пада. Изводът е проверен и с числа — две четириразредни числа, при които се брои колко умножения излизат по всеки от двата начина. Следва пълното извеждане на общата зависимост. То минава през няколко последователни замествания и завършва с разглеждане на три случая според съотношението между два параметъра. При всеки случай е получена отделна оценка. Втората част въвежда следващия подход и обяснява кога предходният не върши работа — когато броят на подзадачите зависи от размера на входа. Третата част е за търсенето с връщане назад. Тя стъпва изцяло на една задача — пресичане на пустиня с ограничен запас от гориво. Задачата е решавана постъпателно, като на всяка стъпка се пита къде трябва да стои поредният склад, а отговорът за предходния се използва при следващия. Особено ценен е този начин на изложение. Читателят не получава готова формула, а върви заедно с разсъждението, докато решението се самоизгради. Четвъртата част е за постъпателните алгоритми, разгледани чрез две различни разграничения, а после и чрез задача за връщане на пари, представена в номерирани стъпки. Петата част е за вероятностните алгоритми. Разграничени са от обичайните, обяснено е кое ги прави такива, а после са изброени три техни разновидности. Приведена е и формула за получаване на случайни числа, следвана от примерна програма. Материалът съдържа три чертежа и множество изрази, а на места е даден и код. За преподавателя това е готова опора за няколко часа, при която всяка част върши работа и поединично. Студентът получава петте подхода на едно място, с по един разработен пример при всеки.
Синтез и анализ на алгоритми – 45 разработени изпитни въпроса с примерен код, схеми и оценки на сложността за подготовка на студенти
Четиридесет и пет въпроса, разработени един след друг — целият конспект по един предмет, събран в един файл. Обемът надхвърля сто и шестдесет хиляди знака. Именно тази пълнота прави материала стойностен. Студентът не търси по няколко източника за отделните теми, а разполага с готов текст за всяка от тях. Материалът е върху синтеза и анализа на алгоритми и е събран на тридесет и седем страници. Началото поставя основите — какво представлява алгоритъмът, по какви начини може да бъде записан и кои са неговите свойства. Изброени са пет отделни свойства, а после и няколко признака, по които алгоритмите се делят на видове. Оттам изложението върви по конспекта, като темите са подредени по нарастваща сложност. Първата голяма група е за основните структури от данни — дървета с техните свойства и обхождания, списъци, стек, опашки и хеш таблици. При всяка е дадена и представа за начина, по който се реализира. Средището са сортировките. Разгледани са седем различни метода в отделни въпроси, като при няколко от тях е показано и как алгоритъмът може да се подобри. Особено ценна е групата за подходите. Тук са разделяй и владей, постъпателните алгоритми с три отделни приложения, динамичното програмиране, връщането назад и алгоритмите от теорията на игрите. Финалната група е за графите — представяне, топологично сортиране, най-къс път по два начина, пропускателна способност и минимално обхващащо дърво по два известни алгоритъма. Изложението е конспектно и удобно за преговор. Определенията са кратки, стъпките са номерирани, а на много места е приведен и примерен код с обяснение под него. При голяма част от въпросите е дадена и оценката на сложността, изразена със съответното означение — точно онова, което се пита на изпит. Материалът съдържа осемдесет и осем изображения — блокови схеми, дървета, графи и таблици. Преподавателят получава готов набор от разработени въпроси, който върши работа като мерило при проверка. Студентът разполага с целия конспект в готов вид — удобно за подготовка в последните дни, когато времето не стига за четене на лекции. Всеки въпрос се преговаря самостоятелно, а подредбата позволява да се тръгне направо от онзи, който предстои.
Синтез и анализ на алгоритми – сбити записки за преговор: целият конспект, събран на девет страници с деветдесет и три чертежа
Целият конспект по един предмет, сведен до девет страници. Онова, което в обичайните записки заема тридесет и седем, тук е събрано в една четвърт от обема — без да е изпуснато съществено. Именно това сгъстяване е смисълът на материала. Той не е предназначен за първо запознаване с предмета, а за последния преговор, когато времето не стига и е нужно всичко да се обхване наведнъж. Съкращаването е постигнато по два начина. Първият е шрифтът — основният текст е с размер шест пункта, а част от него дори с пет. Вторият са съкращенията: над двеста в целия текст, при това последователно прилагани. Съкратени са и заглавията на самите въпроси, така че всяко се побира на един ред. Обхватът следва конспекта. Началото е с основните понятия, свойствата на алгоритъма и класификациите му по няколко признака. Следват математическите основи, рекурсията с нейните типове и опасности, а после и същинският анализ — означенията, определенията и правилата. Отделни въпроси прилагат тези правила върху конкретни случаи: цикли, вложени цикли, рекурсия и многократна рекурсия. Средището са структурите. Дърветата заемат няколко последователни въпроса — понятия и класификации, свойства на двоичните, обхождане и рекурсивни алгоритми върху тях. Оттам следват сортировките, а после и групата за подходите: разделяй и владей, динамичното програмиране в два въпроса, постъпателните алгоритми с техните приложения и връщането назад, включително при игри. Финалната група е за графите — общи понятия, представяне, топологично сортиране, най-къс път, пропускателна способност и минимално обхващащо дърво. Особено ценни са деветдесет и трите чертежа. При такова сгъстяване те носят голяма част от обяснението — дървета, графи, схеми и таблици, вмъкнати направо между редовете. Материалът е готов за печат в този вид. Не се нуждае от преформатиране, а разположението е съобразено с разрязване на отделни ленти. Преподавателят може да го използва като бърз преглед какво влиза в изпита. Студентът получава целия материал в най-сбит възможен вид. Годен е за преговор в последните часове преди изпит, когато е нужно освежаване, а не четене.
Проектиране на техническо изделие – основни проблеми, видове методи, функционален метод. Алгоритъм в шест стъпки
Кратък конспектен въпрос, чиято сърцевина е един алгоритъм. Той е разписан в шест стъпки, но повечето от тях се разклоняват на подстъпки — и на места разклоненията стигат до четвърто равнище. Именно тази многостепенна подредба прави материала практичен. Той не разказва как се проектира, а изброява какво се прави и в какъв ред, така че може да се следва като указание. Темата е проектирането на техническо изделие и е събрана на две страници. Началото изброява четирите основни задачи, които се решават при проектиране, и веднага след това четирите съществуващи метода, всеки назован поименно. Оттам изложението се съсредоточава върху последния от тях, с уточнение за какво е предназначен — за изделие, което се проектира наново, а не се преработва. Средището е самият алгоритъм. Първата стъпка е за формулирането на задачата. Тя минава през три подстъпки, като най-полезна е последната — преформулиране на вече определената задача. Похват, който често се пропуска, а промяната на формулировката отваря нови възможности за решение. Втората стъпка определя основната функция и изходящия поток. Третата е най-разгърнатата и изброява шест различни начина за търсене на решение. Освен обичайните са посочени и обръщането към патентната литература, разглеждането на съществуващи сходни изделия и използването на различните формулировки от първата стъпка. Именно това изброяване е най-ценното в материала. То превръща търсенето на решение от вдъхновение в подредена работа. Петата стъпка е най-дълбоко разклонената. Тя изисква за всеки избран вариант да се извърши разлагане по функции, да се състави таблица с възможните решения, а после за всяка съставна част да се уточнят изискванията към материала, съседните части и връзките помежду им. Финалната стъпка е за работната документация. Изложението е конспектно, с многоравнищни изброявания и с препратки между отделните точки по номер. Използвани са и няколко съкращения, въведени в текста. За преподавателя това е готов кратък урок, а алгоритъмът върши работа и като раздавателен лист при курсова задача. Студентът получава темата в завършен вид. Обемът позволява преговор за минути преди изпит.
Графи (мрежови структури) – учебен материал по структури от данни: понятия, статично и динамично представяне, операции и аксиоми, алгоритми с код и решени примери
Осем страници, в които една структура от данни е разгледана от определението до три готови алгоритъма с код – точно каквото трябва за изпит по програмиране. Материалът е конспектен, но не е сбит до неразбираемост. Всяко понятие е въведено с определение и онагледено с пример, а алгоритмите не са само описани – дадени са с реален код и с проследено числено изпълнение. Първата част е терминологична и обхваща в плътна последователност всичко, което се пита: определението за граф, разликата спрямо дървото, видовете дъги и графи, инцидентност и съседство, степен на връх с отделните ѝ разновидности при ориентиран граф, път, дължина, прост път, цикъл, свързаност и подграфи. Означенията са въведени поред и се използват последователно нататък. Втората част е за представянето в паметта и е разделена на три подхода. Статичните са три на брой, всеки с приложена схема. Динамичното е дадено с готови структури, а комбинираното – с още една декларация. Тук е и бележката кога кой подход е за предпочитане. Следва списък с осемте основни операции, а веднага след него – деветте аксиоми, при които те са определени. Последната аксиома важи само за единия вид графи и това е изрично уточнено. Такова изброяване рядко се среща събрано на едно място. Средището са трите алгоритъма и всеки е разгърнат по един и същи начин. Първият е за най-къс път и е представен с постановка, с описание на работата чрез поддържане на множество, с числен пример и с масивите, използвани в него, а после и с пълен програмен код. Накрая е дадена сложността при двата начина на представяне. Вторият е за топологично сортиране. Тук е обяснено защо резултатът рядко е единствен, приведени са няколко възможни подредби, дадени са трите стъпки и е посочен обратният вариант на същия алгоритъм. Третият е за най-дълъг път и започва с практическа задача от разработването на програмен продукт, преведена в термините на графа. След трите стъпки и сложността следва напълно проследено числено изпълнение по стъпки, а накрая – указание как алгоритъмът се реализира рекурсивно. За преподавателя това е готова опора за няколко учебни часа, която не изисква подготовка. Трите алгоритъма вършат работа и поединично – като материал за упражнение или като тема за самостоятелна работа. За студента ползата е ясна: целият изпитен въпрос е събран на едно място, а програмният код и проследените числени примери спестяват търсенето по няколко източника. Материалът се преговаря непосредствено преди изпит и върши работа при курсова задача.
Протокол по Програмиране и използване на компютри: едномерни масиви на езика С. Три задачи с готов код – търсене на максимум, обработка по условие и обръщане на масива
Протокол с три задачи и три работещи програми към тях. Не описания на алгоритми с думи, а готов код, който се компилира и върши работа. Протокол номер три по дисциплината Програмиране и използване на компютри върху едномерни масиви на езика С. Какво съдържа Три задачи, всяка с изписано условие и с пълна програма непосредствено под него. Първата задача е и най-обемната. Иска се въвеждане на стойности в целочислен масив от клавиатурата, извеждане на съдържанието му и след това обработка по условие: намиране на най-голямата стойност и заменяне на всички елементи с нула или единица според това как се съотнасят с половината от нея. В условието е поставено и допълнително изискване въвеждането да се реализира по три различни начина за достъп до елементите. Втората задача е класическа: пренареждане на масива в обратен ред, при което първият елемент отива на мястото на последния, вторият на мястото на предпоследния и така нататък, с извеждане на резултата след обработката. Третата задача надгражда първата. Иска се не само стойността на най-големия елемент, но и неговият индекс, тоест мястото му в масива. Как е написан кодът Просто и четливо, без излишни конструкции. Използват се само основни средства на езика: масив с фиксиран размер, цикъл за въвеждане, цикъл за извеждане и цикъл за обработката. Няма функции, няма динамична памет, няма нищо, което да отклонява вниманието от самата задача. Във всяка програма се вижда един и същи работен ред: въвеждане, проверка чрез извеждане, обработка, повторно извеждане. Това е добра дисциплина, която си струва да се усвои, защото при по-сложни задачи позволява грешката да се открие веднага. Полезни решения При търсенето на най-голямата стойност е използван похватът, при който първият елемент се приема за максимален в самото начало на цикъла, вместо да се задава произволна начална стойност. Това предпазва от грешка при масиви само с отрицателни числа и е от нещата, които се запомнят веднъж и се използват винаги. При обръщането на масива размяната е направена през спомагателна променлива, с едновременно движение на двата индекса един срещу друг и с правилно изчислен брой стъпки. Това е решение, което мнозина не улучват от първия път. При третата задача се вижда как с едно-единствено допълнение в същия цикъл се запомня не само стойността, но и позицията ѝ, без да е нужно второ обхождане на масива. За учащия: три готови програми по типични задачи върху масиви, подходящи за подготовка на собствен протокол, за преговор преди изпит, за сверяване на собствено решение и като отправна точка за по-сложни задачи. Кодът може да се пренапише с други размери и други условия за обработка, без логиката да се променя. За преподавателя: готови условия с решения, по които лесно се съставят варианти с друга обработка или с друг размер на масива. Първата задача е подходяща и за разговор за трите начина за достъп до елементите на масив.