Data structures serve as the basis for
abstract data types (ADT). The ADT defines the logical form of the data type. The data structure implements the physical form of the
data type.[5]
Data structures provide a means to manage large amounts of data efficiently for uses such as large
databases and internet indexing services. Usually, efficient data structures are key to designing efficient
algorithms. Some formal design methods and
programming languages emphasize data structures, rather than algorithms, as the key organizing factor in software design. Data structures can be used to organize the storage and retrieval of information stored in both
main memory and
secondary memory.[8]
Implementation
Data structures can be implemented using a variety of programming languages and techniques, but they all share the common goal of efficiently organizing and storing data.[9] Data structures are generally based on the ability of a
computer to fetch and store data at any place in its memory, specified by a
pointer—a
bitstring, representing a
memory address, that can be itself stored in memory and manipulated by the program. Thus, the
array and
record data structures are based on computing the addresses of data items with
arithmetic operations, while the
linked data structures are based on storing addresses of data items within the structure itself. This approach to data structuring has profound implications for the efficiency and scalability of algorithms. For instance, the contiguous memory allocation in arrays facilitates rapid access and modification operations, leading to optimized performance in sequential data processing scenarios.[10]
The implementation of a data structure usually requires writing a set of
procedures that create and manipulate instances of that structure. The efficiency of a data structure cannot be analyzed separately from those operations. This observation motivates the theoretical concept of an
abstract data type, a data structure that is defined indirectly by the operations that may be performed on it, and the mathematical properties of those operations (including their space and time cost).[11]
There are numerous types of data structures, generally built upon simpler
primitive data types. Well known examples are:[12]
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.[13]
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.
Language support
Most
assembly languages and some
low-level languages, such as
BCPL (Basic Combined Programming Language), lack built-in support for data structures. On the other hand, many
high-level programming languages and some higher-level assembly languages, such as
MASM, have special syntax or other built-in support for certain data structures, such as records and arrays. For example, the
C (a direct descendant of BCPL) and
Pascal languages support
structs and records, respectively, in addition to vectors (one-dimensional
arrays) and multi-dimensional arrays.[14][15]
Most programming languages feature some sort of
library mechanism that allows data structure implementations to be reused by different programs. Modern languages usually come with standard libraries that implement the most common data structures. Examples are the
C++Standard Template Library, the
Java Collections Framework, and the
Microsoft.NET Framework.
Many known data structures have
concurrent versions which allow multiple computing threads to access a single concrete instance of a data structure simultaneously.[16]
^Dubey, R. C. (2014). Advanced biotechnology : For B Sc and M Sc students of biotechnology and other biological sciences. New Delhi: S Chand.
ISBN978-81-219-4290-4.
OCLC883695533.
^Seymour, Lipschutz (2014). Data structures (Revised first ed.). New Delhi, India: McGraw Hill Education.
ISBN9781259029967.
OCLC927793728.