Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Տեղի է ունեցել մի քանի օր առաջ Hydra կոնֆերանս. JUG.ru խմբի տղաները հրավիրեցին երազանքի խոսնակներին (Լեսլի Լեմպորտ! Քլիֆ Քլիֆ! Մարտին Քլեպման!) և երկու օր նվիրեցին բաշխված համակարգերին և հաշվողական աշխատանքին: Կոնտուրը համաժողովի երեք գործընկերներից մեկն էր։ Մենք խոսեցինք տաղավարում, խոսեցինք մեր բաշխված պահեստի մասին, խաղացինք բինգո և լուծեցինք գլուխկոտրուկներ:

Սա գրառում է Կոնթուրի ստենդի առաջադրանքների վերլուծությամբ իրենց տեքստի հեղինակից: Ո՞վ էր Հիդրայի վրա, սա ձեր պատճառն է հիշելու հաճելի փորձը, ով ոչ, ձեր ուղեղը ձգելու հնարավորություն մեծ Ո- նշում.

Անգամ կային մասնակիցներ, ովքեր ապամոնտաժեցին ֆլիպչարտը սլայդների՝ իրենց որոշումը գրելու համար: Չեմ կատակում, ստուգման համար հանձնեցին թղթի այս կույտը.

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Ընդհանուր առմամբ երեք առաջադրանք կար.

  • բեռի հավասարակշռման համար կշիռներով կրկնօրինակներ ընտրելու մասին
  • հարցումների արդյունքները հիշողության տվյալների բազայի հետ դասավորելու մասին
  • օղակաձեւ տոպոլոգիայով բաշխված համակարգում վիճակի փոխանցման մասին

Առաջադրանք 1. ClusterClient

Անհրաժեշտ էր առաջարկել բաշխված համակարգի N կշռված կրկնօրինակներից K-ի արդյունավետ ընտրության ալգորիթմ.

Ձեր թիմին հանձնարարված է մշակել հաճախորդի գրադարան N հանգույցների զանգվածային բաշխված կլաստերի համար: Գրադարանը կհետևեր հանգույցների հետ կապված տարբեր մետատվյալներին (օրինակ՝ դրանց ուշացումները, 4xx/5xx պատասխանների արագությունը և այլն) և նրանց կհատկացնի W1..WN լողացող կետի կշիռները: Համաժամանակյա կատարման ռազմավարությունն աջակցելու համար գրադարանը պետք է կարողանա պատահականորեն ընտրել N հանգույցներից K-ը՝ ընտրվելու հնարավորությունը պետք է համաչափ լինի հանգույցի քաշին:

Առաջարկեք ալգորիթմ՝ հանգույցներն արդյունավետ ընտրելու համար: Գնահատեք դրա հաշվողական բարդությունը՝ օգտագործելով մեծ O նշում:

Ինչու՞ ամեն ինչ անգլերեն է:

Որովհետև այս ձևով համաժողովի մասնակիցները կռվեցին նրանց հետ և որովհետև անգլերենը Հիդրայի պաշտոնական լեզուն էր: Առաջադրանքները այսպիսի տեսք ունեին.

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Վերցրեք թուղթ ու մատիտ, մտածեք, մի շտապեք անմիջապես սփոյլերներ բացել 🙂

Լուծման վերլուծություն (տեսանյութ)

5:53-ից սկսած, ընդամենը 4 րոպե.

Եվ ահա, թե ինչպես են ֆլիպչարտով տղաները ներկայացրել իրենց լուծումը.


Լուծման վերլուծություն (տեքստ)

Հետևյալ լուծումը գտնվում է մակերեսի վրա. գումարել բոլոր կրկնօրինակների կշիռները, ստեղծել պատահական թիվ 0-ից մինչև բոլոր կշիռների գումարը, այնուհետև ընտրել i-կրկնօրինակ, որպեսզի կրկնօրինակների կշիռների գումարը 0-ից մինչև (i-1)-րդն է: փոքր է պատահական թվից, իսկ կրկնօրինակների կշիռների գումարը 0-ից մինչև i-րդ՝ դրանից ավելի: Այսպիսով, հնարավոր կլինի ընտրել մեկ կրկնօրինակ, իսկ հաջորդը ընտրելու համար անհրաժեշտ է կրկնել ամբողջ պրոցեդուրան՝ առանց հաշվի առնելու ընտրված կրկնօրինակը: Նման ալգորիթմով մեկ կրկնօրինակի ընտրության բարդությունը O(N) է, K կրկնօրինակների ընտրության բարդությունը՝ O(N K) ~ O(N2):

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Քառակուսի բարդությունը վատ է, բայց այն կարելի է բարելավել: Դա անելու համար մենք կկառուցենք հատված ծառ կշիռների գումարների համար. Կստացվի lg N խորության ծառ, որի տերևներում կլինեն կրկնօրինակ կշիռներ, իսկ մնացած հանգույցներում՝ մասնակի գումարներ՝ մինչև ծառի արմատի բոլոր կշիռների գումարը։ Այնուհետև մենք ստեղծում ենք պատահական թիվ 0-ից մինչև բոլոր կշիռների գումարը, գտնում ենք i-րդ կրկնօրինակը, այն հեռացնում ծառից և կրկնում ենք մնացած կրկնօրինակները գտնելու ընթացակարգը: Այս ալգորիթմով ծառ կառուցելու բարդությունը O(N) է, i-րդ կրկնօրինակը գտնելու և ծառից հեռացնելու բարդությունը՝ O(lg N), K կրկնօրինակների ընտրության բարդությունը՝ O(N + K): lg N) ~ O(N lg N) .

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Գծային լոգարիթմական բարդությունն ավելի լավն է, քան քառակուսի բարդությունը, հատկապես մեծ Կ.

Այս ալգորիթմն է իրականացվում է կոդով ClusterClient գրադարաններ նախագծից »Արեւելք«. (Այնտեղ ծառը կառուցված է O(N lg N), բայց դա չի ազդում ալգորիթմի վերջնական բարդության վրա:)

Առաջադրանք 2. Զեբրա

Անհրաժեշտ էր առաջարկել հիշողության մեջ փաստաթղթերի արդյունավետ տեսակավորման ալգորիթմ ըստ կամայական ոչ ինդեքսավորված դաշտի.

Ձեր թիմին հանձնարարված է հիշողության մեջ բեկորային փաստաթղթերի տվյալների բազա մշակել: Ընդհանուր աշխատանքային ծանրաբեռնվածություն կլինի M չափսի հավաքածուից (սովորաբար N < 100 << M) կամայական (չինդեքսավորված) թվային դաշտով դասավորված վերին N փաստաթղթեր ընտրելը: Մի փոքր ավելի քիչ տարածված աշխատանքային ծանրաբեռնվածություն կլինի վերին N-ն ընտրելը վերին S փաստաթղթերը (S ~ N) բաց թողնելուց հետո:

Առաջարկեք ալգորիթմ՝ նման հարցումները արդյունավետ կերպով կատարելու համար: Գնահատեք դրա հաշվողական բարդությունը՝ օգտագործելով մեծ O նշում միջին դեպքում և վատագույն սցենարներում:

Լուծման վերլուծություն (տեսանյութ)

34:50-ից սկսած, ընդամենը 6 րոպե.


Լուծման վերլուծություն (տեքստ)

Մակերեւութային լուծում. տեսակավորել բոլոր փաստաթղթերը (օրինակ՝ հետ արագընթաց), ապա վերցրեք N+S փաստաթղթերը։ Այս դեպքում տեսակավորման բարդությունը միջինում O(M lg M), վատագույն դեպքում՝ O(M2):

Ակնհայտ է, որ բոլոր M փաստաթղթերի տեսակավորումը, իսկ հետո դրանց միայն մի փոքր մասը վերցնելն անարդյունավետ է։ Բոլոր փաստաթղթերը չտեսակավորելու համար հարմար է ալգորիթմը արագ ընտրություն, որը կընտրի ցանկալի փաստաթղթերի N + S (դրանք կարելի է տեսակավորել ցանկացած ալգորիթմով): Այս դեպքում բարդությունը միջինում կնվազի մինչև O(M), մինչդեռ ամենավատ դեպքը կմնա նույնը:

Այնուամենայնիվ, դուք կարող եք դա անել նույնիսկ ավելի արդյունավետ. օգտագործեք ալգորիթմը երկուական կույտային հոսք. Այս դեպքում առաջին N+S փաստաթղթերը ավելացվում են min- կամ max-heap-ին (կախված տեսակավորման ուղղությունից), այնուհետև յուրաքանչյուր հաջորդ փաստաթուղթ համեմատվում է ծառի արմատի հետ, որը պարունակում է ընթացիկ նվազագույն կամ առավելագույն փաստաթուղթը, և անհրաժեշտության դեպքում ավելացվում է ծառին։ Այս դեպքում բարդությունը վատագույն դեպքում, երբ պետք է անընդհատ վերակառուցել ծառը, O(M lg M) է, բարդությունը միջինում O(M), ինչպես արագ ընտրության դեպքում:

Այնուամենայնիվ, կույտային հոսքը պարզվում է, որ ավելի արդյունավետ է այն պատճառով, որ գործնականում փաստաթղթերի մեծ մասը կարող է հեռացվել առանց կույտը վերակառուցելու՝ դրա արմատային տարրի հետ մեկ համեմատությունից հետո: Նման տեսակավորումն իրականացվում է Zebra-ի հիշողության մեջ գտնվող փաստաթղթերի տվյալների բազայում, որը մշակվել և օգտագործվում է Kontur-ում:

Առաջադրանք 3. Պետական ​​սվոպներ

Անհրաժեշտ էր առաջարկել վիճակների փոփոխման ամենաարդյունավետ ալգորիթմը.

Ձեր թիմին հանձնարարված է մշակել շքեղ վիճակի փոխանակման մեխանիզմ N հանգույցների բաշխված կլաստերի համար: i-րդ ​​հանգույցի վիճակը պետք է փոխանցվի (i+1)-րդ հանգույցին, N-րդ հանգույցի վիճակը՝ առաջին հանգույցին։ Միակ աջակցվող գործողությունը վիճակի փոխանակումն է, երբ երկու հանգույցները փոխանակում են իրենց վիճակները ատոմային եղանակով: Հայտնի է, որ պետական ​​սվոպը տևում է M միլիվայրկյան։ Յուրաքանչյուր հանգույց կարող է ցանկացած պահի մասնակցել մեկ վիճակի փոխանակմանը:

Որքա՞ն ժամանակ է պահանջվում կլաստերի բոլոր հանգույցների վիճակները փոխանցելու համար:

Լուծման վերլուծություն (տեքստ)

Մակերեւութային լուծում՝ փոխանակեք առաջին և երկրորդ տարրի վիճակները, այնուհետև առաջինը և երրորդը, ապա առաջինը և չորրորդը և այլն: Յուրաքանչյուր փոխանակումից հետո մեկ տարրի վիճակը կլինի ցանկալի դիրքում: Դուք պետք է կատարեք O(N) փոխարկումներ և ծախսեք O(N M) ժամանակ:

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Գծային ժամանակը երկար է, այնպես որ դուք կարող եք փոխանակել տարրերի վիճակները զույգերով՝ առաջինը երկրորդի հետ, երրորդը՝ չորրորդի հետ և այլն։ Յուրաքանչյուր պետական ​​փոխանակումից հետո յուրաքանչյուր երկրորդ տարրը ճիշտ դիրքում կլինի։ Դուք պետք է կատարեք O(lg N) փոխարկումներ և ծախսեք O(M lg N) ժամանակ:

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Այնուամենայնիվ, հնարավոր է հերթափոխն էլ ավելի արդյունավետ դարձնել՝ ոչ թե գծային, այլ մշտական ​​ժամանակում։ Դա անելու համար առաջին քայլին անհրաժեշտ է փոխանակել առաջին տարրի վիճակը վերջինի հետ, երկրորդը՝ նախավերջինի հետ և այլն։ Վերջին տարրի վիճակը կլինի ճիշտ դիրքում: Իսկ հիմա պետք է երկրորդ տարրի վիճակը փոխանակենք վերջինի հետ, երրորդը՝ նախավերջինի հետ և այլն։ Փոխանակումների այս փուլից հետո բոլոր տարրերի պետությունները ճիշտ դիրքերում կլինեն։ Ընդհանուր առմամբ կլինեն O(2M) ~ O(1) փոխարկումներ:

Hydra կոնֆերանսի առաջադրանքների վերլուծություն՝ բեռի հավասարակշռում և հիշողության մեջ պահում

Նման լուծումը բոլորովին չի զարմացնի մաթեմատիկոսին, ով դեռ հիշում է, որ պտույտը երկու առանցքային համաչափությունների բաղադրություն է։ Ի դեպ, այն տրիվիալ կերպով ընդհանրացվում է տեղաշարժի համար ոչ թե մեկ, այլ K < N դիրքերով։ (Գրեք մեկնաբանություններում, թե կոնկրետ ինչպես):

Ձեզ դուր եկավ հանելուկներ: Գիտե՞ք այլ լուծումներ։ Կիսվեք մեկնաբանություններում։

Եվ վերջում ահա մի քանի օգտակար հղումներ.

Source: www.habr.com

Добавить комментарий