Jump to content

Data Structures: Difference between revisions

From EdwardWiki
Bot (talk | contribs)
m Created article 'Data Structures' with auto-categories 🏷️
Bot (talk | contribs)
m Created article 'Data Structures' with auto-categories 🏷️
Line 1: Line 1:
== Data Structures ==
Data structures are specialized formats for organizing, storing, and managing data in a computer system. They are fundamental to the design and implementation of software and are critical in enabling efficient data access, retrieval, and modification. Understanding data structures is essential for computer science professionals as they influence the performance and complexity of algorithms.
== Introduction ==
== Introduction ==
Data structures are a fundamental concept in computer science that allow for the organization, management, and storage of data in a way that enables efficient access and modification. By defining specific ways of organizing and manipulating data, data structures serve as the backbone of algorithm design and implementation. Their choice can significantly influence the performance and efficiency of software applications.
 
Data structures provide a way to store and manage data in an organized manner, which allows for efficient access and modification. A data structure can be a simple type like an integer or a more complex type such as a list or a graph. The choice of data structure can significantly influence the performance of both the program and the algorithms that use them. Two fundamental operations that data structures support are data storage and retrieval. Efficient data structures minimize memory usage and maximize access speed, which can directly affect the overall performance of software applications.


== History ==
== History ==
The concept of data structures has evolved over several decades. Early forms of data organization can be traced back to the development of programming languages in the 1950s and 1960s. The advent of operating systems and databases further catalyzed innovations in data management. The 1970s saw the introduction of more complex data structures such as linked lists, trees, and graphs, which were vital for representing hierarchical data and relationships. Notably, the development of the first programming languages, such as FORTRAN and Lisp, imbued early programmers with tools to abstract data into meaningful structures.


As computer science progressed into the 1980s and beyond, academic research and practical applications led to the exploration of more sophisticated data structures, including self-balancing trees, hash tables, and more. These advancements have continued into the present day, where the needs of big data and complex computations have spurred the development of new approaches to data structuring.
The evolution of data structures can be traced back to the early days of computer science. The concept of collecting data in structured formats gained prominence with the advent of programming languages and their respective paradigms. Early computers primarily used linear storage formats such as arrays. As the needs of software became more complex, more sophisticated structures such as linked lists and trees emerged.
 
In the 1970s, Peter Naur documented the notion of data structures and their manipulation in his work, which helped formalize how data could be structured in computer programs. The introduction of abstract data types in the 1980s further revolutionized the design of data structures by allowing developers to define data types based on their behavior rather than their implementation.
 
In the late 20th and early 21st centuries, data structures were programmed with greater complexity and versatility due to advancements in hardware capabilities and the popularity of object-oriented programming languages. Modern programming languages like Python, Java, and C++ provide built-in support for various data structures, making them easily accessible for software development.
 
== Types of Data Structures ==
 
Data structures can be broadly classified into two categories: primitive data structures and non-primitive data structures.
 
=== Primitive Data Structures ===
 
Primitive data structures are the basic types of data that are directly operated upon by machine instructions. They include:
* '''Integer''': Represents whole numbers.
* '''Float''': Represents decimal numbers.
* '''Character''': A single letter or symbol.
* '''Boolean''': Represents true or false values.
 
=== Non-Primitive Data Structures ===
 
Non-primitive data structures can be further classified into two subcategories: linear and non-linear data structures.
 
==== Linear Data Structures ====
 
In linear data structures, data elements are arranged in a sequential manner. Common linear data structures include:
* '''Arrays''': A collection of elements, all of the same type, stored in contiguous memory locations. They support random access, which means elements can be retrieved in constant time.
* '''Linked Lists''': Consists of nodes where each node contains data and a reference (link) to the next node in the sequence. They allow efficient insertion and deletion of elements but have higher memory overhead due to the storage of links.
* '''Stacks''': A collection of elements that follows the Last In First Out (LIFO) principle. It supports operations such as push (add an element) and pop (remove the most recently added element).
* '''Queues''': A collection of elements that follows the First In First Out (FIFO) principle. It allows elements to be added to one end (the rear) and removed from the other end (the front).
 
==== Non-Linear Data Structures ====
 
Non-linear data structures allow for more complex relationships between data elements. They include:
* '''Trees''': A hierarchical structure consisting of nodes, where each node contains data and links to child nodes. The top node is called the root, and nodes with no children are called leaves. A binary tree is a type of tree where each node has at most two children.
* '''Graphs''': Consists of a set of vertices (or nodes) connected by edges. Graphs can represent many real-world systems such as social networks, where nodes represent individuals and edges represent relationships.
* '''Hash Tables''': A structure that stores key-value pairs for efficient data retrieval. A hash function maps keys to positions in an array, allowing for constant time complexity in the average case for accesses.


== Design and Architecture ==
== Design and Architecture ==
Data structures can be fundamentally categorized based on their attributes and operations. They are designed to optimize specific aspects of data handling, tailored to particular requirements of functionality and efficiency.


=== Types of Data Structures ===
The design of data structures is critical in software development, influencing both the performance of algorithms and the system's architecture. Effective data structures enable the development of efficient algorithms. Careful consideration is required when choosing a data structure for a specific application, as different structures have different strengths and weaknesses.
Data structures can broadly be classified into two main categories:
* '''Primitive Data Structures''' - These are the basic building blocks of data manipulation, including data types such as integers, floats, characters, and booleans. They come predefined and are often supported directly by programming languages.
* '''Non-Primitive Data Structures''' - These are more complex structures that are built using primitive data types. They can be further divided into:
* Linear Data Structures - These structures maintain a sequential arrangement of elements. Common examples include:
* Arrays - A collection of elements identified by index or key, which allows for easy access but has a fixed size.
* Linked Lists - Consisting of nodes that contain data and a reference (or pointer) to the next node, allowing for dynamic size adjustment.
* Stacks - A Last-In-First-Out (LIFO) structure that allows data to be added or removed from only one end.
* Queues - A First-In-First-Out (FIFO) structure where elements are added at one end and removed from the other.
* Non-Linear Data Structures - These structures do not have a sequential arrangement. Examples include:
* Trees - Structurally resembles a hierarchy, where each node has a value and references to child nodes, suitable for representing hierarchical data.
* Graphs - Comprise a set of vertices and edges, which can depict complex relationships and networks.


=== Performance Characteristics ===
=== Characteristics of Good Data Structures ===
The choice of data structure can significantly impact performance. Key performance metrics include:
* '''Time Complexity''' - Often measured by the number of operations required to read, insert, update, or delete an element from the structure.
* '''Space Complexity''' - Refers to the memory requirement for the data structure in relation to the amount of data stored.
* '''Scalability''' - The ability of the data structure to accommodate growing datasets efficiently.


Systematic understanding and comparison of these performance characteristics are essential for selecting appropriate data structures for specific applications.
Good data structures should possess the following characteristics:
* '''Efficiency''': They should provide fast access and modification times depending on the operations required. For example, if rapid insertion and deletion are crucial, a linked list may be more suitable than an array.
* '''Simplicity''': The structure should be easy to understand and work with. Complex structures may introduce unnecessary complications in code.
* '''Flexibility''': Good data structures should be adaptable to changing requirements. They should allow for dynamic resizing or changing of elements if needed.
* '''Scalability''': A data structure should perform well as the amount of data increases, without significant degradation in speed.
 
=== Algorithm Complexity and Data Structures ===
 
The choice of data structure significantly impacts algorithm complexity. Data structures such as arrays and linked lists exhibit different performance characteristics for various operations:
* Searching: In arrays, searching is generally O(n) unless the array is sorted and employs binary search, which provides O(log n) complexity. In contrast, searching in hash tables generally achieves O(1) average complexity.
* Insertion: Both linked lists and arrays have different performance for insertion. Arrays require moving elements (O(n)), while linked lists only update links (O(1)).
* Deletion: Similar to insertion, deletion in arrays is O(n) while it is O(1) for linked lists.
 
Understanding these complexities is vital for selecting appropriate data structures in algorithm design.


== Usage and Implementation ==
== Usage and Implementation ==
Data structures are employed in a multitude of applications across various domains in computer science. Their implementations can be found in algorithms, operating systems, database systems, and computer graphics, among others.


=== Algorithms and Data Structures ===
Data structures are omnipresent in software engineering, underpinning a vast array of applications. They are implemented in programming languages through either built-in support or custom definitions.
The relationship between data structures and algorithms is pivotal; algorithms operate on data structures. For instance:
 
* **Searching algorithms** such as binary search rely heavily on sorted arrays or binary trees for efficient searching operations.
=== Implementation Techniques ===
* **Sorting algorithms** like quicksort or mergesort leverage specific data structures for optimal speed and efficiency in ordering large datasets.


Choosing the right data structure can enhance the efficiency of an algorithm. For example, a hash table can provide average constant time complexity for search operations, outperforming traditional linear searches performed on lists.
Different programming languages provide various methodologies for implementing data structures.
* '''Object-Oriented Programming (OOP)''': Languages such as Java and C++ allow developers to model data structures as classes. This encapsulation makes it easier to create complex data structures.
* '''Functional Programming''': In languages like Haskell, data structures can be defined using algebraic data types and can be immutable, which offers advantages in concurrent and parallel programming.
* '''Scripting Languages''': Languages such as Python and JavaScript offer rich libraries for data structures, allowing rapid prototyping and fewer implementation details for the programmer.


=== Software Development ===
=== Libraries and Frameworks ===
In modern software development, data structures are utilized within various frameworks and languages. Object-oriented programming languages, such as Java or C++, often encapsulate data structures within classes, allowing for strong abstraction and modularity. Frameworks like Java Collections Framework and C++ Standard Template Library (STL) provide predefined data structures for rapid development.


Data structures are also critical in web development; for instance, DOM (Document Object Model) represents the structure of HTML documents and allows for efficient navigation, manipulation, and styling of elements.
Many programming languages come with comprehensive libraries and frameworks that contain pre-defined data structures, making them accessible for developers. Examples include:
* '''Java Collections Framework''': Provides interfaces and classes for various data structures, including lists, sets, and maps.
* '''Python Standard Library''': Includes built-in data types like lists and dictionaries, alongside collections such as deque and Counter.
* '''C++ Standard Template Library (STL)''': Offers a rich set of data structures and algorithms, such as vectors, maps, and sets.


== Real-world Examples ==
== Real-world Examples ==
Data structures are integral to numerous technologies that influence daily life. Here are some pertinent examples:


=== Database Management Systems ===
Data structures are applied in numerous real-world applications, addressing specific requirements and constraints. Below are some examples:
Databases employ complex data structures such as B-trees and hash tables to index and retrieve data. For example, relational databases utilize B-trees to efficiently handle indexes for querying data, maximizing both read and write performance.  
 
=== Database Management ===
 
Relational databases utilize data structures such as tables (2D arrays) and indexes (often implemented as B-trees or hash tables) for efficient data retrieval. The underlying data structures play a crucial role in query optimization and response time.
 
=== Web Development ===
 
In web applications, data structures are used to manage user data, session states, and various types of content. JSON objects in JavaScript utilize hash tables to store and retrieve data attributes efficiently.


=== Networking ===
=== Networking ===
Graphs are extensively utilized in network design and routing protocols. For instance, the routing tables in networking utilize data structures that represent nodes and links between systems, facilitating data transmission across diverse routing paths.


=== Machine Learning ===
Graph data structures model network topologies, such as the internet. Routing algorithms employ data structures to determine the optimal paths for data packets based on various metrics like distance and latency.
In machine learning, data structures like tensors (multi-dimensional arrays) are employed for data representation and manipulation. Frameworks like TensorFlow and PyTorch utilize such structures to perform matrix operations critical for training neural networks.


=== Game Development ===
=== Artificial Intelligence ===
Game development frequently employs data structures like quad-trees and octrees to manage spatial partitioning for rendering and collision detection, allowing for efficient utilization of computational resources.


== Criticism and Controversies ==
Data structures like trees (decision trees, game trees) and graphs (for neural networks) play a pivotal role in developing algorithms for machine learning and artificial intelligence. These structures help organize the data systematically and efficiently for processing and analysis.
Despite their utility, data structures face criticism primarily related to efficiency and complexity. The following aspects warrant attention:


=== Complexity Overhead ===
== Criticism or Controversies ==
Certain data structures, such as trees and graphs, can introduce considerable overhead in terms of memory consumption and implementation complexity. Managing these structures requires additional effort for maintenance and debugging, which may not be suitable in smaller projects with simpler data handling needs.


=== Performance Trade-offs ===
While data structures provide numerous benefits, their usage is not without criticism. One significant issue arises from the trade-offs involved in selecting a particular data structure. Optimizing for one aspect (e.g., speed) can lead to downsides in other areas, such as memory usage.
While some data structures excel in specific operations, they may perform poorly in others. For example, while hash tables offer average constant time for lookups, they may suffer from collisions that require handling strategies, potentially degrading performance under high load.


=== Evolving Requirements ===
=== Memory Overhead ===
With rapid advancements in technology and the emergence of new paradigms, such as cloud computing and big data analytics, traditional data structures may struggle to meet dynamic requirements. There is ongoing research into adaptive data structures that can dynamically adjust to varying workloads and data types.
 
Complex data structures, like linked lists, often have higher memory overhead due to the storage of additional information (pointers or links). In scenarios where memory is constrained, this can be a significant drawback compared to more straightforward structures like arrays.
 
=== Adaptation and Complexity ===
 
As software systems evolve, the initial choice of data structures may become less optimal for new requirements. Adapting existing data structures can introduce complexity, leading to potential bugs or performance issues if not handled carefully. Changing to a different data structure can require significant refactoring of code.


== Influence and Impact ==
== Influence and Impact ==
The study and application of data structures have had a profound impact on computer science, impacting various fields including software engineering, data analysis, artificial intelligence, and more.


=== Educational Significance ===
The significance of data structures extends beyond software engineering; they influence the growth and capabilities of the technology landscape. Innovations in data structure design can lead to improved performance in various applications, enhancing user experiences.
Data structures form a core part of computer science education, often serving as a prerequisite for advanced studies in algorithms and software engineering. Understanding their underlying principles is crucial for aspiring software developers and engineers.
 
=== Computational Efficiency ===
 
Advancements in data structures contribute to overall computational efficiency and optimization. Algorithms utilizing appropriate data structures can outperform those that do not, thus enabling faster data processing across numerous applications, from web browsing to scientific computations.
 
=== Educational Value ===
 
Data structures are a fundamental topic in computer science education, providing students with essential skills for software development. Mastery of data structures is often viewed as a prerequisite for understanding more advanced concepts, such as algorithms and system design.
 
=== Future Developments ===


=== Technological Advancements ===
As technology evolves, the demand for data structures that can handle growing datasets and complex architectures persists. Research continues into new data structures, such as probabilistic data structures and novel representations for dynamic data that embrace the needs of modern computing, including distributed systems and cloud computing paradigms.
Ongoing research is exploring novel data structures that cater to modern computational challenges. Innovations include data structures optimized for parallel processing and those for machine learning tasks, adapting effectively to vast datasets and complex models.


== See also ==
== See also ==
* [[Algorithm]]
* [[List of data structures]]
* [[Computer Science]]
* [[Algorithms]]
* [[Graph Theory]]
* [[Computer science]]
* [[Tree Structure]]
* [[Complexity theory]]
* [[Database Management]]
* [[Database management systems]]
* [[Artificial intelligence]]


== References ==
== References ==
* [https://www.geeksforgeeks.org/data-structures/ GeeksforGeeks - Data Structures Tutorial]
* [https://www.geeksforgeeks.org/data-structures/] GeeksforGeeks - Data Structures
* [https://www.w3schools.com/datastructures/default.asp W3Schools - Data Structures]
* [https://www.tutorialspoint.com/data_structures_algorithms/data_structures_basics.htm] Tutorialspoint - Basics of Data Structures
* [https://www.tutorialspoint.com/data_structures_algorithms/index.htm TutorialsPoint - Data Structures and Algorithms]
* [https://en.wikipedia.org/wiki/Data_structure] Wikipedia - Data Structure
* [https://www.programiz.com/dsa/data-structures Programiz - Data Structures in Data Science]
* [https://www.coursera.org/learn/data-structures-algorithms] Coursera - Data Structures and Algorithms
* [https://www.coursera.org/learn/data-structures-algorithms Coursera - Data Structures and Algorithms Specialization]
* [https://www.khanacademy.org/computing/computer-science/algorithms] Khan Academy - Algorithms
* [https://www.codecademy.com/learn/paths/data-structures] Codecademy - Data Structures


[[Category:Data structures]]
[[Category:Data structures]]
[[Category:Computer science]]
[[Category:Computer science]]
[[Category:Mathematics]]
[[Category:Mathematics]]

Revision as of 08:02, 6 July 2025

Data Structures

Data structures are specialized formats for organizing, storing, and managing data in a computer system. They are fundamental to the design and implementation of software and are critical in enabling efficient data access, retrieval, and modification. Understanding data structures is essential for computer science professionals as they influence the performance and complexity of algorithms.

Introduction

Data structures provide a way to store and manage data in an organized manner, which allows for efficient access and modification. A data structure can be a simple type like an integer or a more complex type such as a list or a graph. The choice of data structure can significantly influence the performance of both the program and the algorithms that use them. Two fundamental operations that data structures support are data storage and retrieval. Efficient data structures minimize memory usage and maximize access speed, which can directly affect the overall performance of software applications.

History

The evolution of data structures can be traced back to the early days of computer science. The concept of collecting data in structured formats gained prominence with the advent of programming languages and their respective paradigms. Early computers primarily used linear storage formats such as arrays. As the needs of software became more complex, more sophisticated structures such as linked lists and trees emerged.

In the 1970s, Peter Naur documented the notion of data structures and their manipulation in his work, which helped formalize how data could be structured in computer programs. The introduction of abstract data types in the 1980s further revolutionized the design of data structures by allowing developers to define data types based on their behavior rather than their implementation.

In the late 20th and early 21st centuries, data structures were programmed with greater complexity and versatility due to advancements in hardware capabilities and the popularity of object-oriented programming languages. Modern programming languages like Python, Java, and C++ provide built-in support for various data structures, making them easily accessible for software development.

Types of Data Structures

Data structures can be broadly classified into two categories: primitive data structures and non-primitive data structures.

Primitive Data Structures

Primitive data structures are the basic types of data that are directly operated upon by machine instructions. They include:

  • Integer: Represents whole numbers.
  • Float: Represents decimal numbers.
  • Character: A single letter or symbol.
  • Boolean: Represents true or false values.

Non-Primitive Data Structures

Non-primitive data structures can be further classified into two subcategories: linear and non-linear data structures.

Linear Data Structures

In linear data structures, data elements are arranged in a sequential manner. Common linear data structures include:

  • Arrays: A collection of elements, all of the same type, stored in contiguous memory locations. They support random access, which means elements can be retrieved in constant time.
  • Linked Lists: Consists of nodes where each node contains data and a reference (link) to the next node in the sequence. They allow efficient insertion and deletion of elements but have higher memory overhead due to the storage of links.
  • Stacks: A collection of elements that follows the Last In First Out (LIFO) principle. It supports operations such as push (add an element) and pop (remove the most recently added element).
  • Queues: A collection of elements that follows the First In First Out (FIFO) principle. It allows elements to be added to one end (the rear) and removed from the other end (the front).

Non-Linear Data Structures

Non-linear data structures allow for more complex relationships between data elements. They include:

  • Trees: A hierarchical structure consisting of nodes, where each node contains data and links to child nodes. The top node is called the root, and nodes with no children are called leaves. A binary tree is a type of tree where each node has at most two children.
  • Graphs: Consists of a set of vertices (or nodes) connected by edges. Graphs can represent many real-world systems such as social networks, where nodes represent individuals and edges represent relationships.
  • Hash Tables: A structure that stores key-value pairs for efficient data retrieval. A hash function maps keys to positions in an array, allowing for constant time complexity in the average case for accesses.

Design and Architecture

The design of data structures is critical in software development, influencing both the performance of algorithms and the system's architecture. Effective data structures enable the development of efficient algorithms. Careful consideration is required when choosing a data structure for a specific application, as different structures have different strengths and weaknesses.

Characteristics of Good Data Structures

Good data structures should possess the following characteristics:

  • Efficiency: They should provide fast access and modification times depending on the operations required. For example, if rapid insertion and deletion are crucial, a linked list may be more suitable than an array.
  • Simplicity: The structure should be easy to understand and work with. Complex structures may introduce unnecessary complications in code.
  • Flexibility: Good data structures should be adaptable to changing requirements. They should allow for dynamic resizing or changing of elements if needed.
  • Scalability: A data structure should perform well as the amount of data increases, without significant degradation in speed.

Algorithm Complexity and Data Structures

The choice of data structure significantly impacts algorithm complexity. Data structures such as arrays and linked lists exhibit different performance characteristics for various operations:

  • Searching: In arrays, searching is generally O(n) unless the array is sorted and employs binary search, which provides O(log n) complexity. In contrast, searching in hash tables generally achieves O(1) average complexity.
  • Insertion: Both linked lists and arrays have different performance for insertion. Arrays require moving elements (O(n)), while linked lists only update links (O(1)).
  • Deletion: Similar to insertion, deletion in arrays is O(n) while it is O(1) for linked lists.

Understanding these complexities is vital for selecting appropriate data structures in algorithm design.

Usage and Implementation

Data structures are omnipresent in software engineering, underpinning a vast array of applications. They are implemented in programming languages through either built-in support or custom definitions.

Implementation Techniques

Different programming languages provide various methodologies for implementing data structures.

  • Object-Oriented Programming (OOP): Languages such as Java and C++ allow developers to model data structures as classes. This encapsulation makes it easier to create complex data structures.
  • Functional Programming: In languages like Haskell, data structures can be defined using algebraic data types and can be immutable, which offers advantages in concurrent and parallel programming.
  • Scripting Languages: Languages such as Python and JavaScript offer rich libraries for data structures, allowing rapid prototyping and fewer implementation details for the programmer.

Libraries and Frameworks

Many programming languages come with comprehensive libraries and frameworks that contain pre-defined data structures, making them accessible for developers. Examples include:

  • Java Collections Framework: Provides interfaces and classes for various data structures, including lists, sets, and maps.
  • Python Standard Library: Includes built-in data types like lists and dictionaries, alongside collections such as deque and Counter.
  • C++ Standard Template Library (STL): Offers a rich set of data structures and algorithms, such as vectors, maps, and sets.

Real-world Examples

Data structures are applied in numerous real-world applications, addressing specific requirements and constraints. Below are some examples:

Database Management

Relational databases utilize data structures such as tables (2D arrays) and indexes (often implemented as B-trees or hash tables) for efficient data retrieval. The underlying data structures play a crucial role in query optimization and response time.

Web Development

In web applications, data structures are used to manage user data, session states, and various types of content. JSON objects in JavaScript utilize hash tables to store and retrieve data attributes efficiently.

Networking

Graph data structures model network topologies, such as the internet. Routing algorithms employ data structures to determine the optimal paths for data packets based on various metrics like distance and latency.

Artificial Intelligence

Data structures like trees (decision trees, game trees) and graphs (for neural networks) play a pivotal role in developing algorithms for machine learning and artificial intelligence. These structures help organize the data systematically and efficiently for processing and analysis.

Criticism or Controversies

While data structures provide numerous benefits, their usage is not without criticism. One significant issue arises from the trade-offs involved in selecting a particular data structure. Optimizing for one aspect (e.g., speed) can lead to downsides in other areas, such as memory usage.

Memory Overhead

Complex data structures, like linked lists, often have higher memory overhead due to the storage of additional information (pointers or links). In scenarios where memory is constrained, this can be a significant drawback compared to more straightforward structures like arrays.

Adaptation and Complexity

As software systems evolve, the initial choice of data structures may become less optimal for new requirements. Adapting existing data structures can introduce complexity, leading to potential bugs or performance issues if not handled carefully. Changing to a different data structure can require significant refactoring of code.

Influence and Impact

The significance of data structures extends beyond software engineering; they influence the growth and capabilities of the technology landscape. Innovations in data structure design can lead to improved performance in various applications, enhancing user experiences.

Computational Efficiency

Advancements in data structures contribute to overall computational efficiency and optimization. Algorithms utilizing appropriate data structures can outperform those that do not, thus enabling faster data processing across numerous applications, from web browsing to scientific computations.

Educational Value

Data structures are a fundamental topic in computer science education, providing students with essential skills for software development. Mastery of data structures is often viewed as a prerequisite for understanding more advanced concepts, such as algorithms and system design.

Future Developments

As technology evolves, the demand for data structures that can handle growing datasets and complex architectures persists. Research continues into new data structures, such as probabilistic data structures and novel representations for dynamic data that embrace the needs of modern computing, including distributed systems and cloud computing paradigms.

See also

References

  • [1] GeeksforGeeks - Data Structures
  • [2] Tutorialspoint - Basics of Data Structures
  • [3] Wikipedia - Data Structure
  • [4] Coursera - Data Structures and Algorithms
  • [5] Khan Academy - Algorithms
  • [6] Codecademy - Data Structures