Հիմնական նյութ
Համակարգչային գիտություն
Դասընթաց․ (Համակարգչային գիտություն) > Բաժին 1
Դաս 5: Ներդրման տեսակավորումՆերդրման տեսակավորում. վերլուծություն
Ինչպես ընտրական տեսակավորումը, ներդրման տեսակավորումն անցնում է զանգվածի ցուցիչների վրայով։ Այն 1, comma, 2, comma, 3, comma, dots, comma, n, minus, 1 ցուցիչներով տարրերի վրա կանչում է
insert
ֆունկցիան։ Ինչպես indexOfMinimum
-ի ամեն կանչի ժամանակն է կախված տեսակավորված ենթազանգվածի չափսից, այնպես էլ ամեն insert
ֆունկցիայի կանչի ժամանակը։ Իրականում վերջինս կարող է և կախված չլինել, և կտեսնենք՝ ինչու։Արի վերցնենք այն դեպքը, երբ կանչում ենք
insert
ֆունկցիան, և ենթազանգվածում տեղադրվող արժեքը փոքր է իրենից ձախ բոլոր արժեքներից։ Օրինակ, եթե [2, 3, 5, 7, 11] ենթազանգվածի մեջ տեղադրենք 0, ապա ենթազանգվածի բոլոր տարրերը պետք է մեկով տեղափոխվեն դեպի աջ։ Հետևաբար, եթե տեղադրում ենք k տարր ունեցող ենթազանգվածում, հնարավոր է, որ բոլոր k տարրերը տեղափոխվեն մեկով աջ։ Կոդի տողերը հաշվելու փոխարեն կարող ենք դրա ժամանակը նշանակել հաստատուն թվով՝ c-ով։ Հետևաբար, ընդհուպ մինչև c, dot, k ժամանակում տարր կտեղադրենք k տարրերով ենթազանգվածում։Պատկերացրու՝ ամեն
insert
-ի կանչի ժամանակ արժեքը փոքր է իրենից ձախ բոլոր արժեքներից։ insert
-ի առաջին կանչի ժամանակ k, equals, 1։ Երկրորդ անգամ k, equals, 2։ Երրորդ անգամ k, equals, 3։ Եվ այդպես շարունակ, մինչև k, equals, n, minus, 1։ Հետևաբար, տեսակավորված ենթազանգվածում տարր տեղադրելու ընդհանուր ժամանակը հավասար է՝c, dot, 1, plus, c, dot, 2, plus, c, dot, 3, plus, \@cdots, c, dot, left parenthesis, n, minus, 1, right parenthesis, equals, c, dot, left parenthesis, 1, plus, 2, plus, 3, plus, \@cdots, plus, left parenthesis, n, minus, 1, right parenthesis, right parenthesis .
Գումարը թվաբանական պրոգրեսիա է, բայց մեկից մինչև n, minus, 1 թվերի համար, ոչ թե n։ Օգտագործելով թվաբանական պրոգրեսիայի գումարի բանաձևը՝ տեղադրելու ընդհանուր ժամանակը ստանում ենք՝
c, dot, left parenthesis, n, minus, 1, plus, 1, right parenthesis, left parenthesis, left parenthesis, n, minus, 1, right parenthesis, slash, 2, right parenthesis, equals, c, n, squared, slash, 2, minus, c, n, slash, 2 .
big-Θ նշագրումով ազատվում ենք ցածր աստիճանով անդամից՝ c, n, slash, 2, և հաստատուն գործակիցներից՝ c ու 1/2՝ արդյունքում ստանալով ներդրման տեսակավորման աշխատելու ժամանակը՝ \Theta, left parenthesis, n, squared, right parenthesis։
Կարո՞ղ է ներդրման տեսակավորման ժամանակը լինել ավելի քիչ, քան \Theta, left parenthesis, n, squared, right parenthesis։ Պատասխանն է՝ այո։ Պատկերացրու՝ ունենք [2, 3, 5, 7, 11] զանգված, որտեղ առաջին չորս տարրերը տեսակավորված են, և մենք տեղադրում ենք 11\ թիվը։ Առաջին համեմատության ժամանակ տեսնում ենք, որ 11-ը մեծ է 7-ից, և ենթազանգվածի ոչ մի տարր չենք տեղափոխում աջ։
insert
-ի այս կանչն ունի հաստատուն ժամանակ։ Պատկերացրու, եթե ամեն insert
կանչի ժամանակը լինի հաստատուն։ Քանի որ ընդհանուր կա n, minus, 1 insert
կանչ, եթե դրանցից յուրաքանչյուրի կանչն ունենա հաստատուն c ժամանակ, ապա ներդրման տեսակավորման ընդհանուր ժամանակը կլինի c, dot, left parenthesis, n, minus, 1, right parenthesis, որը \Theta, left parenthesis, n, right parenthesis է, ոչ թե \Theta, left parenthesis, n, squared, right parenthesis։Կարո՞ղ են այս դեպքերը հանդիպել մեզ։ Կարո՞ղ է
insert
-ի ամեն կանչ ենթազանգվածի բոլոր տարրերը մեկով շարժել դեպի աջ։ Կարո՞ղ է insert
-ի ոչ մի կանչ տարր չտեղաշարժի։ Երկուսն էլ հնարավոր է։ insert
կանչից հետո բանալուց ձախ ենթազանգվածում դրանից մեծ բոլոր թվերը մեկով տեղաշարժվում են դեպի աջ։ Հետևաբար, եթե բոլոր տարրերը փոքր են իրենցից ձախ գտնվող բոլոր տարրերից, ապա ներդրման տեսակավորման աշխատելու ժամանակը \Theta, left parenthesis, n, squared, right parenthesis է։ Ի՞նչ է նշանակում բոլոր տարրերը փոքր են իրենցից ձախ գտնվող բոլոր տարրերից։ Նշանակում է, որ զանգվածն ամենասկզբում հակառակ դասավորվածությունն ուներ, այսինքն՝ օրինակ [11, 7, 5, 3, 2]։ Հետևաբար, հակառակ դասավորված զանգվածը ներդրման տեսակավորման վատագույն դեպքն է։Իսկ ի՞նչ կլինի մյուս դեպքում։ Եթե
insert
կանչի ժամանակ ոչ մի տարր չի տեղաշարժվել, ապա բանալին մեծ է իրենից ձախ բոլոր տարրերից։ Հետևաբար, եթե բոլոր տարրերը մեծ կամ հավասար են իրենցից ձախ գտնվող բոլոր տարրերին, ապա ներդրման տեսակավորման աշխատելու ժամանակը \Theta, left parenthesis, n, right parenthesis է։ Այս դեպքը տեղի է ունենում այն ժամանակ, երբ սկզբում արդեն զանգվածը ճիշտ դասավորված է, և հետևաբար ներդրման տեսակավորման լավագույն դեպքն արդեն տեսակավորված զանգվածն է։Է՞լ ինչ կարող ենք ասել ներդրման տեսակավորման աշխատելու ժամանակի մասին։ Ենթադրենք՝ զանգվածը խառն է դասավորված։ Ապա միջինում կակնկալենք, որյուրաքանչյուր տարրը փոքր լինի իրենից ձախ տարրերից կեսից։ Այս դեպքում k տարրերով ենթազանգվածի վրա
insert
կանչը միջինում դրանցից k, slash, 2-ը կտեղափոխի մեկով աջ։ Աշխատելու ժամանակը կլինի վատագույն աշխատելու ժամանակի կեսը։ Բայց ասիմպտոտային նշագրման ժամանակ, երբ հաստատուն գործակիցներն անտեսում ենք, միջին դեպքը կլինի \Theta, left parenthesis, n, squared, right parenthesis՝ վատագույն դեպքի նման։Իսկ ի՞նչ կլինի, եթե զանգվածը «համարյա տեսակավորված է»․ յուրաքանչյուր տարրը վատագույն դեպքում անցնում է հաստատուն տարրերի վրայով, ասենք՝ 17։ Հետևաբար,
insert
-ի ամեն կանչ տեղափոխում է առավելագույնը 17 տարր, և k տարր ունեցող ենթազանգվածի վրա insert
-ի մի կանչի ժամանակը կլինի առավելագույնը 17, dot, c։ n, minus, 1 հատ insert
կանչից հետո աշխատելու ժամանակը կլինի 17, dot, c, dot, left parenthesis, n, minus, 1, right parenthesis, որը \Theta, left parenthesis, n, right parenthesis-ն է, ճիշտ այնպես, ինչպես լավագույն դեպքում։ Հետևաբար, ներդրման տեսակավորումն արագ է, երբ ունենք համարյա տեսակավորված զանգված։Որպես ներդրման տեսակավորման աշխատելու ժամանակների ամփոփում՝
- Վատագույն դեպք․ \Theta, left parenthesis, n, squared, right parenthesis։
- Լավագույն դեպք․ \Theta, left parenthesis, n, right parenthesis։
- Խառը զանգվածով միջին դեպք․ \Theta, left parenthesis, n, squared, right parenthesis։
- «Համարյա տեսակավորված» զանգվածով միջին դեպք․ \Theta, left parenthesis, n, right parenthesis։
Եթե ուզում ես բոլոր դեպքերի համար սահմանել ներդրման տեսակավորման աշխատելու ժամանակը, ապա պետք է ասես, որ այն O, left parenthesis, n, squared, right parenthesis է։ Չես կարող ասել \Theta, left parenthesis, n, squared, right parenthesis, քանի որ լավագույն դեպքը \Theta, left parenthesis, n, right parenthesis է։ Չես կարող ասել \Theta, left parenthesis, n, right parenthesis, քանի որ վատագույն դեպքը \Theta, left parenthesis, n, squared, right parenthesis է։
Նյութը ստեղծվել է Դարթմութի համակարգչային գիտությունների դասախոսներ Թոմաս Քորմենի և Դեվին Բալկքոմի, ինչպես նաև «Քան» ակադեմիայի ծրագրավորման թիմի կողմից։ Նյութը լիցենզավորվել է CC-BY-NC-SA-ի կողմից։
Ուզո՞ւմ ես միանալ խոսակցությանը։
Առայժմ հրապարակումներ չկան։