Տվյալների կառուցվածքներ

Համակարգչային գիտության մեջ **տվյալների կառուցվածքը** տվյալների կազմակերպման և պահպանման ձևաչափ է, որը սովորաբար ընտրվում է տվյալների արդյունավետ հասանելիության համար։ Ավելի ճիշտ, տվյալների կառուցվածքը տվյալների արժեքների, դրանց միջև փոխհարաբերությունների և գործառույթների կամ գործողությունների հավաքածու է, որը կարող է կիրառվել տվյալների վրա, այսինքն՝ այն տվյալների վերաբերյալ հանրահաշվական կառուցվածք է:

## Կիրառություն
Տվյալների կառուցվածքները ծառայում են որպես վերացական(աբստրակտ) տվյալների տեսակների (ADT) հիմք: ADT-ն սահմանում է տվյալների տեսակի տրամաբանական ձևը: Տվյալների կառուցվածքը իրականացնում է տվյալների տեսակի ֆիզիկական ձևը։

Տվյալների կառուցվածքների տարբեր տեսակներ հարմար են տարբեր տեսակի հավելվածների համար, իսկ որոշները խիստ մասնագիտացված են կոնկրետ խնդիրներ լուծելու համար: Օրինակ, ռելյացիոն տվյալների բազաները սովորաբար օգտագործում են B-tree ինդեքսներ՝ տվյալներ փնտրելու համար, մինչդեռ կոմպիլյատորների իրականացումների մեջ սովորաբար օգտագործում են հեշ աղյուսակներ՝ իդենտիֆիկատորներ փնտրելու համար:

Տվյալների կառուցվածքները թույլ են տալիս արդյունավետ կառավարել մեծ ծավալի տվյալների այնպիսի ծրագրեր, ինչպիսիք են տվյալների բազաները և ինտերնետի ինդեքսավորման ծառայությունները: Որպես կանոն, արդյունավետ տվյալների կառուցվածքները արդյունավետ ալգորիթմների նախագծման բանալին են: Որոշ ֆորմալ նախագծման մեթոդներ և ծրագրավորման լեզուներ կարևորում են տվյալների կառուցվածքները, այլ ոչ թե ալգորիթմները՝ որպես ծրագրային ապահովման մշակման հիմնական գործոն: Տվյալների կառուցվածքները կարող են օգտագործվել ինչպես հիմնական, այնպես էլ երկրորդային հիշողության մեջ պահվող տեղեկատվության պահպանման և որոնման կազմակերպման համար:

## Իրականացում
Տվյալների կառուցվածքները կարող են իրականացվել տարբեր ծրագրավորման լեզուների միջոցով, սակայն դրանք բոլորն ունեն տվյալների արդյունավետ կազմակերպման և պահպանման ընդհանուր նպատակ: Տվյալների կառուցվածքները սովորաբար հենվում են համակարգչի՝ իր հիշողության մեջ տվյալներ ստանալու և պահելու ունակության վրա, որը նշված է ցուցիչով՝ բիթային տող, որը ներկայացնում է հիշողության հասցե, որն ինքնին կարող է պահվել հիշողության մեջ և կառավարվել ծրագրի կողմից: Այսպիսով, զանգվածի և գչառման տվյալների կառուցվածքները հիմնված են տվյալների տարրերի հասցեների հաշվարկման վրա՝ օգտագործելով թվաբանական գործողությունները, մինչդեռ հարակից տվյալների կառուցվածքները հիմնված են տվյալների տարրերի հասցեները հենց կառուցվածքում պահելու վրա: Տվյալների կառուցվածքի այս մոտեցումը խորը հետևանքներ ունի ալգորիթմների արդյունավետության և մասշտաբայնության վրա: Օրինակ, զանգվածներում հարակից հիշողության բաշխումը հեշտացնում է արագ մուտքի և փոփոխման գործողությունները, ինչը հանգեցնում է օպտիմիզացված  հաջորդական մշակմանը:
մինի|326x326փքս|Հերթի և պահունակի տարբերությունը
Տվյալների կառուցվածքի ներդրումը սովորաբար պահանջում է գրել  մի շարք պրոցեդուրաներ, որոնք ստեղծում և շահարկում են այդ կառուցվածքի օրինակները: Տվյալների կառուցվածքի արդյունավետությունը չի կարող վերլուծվել այս գործողություններից առանձին: Այս դիտարկումը դրդում է վերացական տվյալների տիպի տեսական հայեցակարգը՝ տվյալների կառուցվածք, որն անուղղակիորեն որոշվում է դրա վրա կատարվող գործողություններով և այդ գործողությունների մաթեմատիկական հատկություններով (ներառյալ դրանց տարածական և ժամանակային ծախսերը):

## Օրինակներ
Կան բազմաթիվ տեսակի տվյալների կառուցվածքներ, որոնք սովորաբար կառուցված են ավելի պարզ տվյալների տեսակների վրա: Հայտնի օրինակներն են՝
* Զանգվածը որոշակի կարգով դասավորված մի քանի տարրեր է՝ սովորաբար նույն տեսակի (կախված լեզվից, առանձին տարրեր կարող են ստիպել լինել նույն տիպի, կամ կարող են լինել գրեթե ցանկացած տեսակի)։ Տարրերը հասանելի են՝ օգտագործելով ամբողջ թվի ինդեքսը, որը ցույց է տալիս, թե որ տարրն է պահանջվում:Զանգվածները կարող են լինել ֆիքսված երկարությամբ կամ փոխվող երկարությամբ:
*Կապակցված ցուցակը (նաև կոչվում է պարզապես ցուցակ) ցանկացած տեսակի տվյալների տարրերի գծային հավաքածու է, այդ հավաքածուի տարրերը կոչվում է հանգույցներ, որտեղ յուրաքանչյուր հանգույց ունի արժեք և հղում որը ցույց է տալիս հաջորդ հանգույցը: Կապակցված ցուցակի հիմնական առավելությունը զանգվածի նկատմամբ այն է, որ արժեքները միշտ կարող են արդյունավետ կերպով տեղադրվել և հեռացվել՝ առանց ցուցակի մնացած մասը տեղափոխելու: Այնուամենայնիվ, որոշ այլ գործողություններ, ինչպիսիք են կոնկրետ տարրի պատահական մուտքը, ավելի դանդաղ են ընթանում ցուցակներում, քան զանգվածներում:
* Հեշ աղյուսակները, որոնք նաև հայտնի են որպես հեշ քարտեզներ, տվյալների կառուցվածքներ են, որոնք ապահովում են արժեքների արագ որոնում՝ հիմնված բանալիների վրա: Նրանք օգտագործում են հեշավորման ֆունկցիա՝ բանալիները զանգվածի ինդեքսներին համապատասխանեցնելու համար: Հեշ աղյուսակները լայնորեն օգտագործվում են բառարաններում, քեշերում և տվյալների բազայի ինդեքսավորման մեջ: Այնուամենայնիվ, հեշ աղյուսակների հետ աշխատելիս կարող են առաջանալ բախումներ, ինչը բացասաբար է անդրադառնում դրանց աշխատանքի վրա: Բախումների դեմ պայքարելու համար օգտագործվում են այնպիսի մեթոդներ, ինչպիսիք են շղթայական կապը և բաց հասցեավորումը:
* Գրաֆները հանգույցների շարք են, որոնք միացված են կողերով, որոնք ներկայացնում են հարաբերությունները սուբյեկտների միջև: Գրաֆները կարող են օգտագործվել սոցիալական ցանցերի, համակարգչային ցանցերի, տրանսպորտային ցանցերի և այլն մոդելավորելու համար: Դրանք բաղկացած են գագաթներից (հանգույցներից) և կողերից(հանգույցների միջև կապեր): Գրաֆները կարող են լինել ուղղորդված կամ չուղղորդված, ունենալ ցիկլեր կամ լինել ացիկլիկ: Գրաֆի անցման ալգորիթմները ներառում են որոնում լայնությամբ և որոնում խորությամբ:
* Պահունակը և հերթերը տվյալների վերացական տեսակներ են, որոնք կարող են իրականացվել զանգվածների կամ կապակցված ցուցակների միջոցով: Պահունակն ունի երկու հիմնական գործողություն՝ push (ավելացնում է տարր կույտի վերին մասում) և pop (հեռացնում է ամենավերին տարրը կույտից), որոնք հետևում են Last In, First Out (LIFO) սկզբունքին: Հերթերն ունեն երկու հիմնական գործողություն՝ հերթում (հերթի վերջում տարր է ավելացնում) և հերթում (հերթի առջևից հեռացնում է տարրը), որոնք հետևում են First In, First Out (FIFO) սկզբունքին:.
* Ծառերը ներկայացնում են տարրերի հիերարխիկ դասավորվածություն: Ծառը բաղկացած է կողերով միացված հանգույցներից, որոնցից մեկը արմատն է, իսկ մյուս բոլոր հանգույցները՝ ենթածառեր: Ծառերը լայնորեն օգտագործվում են տարբեր ալգորիթմների և տվյալների պահպանման համար: Բինար ծառերը (մասնավորապես՝ կույտերը), AVL ծառերը և B-ծառերը ծառերի որոշ հայտնի տեսակներ են: Դրանք ապահովում են տվյալների արդյունավետ և օպտիմալ որոնում, տեսակավորում և հիերարխիկ ներկայացում:

## Ծրագրավորման լեզվի կողմից աջակցություն
Ասսեմբլերային լեզուների մեծ մասը և որոշ ցածր մակարդակի լեզուներ, ինչպիսիք են BCPL-ը, չունեն տվյալների կառուցվածքների ներկառուցված աջակցություն: Մյուս կողմից, շատ բարձր մակարդակի ծրագրավորման լեզուներ և որոշ ավելի բարձր մակարդակի ասսեմբլերի լեզուներ, ինչպիսիք են MASM-ը, ունեն հատուկ շարահյուսություն կամ այլ ներկառուցված աջակցություն որոշակի տվյալների կառուցվածքների համար, ինչպիսիք են զանգվածները: Օրինակ, C (BCPL-ի անմիջական ժառանգորդը) և Պասկալ լեզուները համապատասխանաբար աջակցում են կառուցվածքներին, բացի վեկտորներից (միաչափ զանգվածներ) և բազմաչափ զանգվածներից։

Ծրագրավորման լեզուներից շատերն ունեն գրադարանային մեխանիզմ, որը թույլ է տալիս տվյալների կառուցվածքի իրականացումը վերօգտագործել տարբեր ծրագրերի կողմից: Ժամանակակից լեզուները սովորաբար ունեն ստանդարտ գրադարաններ, որոնք իրականացնում են տվյալների ամենատարածված կառուցվածքները: Օրինակներ են C++ Ստանդարտ Կաղապարների գրադարանը(STL), Java Collections Framework-ը և Microsoft .NET Framework-ը:

Ժամանակակից լեզուները նաև ընդհանուր առմամբ աջակցում են մոդուլային ծրագրավորմանը՝ գրադարանային մոդուլի միջերեսի և դրա իրականացման միջև բաժանումը: Ոմանք տրամադրում են տվյալների անթափանց տեսակներ, որոնք թույլ են տալիս հաճախորդներին թաքցնել իրականացման մանրամասները: Օբյեկտ-կողմնորոշված ​​ծրագրավորման լեզուները, ինչպիսիք են C++-ը, Java-ն և Smalltalk-ը, սովորաբար օգտագործում են դասեր այդ նպատակով:

Շատ հայտնի տվյալների կառուցվածքներ ունեն զուգահեռ տարբերակներ, որոնք թույլ են տալիս մի քանի հաշվողական հոսքերին միաժամանակ հասանելություն ունենալ տվյալների կառուցվածքի մեկ կոնկրետ օրինակին։

## Ծանոթագրություններ

## Գրականություն
* Peter Brass, *Advanced Data Structures*, Cambridge University Press, 2008, 
* Donald Knuth, *[[The Art of Computer Programming]]*, vol. 1. Addison-Wesley, 3rd edition, 1997, 
* Dinesh Mehta and Sartaj Sahni, *Handbook of Data Structures and Applications*, Chapman and Hall/CRC Press, 2004, 
* Niklaus Wirth, *Algorithms and Data Structures*, Prentice Hall, 1985, 

## Հետագա ընթերցման համար
* Open Data Structures by Pat Morin
* G. H. Gonnet and R. Baeza-Yates, *[https://users.dcc.uchile.cl/~rbaeza/handbook/hbook.html Handbook of Algorithms and Data Structures - in Pascal and C]*, second edition, Addison-Wesley, 1991, 
* Ellis Horowitz and Sartaj Sahni, *Fundamentals of Data Structures in Pascal*, Computer Science Press, 1984, 

## Արտաքին հղումներ
* Dictionary of Algorithms and Data Structures
* Data structures course
* [An Examination of Data Structures from .NET perspective](http://msdn.microsoft.com/en-us/library/aa289148(VS.71).aspx)
* Schaffer, C. ''Data Structures and Algorithm Analysis''

Կատեգորիա:Ծրագրավորում
Կատեգորիա:Տվյալների կառուցվածքներ