What is the importance of data structures?
Data structures are the building blocks that allow you to develop efficient, scalable, and maintainable systems. They provide a means of organizing and representing data that needs to be shared, persisted, sorted, and searched.
There's a famous saying coined by the British computer scientist David Wheeler:
"All problems in computer science can be solved by another level of indirection..."
In software engineering, we use this level of indirection to allow us to build abstract frameworks and libraries. Regardless of the type of system that you are developing, whether it be a small application running on an embedded microcontroller, a mobile application, or a large enterprise web application, these applications are all based on data. Most modern application developments use APIs from various frameworks and libraries to help them create amazing new products. At the end of the day, these APIs, which provide a level of abstraction, boil down to their use of data structures and algorithms.
Data structures + algorithms = programs
Data abstraction is a technique for managing complexity. We use data abstraction when designing our data structures because it hides the internal implementation from the developer. It allows the developer to focus on the interface that is provided by the algorithm, which works with the implementation of the data structure internally.
Data structures and algorithms are patterns used for solving problems. When used correctly they allow you to create elegant solutions to some very difficult problems.
In this day and age, when you use library functions for 90% of your coding, why should you bother to learn their implementations? Without a firm technical understanding, you may not understand the trade-offs between the different types and when to use one over another, and this will eventually cause you problems.
"Smart data structures and dumb code works a lot better than the other way around." | ||
--Eric S. Raymond, The Cathedral and The Bazaar |
By developing a broad and deep knowledge of data structures and algorithms, you'll be able to spot patterns to problems that would otherwise be difficult to model. As you become experienced in identifying these patterns you begin seeing applications for their use in your day-to-day development tasks.
We will make use of Playgrounds and the Swift REPL in this section as we begin to learn about data structures in Swift.
Interactive Playgrounds
Xcode 8.1 has added many new features to Playgrounds and updated it to work with the latest syntax for Swift 3.0. We will use Playgrounds as we begin experimenting with different algorithms so we can rapidly modify the code and see how changes appear instantly.
The Swift REPL
We are going to use the Swift compiler from the command-line interface known as the Read-Eval-Print-Loop, or REPL. Developers who are familiar with interpretive languages such as Ruby or Python will feel comfortable in the command-line environment. All you need to do is enter Swift statements, which the compiler will execute and evaluate immediately. To get started, launch the Terminal.app
in the /Applications/Utilities
folder and type swift
from the prompt in macOS Sierra or OS X El Capitan. Alternatively, it can also be launched by typing xcrun swift
. You will then be in the REPL:
erik@iMac ~ swift Welcome to Apple Swift version 3.0 (swiftlang-800.0.46.2 clang- 800.0.38). Type :help for assistance. 1>
Statement results are automatically formatted and displayed with their type, as are the results of their variables and constant values:
erik@iMac ~ swift Welcome to Apple Swift version 3.0 (swiftlang-800.0.46.2 clang- 800.0.38). Type :help for assistance. 1> var firstName = "Kyra" firstName: String = "Kyra" 2> print("Hello, \(firstName)") Hello, Kyra 3> let lastName: String = "Smith" lastName: String = "Smith" 4> Int("2000") $R0: Int? = 2000
Note that the results from line four have been given the name $R0
by the REPL even though the result of the expression wasn't explicitly assigned to anything. This is so you can reference these results to reuse their values in subsequent statements:
5> $R0! + 500 $R1: Int = 2500
The following table will come in handy as you learn to use the REPL; these are some of the most frequently used commands for editing and navigating the cursor:
Table 1.1 – Quick Reference
Keys |
Actions |
Arrow keys |
Move the cursor left/right/up/down. |
Control + F |
Move the cursor right one character, same as the right arrow. |
Control + B |
Move the cursor left one character, same as the left arrow. |
Control + N |
Move the cursor to the end of the next line, same as the down arrow. |
Control + P |
Move the cursor to the end of the prior line, same as the up arrow. |
Control + D |
Delete the character under the cursor. |
Option + Left |
Move the cursor to the start of the prior word. |
Option + Right |
Move the cursor to the start of the next word. |
Control + A |
Move the cursor to the start of the current line. |
Control + E |
Move the cursor to the end of the current line. |
Delete |
Delete the character to the left of the cursor. |
Esc < |
Move the cursor to the start of the first line. |
Esc > |
Move the cursor to the end of the last line. |
Tab |
Automatically suggest variables, functions, and methods within the current context. For example, after typing the dot operator on a string variable you'll see a list of available functions and methods. |