[Powered by Google Translate] [Merge Подреди]
[Роб Бауден - Универзитетот Харвард]
[Ова е CS50. - CS50.TV]
Ајде да зборуваме за спојување вид.
Досега сте виделе меур вид, вметнување вид, и селекција вид.
Иако јас ќе вид на бран мојата рака во она што мислам со подобро,
се спојат вид обично врши подобро од било кој од овие 3 видови.
>> Но, пред да зборуваме за спојување вид, ајде да зборуваме за спојување 2 подредени листи.
Ние ќе го наречеме процесот на преземање 2 подредени списоци, како овие,
и правење еден подредени листа од нив - спојување на листи.
Како можеме да го направите ова?
Па, една идеја е само да се држи една листа кон крајот на другиот листа
а потоа ги сортирате резултат листа.
>> Иако ова функционира, тоа е многу непотребни работи.
Ние можеме да го направи тоа побрзо отколку само сортирање.
Забележете дека една погрешна идеја е само да се наизменични чаши од секоја листа.
Иако тоа може да изгледа како тоа функционира на почетокот,
прави тоа на крајот ќе заврши со 4, 8, 15, 23, 16 - напомена дека 16 и 23 се на место.
Тоа е затоа што 2 елементи кои треба да се појави по ред во претпријатието листа
се во иста почетна листа.
Двете 15 и 16 се во листата на левата страна.
Трикот е да ги искористат предностите на фактот дека двете листи веќе се подредени.
Ова значи дека ако ние само погледнете во првите елементи на двете листи -
тука, 4 и 8 - еден од нив, исто така, мора да биде првиот елемент на споеното листа.
Па, зошто е тоа така?
И двете од овие листи се веќе сортирани,
и тоа или 4 или 8 мора да биде најмалата елемент кога се комбинираат 2 листи.
Во овој случај, најмалата е 4,
така што може да се извади 4 и да ја направат првиот елемент на нашата спои листа.
Сега ние продолжуваме спојување на останатите 3 елементи на првата листа
и 4 елементи на втората листа.
>> Уште еднаш, ние треба само да се погледне на првиот елемент на двете листи.
На помалата од 2 мора да биде вториот елемент на нашата спои листа.
Овој пат, меѓу 8 и 15 од најмалите е 8, и така ние се вметне дека
како втор елемент на нашата подредени листа.
Можеме да продолжиме споредување на првите елементи на двете листи
и отстранување на помали од 2.
Споредба на 15 и 23, 15 е помал и така тоа е нашиот трет елемент.
Сега споредување 16 и 23, 16 е помал.
Значи тоа е четвртиот елемент.
>> Забележете дека 2 елементи доаѓа од истата листа по ред.
Ова е причината зошто на претпријатието листа не може само наизменично елементи од 2 листи.
Споредба на 50 и 23, 23 е помала, па изберете тоа.
Помеѓу 50 и 42, 42 е помал.
Помеѓу 50 и 108, 50 е помал.
И, конечно, треба само 108, па тоа мора да оди на крајот на нашата листа.
Забележете дека ние имаме убаво, подредени листа.
Секој пат кога ние во споредба првите 2 елементи на 2 листи
ние бевме во можност да се утврди следниот елемент на споеното листа.
Ова значи дека ако конечниот список содржи n број, каде што n тука е 8,
тогаш ние треба најмногу n споредби да ги добиете сите од тие бројки во вистинското место.
Како алгоритам се вели да се кандидира во линеарна време,
но не грижете се за тоа тука.
>> Користење на нашата алгоритам за спојување, ние може да се направи брзо спојување вид алгоритам.
Значи, ајде да ги ресетирате нашите листи.
Постојат 2 големи чекори во процесот на спојување вид.
Прво, постојано се подели на листата на чаши во половини
додека имаме еден куп на листи со само 1 чаша во нив.
Не грижете се ако листа содржи непарен број
и не може да се направи совршено чиста сече меѓу нив.
Само произволно изберете која листа да се вклучат дополнителни чаша внатре
Значи, ајде да се подели на овие листи.
Сега имаме 2 листи.
Сега имаме 4 листи.
>> И сега ние имаме 8 листи со еден куп во секоја листа.
Значи тоа е тоа за чекор 1.
За чекор 2, ние постојано се спојат пара листи со користење на алгоритам логирате научивме досега.
Спојување 108 и 15, ќе се заокружи со листа 15, 108.
Спојување 50 и 4, на крајот ќе заврши со 4, 50.
Спојување 8 и 42, на крајот ќе заврши со 8, 42.
И спојување 23 и 16, на крајот ќе заврши со 16, 23.
Сега сите наши листи се на големината 2.
Забележете дека секоја од 4 листи се подредени.
>> Значи можеме да започнеме спојување парови на листи повторно.
Спојување 15 и 108 и 4 и 50 -
Првиот преземе 4, потоа на 15, а потоа на 50, а потоа на 108.
Спојување 8, 42 и 16, 23,
ние прво се земе 8, потоа на 16, а потоа на 23, а потоа на 42.
Така, сега имаме само 2 листи на големина од 4, од кои секоја е сортирана.
Па сега ние се спојат овие 2 листи.
Прво го земеме 4.
Потоа земаме 8.
Потоа земаме 15 и 16, потоа 23, па 42, потоа 50, па 108.
И ние ќе завршиш.
Сега имаме подредени листа.
Значи колку брзо е тоа точно?
Во технички термини, се спојат вид е О (n најавите л),
додека сите на меурот вид, вметнување вид, и селекција вид се О (n ²).
Всушност, како што ќе дознаете наскоро, вие не ќе биде во можност да излезе со еден вид
која врши подобро од О (n најавите л) во општиот случај.
Повторно, не грижете се за овој голем О нотација, ако не сте го виделе досега.
>> Само знам дека ова значи дека ако сакавме да го решите навистина голема листа
меур вид, вметнување вид, и селекција вид би можел да потрае
значително подолго отколку спојат вид.
Тоа не значи дека се спојат вид ќе биде побрз за сите листи
или дури и за било единствен список под одредена големина.
На пример, вметнување вид може да биде најбрз вид за сите листи помали од 5 елементи.
Во пракса, се спојат вид е обично побрзо за листи како мали како 50 елементи.
>> Но, ова екстра брзина не доаѓа без цена.
За разлика од нашите други сорти, кои се на листа и да ја менувате на листата во место
додека да добиеме подредени листата, се спојат вид треба некои дополнителни простор
да се спојат 2 листи заедно.
Ние не можат веднаш да го користите листи, кои се споени за чување на претпријатието листа
бидејќи ние може да ја замени елементи кои допрва треба да бидат споени.
Овој простор е малку на цена, но тоа обично не е неразумно.
И тоа е тоа за спојување вид.
>> Моето име е Роб Бауден, и ова е CS50.
[CS50.TV]
- И селекција вид.
[Се смее]
О, мора да се земе дека премногу бидејќи јас вклучен како ми е тоа презентирање.
Листа на левата страна. Тоа беше грешка.
[Погрешно ја изговори] Јас ја зезнав -
[Се смее]
Не знам што -