Кіріспе
Деректерді компьютерде сақтау және ұйымдастырудың ерекше тәсілі. Wikipedia-дағы деректер құрылымы туралы ақпарат. Компьютерлік ғылымда деректер құрылымы – деректерді ұйымдастырудың және әдетте деректерге тиімді қол жеткізу үшін таңдалатын сақтау форматы. Нақтырақ айтқанда, деректер құрылымы – деректер мәндерінің жиынтығы, олардың арасындағы байланыстар және деректерге қолданылатын функциялар немесе амалдар, яғни бұл деректерге қатысты алгебралық құрылым.
information on Wikipedia's data structure
In computer science, a data structure is a data organization, and storage format that is usually chosen for efficient access to data. More precisely, a data structure is a collection of data values, the relationships among them, and the functions or operations that can be applied to the data, i. e., it is an algebraic structure about data.
Қолданылуы
Деректер құрылымдары абстрактілі деректер түрлерінің (ADT) негізі болып табылады. ADT деректер түрінің логикалық формасын анықтайды. Деректер құрылымы деректер түрінің физикалық формасын іске асырады. Деректер құрылымдарының әртүрлі түрлері әртүрлі қолданбаларға сай келеді, ал кейбіреулері нақты белгілі бір міндеттерге арналған. Мысалы, реляциялық деректер базалары деректерді іздеу үшін көбінесе B-ағаш индекстерін пайдаланады, ал компиляторлар идентификаторларды табу үшін хэш-кестелерді қолданады. Деректер құрылымдары үлкен деректер базаларын және интернеттік индекстеу қызметтерін сияқты қолданулар үшін үлкен көлемдегі деректерді тиімді басқаруға мүмкіндік береді. Көбінесе, тиімді алгоритмдерді құру үшін тиімді деректер құрылымдары маңызды. Кейбір формалды жобалау әдістері мен бағдарламалау тілдері бағдарламалық қамтамастың негізгі ұйымдастырушы факторы ретінде алгоритмдерге емес, деректер құрылымдарына басымдық береді. Деректер құрылымдарын негізгі жадта да, қосымша жадта да сақталған ақпаратты ұйымдастыру және алу үшін қолдануға болады.
Іске асыру
Деректер құрылымдары әртүрлі бағдарламалау тілдері мен техникаларын қолдана отырып іске асырылуы мүмкін, бірақ олардың барлығы деректерді тиімді ұйымдастыру және сақтаудың ортақ мақсатын бөліседі. Деректер құрылымдары компьютердің жадындағы кез келген жерде деректерді алу және сақтау мүмкіндігіне негізделеді, бұл мекенжай – жад адресін көрсететін биттік тізбек, оны жадта сақтауға және бағдарламамен өңдеуге болады. Осылайша, массив және жазба деректер құрылымдары дерек элементтерінің мекенжайларын есептеу үшін арифметикалық операцияларды пайдаланады, ал тізбекті деректер құрылымдары дерек элементтерінің мекенжайларын құрылымның өзінде сақтайды. Деректерді құрылымдауға осылай келген қатынас алгоритмдердің тиімділігі мен кеңейтілуіне зор әсер етеді. Мысалы, массивтердегі үздісіз жадты бөлу деректерге жылдам қол жеткізуге және өзгертуге мүмкіндік береді, бұл тізбекті деректерді өңдеу кезінде оңтайландырылған өнімділікке әкеледі. Деректер құрылымын іске асыру әдетте осы құрылымның мысалдарымен жұмыс істейтін процедуралар жиынтығын жазуды қажет етеді. Деректер құрылымының тиімділігін осы операциялардан бөлек талдауға болмайды. Осы байқау абстрактілі деректер түрінің теориялық тұжырымдамасын қадағалайды, ол оған орындалатын операциялар және осы операциялардың математикалық қасиеттері (олардың кеңістігі мен уақыт шығындары қоса алғанда) арқылы жанама түрде анықталатын деректер құрылымы болып табылады.
Мысалдар
Деректер құрылымының көптеген түрлері бар, олар әдетте қарапайым бастапқы дерек түрлері негізінде құрылады. Белгілі мысалдар: Массив – бұл белгілі бір ретпен тізілген элементтердің саны, көбінесе барлығы бірдей типте (тілге байланысты, жеке элементтер бірдей типте болуға міндетті немесе кез келген типте болуы мүмкін). Элементтерге қол жеткізу үшін бүтін сандық индекс қолданылады, осы арқылы қажетті элемент анықталады. Көбінесе массив элементтері үшін жадтың тікелей бөлігіне орын беріледі (бірақ бұл міндетті емес). Массивтердің ұзындығы тұрақты немесе өзгермелі болуы мүмкін. Байланысқан тізім (немесе тізім) – кез келген типтегі дерек элементтерінің сызықтық жиынтығы, олар түйіндер деп аталады, әр түйінде өзінің мәні болады және ол тізімдегі келесі түйінге сілтеме жасайды. Байланысқан тізімнің массивке қарағанда басты артықшылығы – мәндерді тізімнің қалған бөлігін жылжытпай-ақ тиімді қосуға және жоюға болады. Дегенмен, тізімдерде массивтерге қарағанда белгілі бір элементке кездейсоқ түрде қол жеткізу операциясы баяурақ орындалады. Жазба (немесе түпл, құрылым) – жиынды деректер құрылымы. Жазба – басқа мәндерді қамтитын мән, әдетте тұрақты санда және реттілікте, және әдетте атаулармен белгіленеді. Жазба элементтері әдетте өрістер немесе мүшелер деп аталады. Объектіге бағытталған бағдарламалауда жазбалар объектілерден ерекшелену үшін қарапайым деректер құрылымдары деп аталады. Хеш-кестелер, немесе хеш-карталар – кілттерге сүйенген мәндерді жылдам табуды қамтамасыз ететін деректер құрылымдары. Олар хеш-функцияны қолданып кілттерді массивтегі индекске бейімдейді, осылайша орташа жағдайда тұрақты уақытта қол жеткізуге мүмкіндік береді. Хеш-кестелер көбінесе сөздіктерде, кэште және деректер базасын индекстеуде қолданылады. Алайда, хеш-соқтығысулар болуы мүмкін, бұл олардың өнімділігіне әсер етеді. Соқтығысуларды басқару үшін тізбектеу және ашық адрестеу сияқты әдістер қолданылады. Графтар – бұрыштар арқылы байланысқан түйіндердің жиынтығы, олар бірліктер арасындағы қатынастарды көрсетеді. Графтар әлеуметтік желілерді, компьютерлік желілерді және көлік желілерін модельдеу үшін қолданылуы мүмкін. Олар төбелерден (түйіндерден) және жиектерден (түйіндер арасындағы байланыстардан) тұрады. Графтар бағытталған немесе бағытталмаған болуы мүмкін, және оларда циклдар болуы немесе олар ациклді болуы мүмкін. Графты аралау алгоритмдеріне ендік бірінші іздеу және тереңдік бірінші іздеу жатады. Стектер мен кезектер – массивтер немесе байланысқан тізімдерді пайдалана отырып іске асырылатын абстрактілі дерек түрлері. Стекте екі негізгі операция бар: push (стектің үстіне элемент қосады) және pop (стектен жоғарғы элементті алып тастайды), олар соңғы кірген, бірінші шығатын (LIFO) принципін ұстанады. Кезектерде екі негізгі операция бар: enqueue (кезектің соңына элемент қосады) және dequeue (кезектің басынан элементті алып тастайды), олар бірінші кірген, бірінші шығатын (FIFO) принципін ұстанады. Ағаштар элементтердің иерархиялық ұйымдастырылуын көрсетеді. Ағаш шеттерімен байланысқан түйіндерден тұрады, олардың бірі түбір болып табылады, ал қалған түйіндер кіші ағаштар құрайды. Ағаштар әртүрлі алгоритмдер мен деректерді сақтау сценарийлерінде кеңінен қолданылады. Бинарлық ағаштар (әсіресе үйірмелер), AVL ағаштары және B ағаштары – ағаштардың танымал түрлері. Олар деректерді тиімді және оңтайлы іздеуге, сұрыптауға және иерархиялық түрде көрсетуге мүмкіндік береді. Три, немесе префикс ағашы – жолдарды тиімді табу үшін қолданылатын арнайы ағаш деректер құрылымы. Три жолдардың әрбір таңбасын түйін ретінде сақтайды, әр жиек бір таңбаны білдіреді. Олар мәтін өңдеу сценарийлерінде, мысалы, автотолықтыру, орфографиялық тексеру және сөздіктерді іске асыру сияқты жағдайларда өте пайдалы. Трилер жолдар бойынша жылдам іздеуге және префикске негізделген операцияларға мүмкіндік береді.
An array is a number of elements in a specific order, typically all of the same type (depending on the language, individual elements may either all be forced to be the same type, or may be of almost any type). Elements are accessed using an integer index to specify which element is required. Typical implementations allocate contiguous memory words for the elements of arrays (but this is not always a necessity). Arrays may be fixed length or resizable. A linked list (also just called list) is a linear collection of data elements of any type, called nodes, where each node has itself a value, and points to the next node in the linked list. The principal advantage of a linked list over an array is that values can always be efficiently inserted and removed without relocating the rest of the list. Certain other operations, such as random access to a certain element, are however slower on lists than on arrays. A record (also called tuple or struct) is an aggregate data structure. A record is a value that contains other values, typically in fixed number and sequence and typically indexed by names. The elements of records are usually called fields or members. In the context of object oriented programming, records are known as plain old data structures to distinguish them from objects. Hash tables, also known as hash maps, are data structures that provide fast retrieval of values based on keys. They use a hashing function to map keys to indexes in an array, allowing for constant time access in the average case. Hash tables are commonly used in dictionaries, caches, and database indexing. However, hash collisions can occur, which can impact their performance. Techniques like chaining and open addressing are employed to handle collisions. Graphs are collections of nodes connected by edges, representing relationships between entities. Graphs can be used to model social networks, computer networks, and transportation networks, among other things. They consist of vertices (nodes) and edges (connections between nodes). Graphs can be directed or undirected, and they can have cycles or be acyclic. Graph traversal algorithms include breadth first search and depth first search. Stacks and queues are abstract data types that can be implemented using arrays or linked lists. A stack has two primary operations: push (adds an element to the top of the stack) and pop (removes the topmost element from the stack), that follow the Last In, First Out (LIFO) principle. Queues have two main operations: enqueue (adds an element to the rear of the queue) and dequeue (removes an element from the front of the queue) that follow the First In, First Out (FIFO) principle. Trees represent a hierarchical organization of elements. A tree consists of nodes connected by edges, with one node being the root and all other nodes forming subtrees. Trees are widely used in various algorithms and data storage scenarios. Binary trees (particularly heaps), AVL trees, and B trees are some popular types of trees. They enable efficient and optimal searching, sorting, and hierarchical representation of data. A trie, also known as a prefix tree, is a specialized tree data structure used for the efficient retrieval of strings. Tries store characters of a string as nodes, with each edge representing a character. They are particularly useful in text processing scenarios like autocomplete, spell checking, and dictionary implementations. Tries enable fast searching and prefix based operations on strings.
Тілдік қолдау
Ассемблер тілдерінің көпшілігі және кейбір төмен деңгейлі тілдер, мысалы, BCPL (Негізгі біріктірілген бағдарламалау тілі) дерек құрылымдарына кіріктірілген қолдау көрсетпейді. Керісінше, көптеген жоғары деңгейлі бағдарламалау тілдері және MASM сияқты кейбір жоғары деңгейлі ассемблер тілдері, жазбалар мен массивлер сияқты нақты дерек құрылымдары үшін арнайы синтаксис немесе басқа кіріктірілген қолдауға ие. Мысалы, C (BCPL-дің тікелей ұрпағы) және Паскаль тілдері векторлар (бір өлшемді массивлер) және көп өлшемді массивтерден өзге, сәйкесінше құрылымдар мен жазбаларды қолдайды. Бағдарламалау тілдерінің көпшілігі дерек құрылымдарының іске асырылуын әртүрлі бағдарламаларда қайта пайдалануға мүмкіндік беретін кітапхана механизміне ие. Қазіргі заманғы тілдер әдетте ең көп қолданылатын дерек құрылымдарын іске асыратын стандартты кітапханалармен бірге келеді. Мысалы, C++ стандартты үлгілер кітапханасы, Java жиынтықтар жинағы және Microsoft .NET жинағы. Қазіргі заманғы тілдер, әдетте, модульдік бағдарламалауды, кітапхана модулінің интерфейсі мен оның іске асырылуы арасындағы айырмашылықты қолдайды. Кейбірлері клиенттерге іске асыру егжей-тегжейін жасыруға мүмкіндік беретін түсініксіз дерек түрлерін ұсынады. C++, Java және Smalltalk сияқты объектіге бағытталған бағдарламалау тілдері әдетте осы мақсатта сыныптарды қолданады. Көптеген белгілі дерек құрылымдарының бірнеше есептеу тізбегінің дерек құрылымының бір нақты данасына бір мезгілде қол жеткізуге мүмкіндік беретін параллель нұсқалары бар.