If you're seeing this message, it means we're having trouble loading external resources on our website.

Եթե գտնվում ես վեբ զտիչի հետևում, խնդրում ենք համոզվել, որ *.kastatic.org և *.kasandbox.org տիրույթները հանված են արգելափակումից։

Հիմնական նյութ

Լայնությամբ որոնման ալգորիթմը

Լայնությամբ որոնումը յուրաքանչյուր գագաթ v-ին տալիս է երկու արժեք․
  • Հեռավորություն՝ տալով կողերի նվազագույն քանակը սկզբնական գագաթից դեպի v-ն հասնելու համար։
  • Նախորդ գագաթ և սկզբնական գագաթից ամենակարճ ճանապարհը։ Սկզբնական գագաթի նախորդը null է, այսինքն՝ սկզբնական գագաթը նախորդ չունի։
Եթե սկզբնական գագաթից դեպի v գագաթը ճանապարհ չկա, ապա v-ի հեռավորությունն անվերջ է, և իր նախորդն ունի նույնքան հատուկ արժեք, որքան սկզբնականի նախորդը։
Օրինակ՝ ահա ուղղություն չունեցող գրաֆիկ, որն ունի ութ գագաթ՝ համարակալված 0-ից 7, որոնք գագաթների վերևում կամ ներքևում են։ Գագաթներից յուրաքանչյուրի ներսում գրված է երկու թիվ՝ հեռավորությունն առաջնային գագաթից, որը գագաթ 3-ն է, և այն նախորդ գագաթի համարը, որով ամենակարճ ճանապարհն է դեպի առաջնային գագաթը՝ 3\ -ը։ Գիծը null արժեքն է․
Լայնությամբ որոնման ժամանակ մենք սկզբում բոլոր գագաթների հեռավորությանն ու նախորդին վերագրում ենք null։ Որոնումը սկսում ենք առաջնային գագաթից ու հեռավորությունը նշանակում 0։ Հետո անցնում ենք դրա բոլոր հարևանների մոտ և ամեն հարևանի հեռավորությունը նշանակում 1, իսկ նախորդը՝ առաջնային գագաթ։ Հետո անցնում ենք 1 հեռավորություն ունեցող և դեռ չայցելած գագաթների հարևանների մոտ և այդ գագաթների հեռավորությունը նշանակում 2, իսկ նախորդը՝ այն գագաթը, որից այցելել ենք այդտեղ։ Այդպես շարունակում ենք, մինչև այցելենք բոլոր գագաթները, և դրանք հասանելի կլինեն սկզբնական գագաթից՝ միշտ այցելելով k հեռավորությամբ գագաթը k+1-ն այցելելուց առաջ։
Արի քայլ առ քայլ անցնենք վերևի օրինակով, իսկ հետո նայենք դրա պատկերավոր տեսքը․
  • Սկզբում այցելիր գագաթ 3՝ սկզբնական գագաթը, հեռավորությունը դիր 0։
  • Հետո այցելիր 2 ու 6 գագաթները, հեռավորությունները դիր 1 ու նախորդը նշանակիր գագաթ 3։
  • Այցելիր 1 հեռավորությամբ գագաթները, սկզբում՝ գագաթ 2-ը։ Գագաթ 2-ից այցելիր 4 ու 5 գագաթներ, դրանց հեռավորությունը դիր 2, իսկ նախորդը՝ գագաթ 2։ Մի այցելիր գագաթ 3, քանի որ այդտեղ արդեն այցելել ես։
  • Գագաթ 6-ից մի այցելիր գագաթ 5, քանի որ այդտեղ գագաթ 2-ից արդեն այցելել ես, և մի այցելիր գագաթ 3։
  • Հիմա սկսում ենք այցելել 2 հեռավորության գագաթներ։ Սկսիր գագաթ 4-ից։ Գագաթ 2 արդեն այցելել ես։ Այցելիր գագաթ 1, հեռավորությունը դիր 3, իսկ նախորդը՝ գագաթ 4։
  • Գագաթ 5-ից մի այցելիր որևէ հարևանի մոտ, քանի որ դրանք արդեն այցելել ես։
  • Հիմա սկսիր այցելել բոլոր 3 հեռավորություններով գագաթները։ Այդպիսի գագաթ միայն գագաթ 1-ն է։ Դրա հարևաններ՝ 4 ու 5, արդեն այցելել ես, բայց 0 գագաթ՝ դեռ ոչ։ Այցելիր գագաթ 0, հեռավորությունը դիր 4, իսկ դրա նախորդ՝ գագաթ 1։
  • Հիմա սկսիր այցելել բոլոր 4 հեռավորություններով գագաթները։ Դա միայն 0-ն ու իր հարևան 1-ն են, որոնք արդեն այցելել ես։ Վերջացրինք։
Ուշադրություն դարձրու, որ գագաթ 3-ից դեպի գագաթ 7-ը ճանապարհ չկա, և որոնումը երբեք չի այցելում գագաթ 7։ Հետևաբար, այդ գագաթի հեռավորության ու նախորդի null արժեքները մնում են անփոփոխ։
Մի քանի հարց է առաջանում։ Նախ՝ ինչպես հասկանալ, թե գագաթն արդեն այցելել ենք, թե ոչ։ Սա հեշտ է․ եթե գագաթի հեռավորությունը null է, ապա այն դեռ չենք այցելել։ Հետևաբար, երբ ստուգում ենք գագաթի հարևանները, այցելում ենք միայն այն հարևաններ, որոնց հեռավորությունն այդ պահին null է։
Մյուս հարցն է՝ ինչպես հաշվել, թե որ գագաթներն ենք արդեն այցելել։ Օգտագործում ենք հերթականություն. դա տվյալների կառուցվածք է, որը թույլատրում է ավելացնել և ջնջել տարրեր, որտեղ ջնջված տարրն այդտեղ ամենաերկար մնացած տարրն է։ Այս օրինաչափությունն անվանում ենք առաջինը ներս, առաջինը դուրս։ Հերթականությունն ունի երեք գործողություն․
  • enqueue(obj)-ը ներմուծում է օբյեկտը հերթականության մեջ։
  • dequeue()-ը հերթականության միջից հանում է ամենահին օբյեկտն ու վերադարձնում է այն:
  • isEmpty()-ն վերադարձնում է true, եթե հերթականությունը դատարկ է, և false, եթե հերթականությունն ունի առնվազն մեկ օբյեկտ։
Գագաթն այցելելիս այն ներմուծում ենք հերթականության մեջ։ Սկզբում ներմուծում ենք առաջնային գագաթը, քանի որ այն մեր այցելած առաջին գագաթն է լինելու։ Որոշելու համար, թե հաջորդը որ գագաթն ենք այցելում, ընտրում ենք հերթականության մեջ ամենաերկարը մնացած օբյեկտն ու հանում ենք հերթականության միջից․ այլ կերպ ասած՝ օգտագործում ենք dequeue()-ով վերադարձրած գագաթը։ Մեր գրաֆի օրինակում այսպիսի տեսքի կլինի հերթականությունը յուրաքանչյուր քայլին, նաև նորից կտեսնես այդ քայլերը պատկերավոր տեսքով․
  • Սկզբում հերթականության մեջ կա միայն գագաթ 3-ը՝ 0 հեռավորությամբ։
  • Հերթականության միջից հանիր գագաթ 3-ն ու ներմուծիր 2 և 6 գագաթները՝ երկուսն էլ 1\ հեռավորությամբ։ Հերթականության մեջ հիմա կան գագաթ 2-ը՝ 1 հեռավորությամբ, ու գագաթ 6-ը՝ 1 հեռավորությամբ։
  • Հանիր գագաթ 2-ն ու ներմուծիր 4 ու 5 գագաթները՝ երկուսն էլ 2\ հեռավորությամբ։ Հերթականության մեջ հիմա կան գագաթ 6-ը՝ 1 հեռավորությամբ, գագաթ 4-ը՝ 2 հեռավորությամբ և գագաթ 5-ը՝ 2 հեռավորությամբ։
  • Հանիր գագաթ 6-ն ու մի ներմուծիր որևէ գագաթ։ Հերթականության մեջ հիմա կան գագաթ 4-ը՝ 2 հեռավորությամբ, և գագաթ 5-ը՝ 2 հեռավորությամբ։
  • Հանիր գագաթ 4-ն ու ներմուծիր գագաթ 1-ը՝ 3 հեռավորությամբ։ Հերթականության մեջ հիմա կան գագաթ 5-ը՝ 2 հեռավորությամբ, և գագաթ 1-ը՝ 3 հեռավորությամբ։
  • Հանիր գագաթ 5-ն ու մի ներմուծիր որևէ գագաթ։ Հերթականության մեջ հիմա կա գագաթ 1-ը՝ 3 հեռավորությամբ։
  • Հանիր գագաթ 1-ն ու ներմուծիր գագաթ 0-ն՝ 4\ հեռավորությամբ։ Հերթականության մեջ հիմա կա գագաթ 0-ն՝ 4 հեռավորությամբ։
  • Հանիր գագաթ 0-ն ու մի ներմուծիր որևէ գագաթ։ Հերթականությունը դատարկ է։ Քանի որ հերթականությունը դատարկ է, ալգորիթմի գործն ավարտվում է։
Ուշադրություն դարձրու, որ ամեն քայլին հերթականության մեջ կան կամ բոլորը նույն հեռավորությամբ գագաթներ, կամ k հեռավորությամբ գագաթներ, որոնց հաջորդում են k+1 հեռավորությամբ գագաթները։ Այդպես ենք մենք համոզվում, որ այցելել ենք բոլոր k հեռավորությամբ գագաթները, մինչև կանցնենք k+1-ներին։

Նյութը ստեղծվել է Դարթմութի համակարգչային գիտությունների դասախոսներ Թոմաս Քորմենի և Դեվին Բալկքոմի, ինչպես նաև «Քան» ակադեմիայի ծրագրավորման թիմի կողմից։ Նյութը լիցենզավորվել է CC-BY-NC-SA-ի կողմից։

Ուզո՞ւմ ես միանալ խոսակցությանը։

Առայժմ հրապարակումներ չկան։
Անգլերեն հասկանո՞ւմ ես: Սեղմիր այստեղ և ավելի շատ քննարկումներ կգտնես «Քան» ակադեմիայի անգլերեն կայքում: