Հիմնական նյութ
Գրաֆիկների ներկայացում
Գրաֆիկները ներկայացնելու տարբեր եղանակներ կան՝ յուրաքանչյուրն իր լավ և վատ կողմերով։ Տարբեր իրավիճակներում կամ ալգորիթմներում, որտեղ գրաֆիկներն օգտագործում ենք որպես մուտքագրված արժեք, կարող ենք ստանալ տարբեր՝ լավ կամ վատ, օգտակար կամ անօգտակար արդյունքներ։ Այստեղ կտեսնենք գրաֆիկները ներկայացնելու երեք եղանակ։
Կկենտրոնանանք երեք չափանիշների վրա։ Առաջինն այն է, թե որքան հիշողություն է զբաղեցնում գրաֆը։ Դրա համար կօգտագործենք ասիմպտոտային նշագրում։ Այո, մենք կարող ենք ասիմպտոտային նշագրումը, աշխատելու ժամանակներ հաշվելուց բացի, այլ տեղերում էլ օգտագործել։ Դա ֆունկցիաները բնութագրելու լավ եղանակ է, իսկ ֆունկցիան իր հերթին կարող է բնութագրել աշխատելու ժամանակը, պահանջվող հիշողության քանակը և այլն։ Մյուս երկու չափանիշները կապված են ժամանակի հետ։ Մեկը՝ թե որքան ժամանակ է պետք հասկանալու համար՝ կողը գրաֆիկում է, թե ոչ։ Իսկ մյուսը՝ թե որքան ժամանակում կգտնենք գագաթի հարևաններին։
Տարածված է գագաթները գտնել ոչ թե անունով (Օդրի, Բոսթոն կամ սվիտեր), այլ թվով։ Այսինքն՝ մենք համարակալում ենք գագաթները 0-ից ։ Ահա սոցիալական ցանցն իր 10 գագաթներով, որոնց մեջ անունների փոխարեն գրված են թվեր․
Կողերի ցուցակներ
[ [0{,}1], [0,6], [0,8], [1,4], [1,6], [1,9], [2,4], [2,6], [3,4], [3,5],
[3,8], [4,5], [4,9], [7,8], [7,9] ]
Կողերի ցուցակները պարզ են, բայց եթե ուզում ենք գտնել, թե արդյոք գրաֆիկն ունի ինչ-որ կող, պետք է անցնենք կողերի վրայով, որ գտնենք այն։ Եթե կողերը ցուցակում դասավորված չեն, կատարում ենք գծային որոնում կողի վրայով։ Մտածելու հարց: Ինչպե՞ս կարող ես դասավորել կողերի ցուցակը, որպեսզի ինչ-որ կողը գտնելու ժամանակը լինի ։ Պատասխանը մի փոքր շփոթեցնող է։
Կցման մատրիցներ
null
, որը ցույց է տալիս, որ այդ կողը գոյություն չունի։ Ահա սոցիալական ցանցի գրաֆիկի կցման մատրիցը․JavaScript-ում մատրիցը ներկայացնում ենք այսպես՝
[ [0, 1, 0, 0, 0, 0, 1, 0, 1, 0],
[1, 0, 0, 0, 1, 0, 1, 0, 0, 1],
[0, 0, 0, 0, 1, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 0, 0, 1, 0],
[0, 1, 1, 1, 0, 1, 0, 0, 0, 1],
[0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 1, 1],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 0],
[0, 1, 0, 0, 1, 0, 0, 1, 0, 0] ]
Կցման մատրիցով կարող ենք հաստատուն ժամանակում գտնել՝ արդյոք կողը գոյություն ունի, թե ոչ՝ ուղղակի ստուգելով մատրիցի համապատասխան վանդակում գրված թիվը։ Օրինակ, եթե կցման մատրիցի անունը կողը գրաֆում է, թե ոչ՝ սուգելով տեղ, նույնիսկ երբ գրաֆը նոսր է․ ունի քիչ կողեր։ Այլ կերպ ասած՝ նոսր գրաֆի դեպքում ուղղակի 0-ներն են շատ, և մենք օգտագործում ենք շատ տեղ, որպեսզի ներկայացնենք քիչ կողեր։ Երկրորդը՝ եթե ուզում ես գտնել, թե որ գագաթներն են գագաթին կից, պետք է անցնես տողի բոլոր վանդակների վրայով, նույնիսկ եթե քիչ քանակությամբ գագաթներ են գագաթին կից։
graph
է, ապա կարող ենք հարցում կատարել, թե արդյոք graph[i][j]
-ը։ Ուրեմն ի՞նչն է կցման մատրիցի վատ կողմը։ Երկու վատ կողմ կա իրականում։ Առաջինը՝ այն զբաղեցնում է Ուղղություն չունեցող գրաֆում կցման մատրիցը սիմետրիկ է․ եթե -երորդ տողի -երորդ սյան վանդակը 1 է, ապա -երորդ տողի -երորդ սյան վանդակը նույնպես 1\ է։ Ուղղություն ունեցող գրաֆում այն սիմետրիկ չէ։
Կցման ցուցակներ
Գրաֆը կցման ցուցակներով ներկայացնելը միավորում է կցման մատրիցները կողերի ցուցակների հետ։ Ամեն գագաթի համար պահեստավորիր դրան կից գագաթների զանգվածը։ Մենք ունենք կցման ցուցակների զանգված՝ ամեն գագաթի համար մեկ կցման ցուցակ։ Ահա սոցիալական ցանցի գրաֆիկի կցման ցուցակի տեսքը․
JavaScript-ում այս կցման ցուցակները ներկայացնում ենք այսպես՝
[ [1, 6, 8],
[0, 4, 6, 9],
[4, 6],
[4, 5, 8],
[1, 2, 3, 5, 9],
[3, 4],
[0, 1, 2],
[8, 9],
[0, 3, 7],
[1, 4, 7] ]
Պարտադիր չէ, որ գագաթների թվերը կցման ցուցակում լինեն ինչ-որ հերթականությամբ, բայց լավ է դրանք աճման կարգով դասավորելը, ինչպես ցույց է տրված այս օրինակում։
Կարող ենք ամեն գագաթի կցման ցուցակը գտնել հաստատուն ժամանակում, քանի որ պետք է միայն գտնել ցուցիչը։ Գտնելու համար, թե արդյոք գագաթը կա գրաֆիկում, հաստատուն ժամանակում գտնում ենք -ի կցման ցուցակն ու փնտրում -ն -ի կցման ցուցակում։ Որքա՞ն կլինի սա գտնելու վատագույն ժամանակը։ Պատասխանն է՝ , որտեղ -ն գագաթի աստիճանն է, քանի որ այդքան է -ի կցման ցուցակի երկարությունը։ գագաթի աստիճանը կարող է լինել ընդհուպ մինչև (եթե -ն կից է բոլոր մյուս գագաթներին) կամ 0 (եթե -ն չունի կից գագաթներ)։ Ուղղություն չունեցող գրաֆում, եթե գագաթը -ի կցման ցուցակում է, ապա գագաթը -ի կցման ցուցակում է։ Եթե գրաֆը կշիռ ունեցող է, ապա յուրաքանչյուր կցման ցուցակի ամեն մի տարրը պետք է լինի կամ երկանդամ զանգված, կամ օբյեկտ, որը գագաթին տալիս է գագաթի թիվ ու կողի կշիռ։
for ցիկլով կարող ես անցնել կցման ցուցակի գագաթների վրայով։ Օրինակ՝ պատկերացրու՝ ունես կցման ցուցակի տեսքով ֆունկցիա՝ վերագրված գագաթի հարևան գագաթներն են։ Հետո կանչում ենք -ին կից բոլոր գագաթների վրա։ Կարող ես օգտագործել այս JavaScript կոդը․
graph
փոփոխականով, հետևաբար graph[i]
-ը զանգված է, որտեղ doStuff
ֆունկցիան for (var j = 0; j < graph[i].length; j++) {
doStuff(graph[i][j]);
}
Եթե երկփակագիծ նշագրումը շփոթեցնում է, կարող ես կոդն այսպես գրել՝
var vertex = graph[i];
for (var j = 0; j < vertex.length; j++) {
doStuff(vertex[j]);
}
Որքա՞ն տեղ են զբաղեցնում կցման ցուցակները։ Ունենք ցուցակ, և չնայած որ յուրաքանչյուր ցուցակը կարող է ունենալ ընդհուպ մինչև գագաթ, ուղղություն չունեցող գրաֆի կցման ցուցակներն ընդհանուր պարունակում են տարր։ Ինչո՞ւ ։ Ամեն կողը կցման ցուցակներում հայտնվում է երկու անգամ՝ մեկ անգամ -ի ցուցակում և մեկ անգամ -ի ցուցակում, իսկ կողերի քանակը է։ Ուղղություն ունեցող գրաֆում կցման ցուցակներն ունեն ընդհանուր տարր՝ յուրաքանչյուր կողի համար մեկ հատ։
Նյութը ստեղծվել է Դարթմութի համակարգչային գիտությունների դասախոսներ Թոմաս Քորմենի և Դեվին Բալկքոմի, ինչպես նաև «Քան» ակադեմիայի ծրագրավորման թիմի կողմից։ Նյութը լիցենզավորվել է CC-BY-NC-SA-ի կողմից։
Ուզո՞ւմ ես միանալ խոսակցությանը։
Առայժմ հրապարակումներ չկան։