Professional Documents
Culture Documents
Download textbook Data Structures And Algorithms In Swift Kevin Lau ebook all chapter pdf
Download textbook Data Structures And Algorithms In Swift Kevin Lau ebook all chapter pdf
Kevin Lau
Visit to download the full and correct content document:
https://textbookfull.com/product/data-structures-and-algorithms-in-swift-kevin-lau/
More products digital (pdf, epub, mobi) instant
download maybe you interests ...
https://textbookfull.com/product/data-structures-algorithms-in-
python-john-canning/
https://textbookfull.com/product/data-structures-algorithms-in-
kotlin-implementing-practical-data-structures-in-kotlin-1st-
edition-raywenderlich-tutorial-team/
https://textbookfull.com/product/probabilistic-data-structures-
and-algorithms-for-big-data-applications-gakhov/
https://textbookfull.com/product/data-structures-algorithms-in-
go-1st-edition-hemant-jain/
Algorithms and Data Structures in Action MEAP V12
Marcello La Rocca
https://textbookfull.com/product/algorithms-and-data-structures-
in-action-meap-v12-marcello-la-rocca/
https://textbookfull.com/product/problem-solving-in-data-
structures-algorithms-using-c-first-edition-jain/
https://textbookfull.com/product/think-data-structures-
algorithms-and-information-retrieval-in-java-1st-edition-allen-b-
downey/
Data
Structures
& Algorithms
in Swift
By Kelvin Lau & Vincent Ngo
2
Download from finelybook 7450911@qq.com
Notice of Rights
All rights reserved. No part of this book or corresponding materials
(such as text, images, or source code) may be reproduced or
distributed by any means without prior written permission of the
copyright owner.
Notice of Liability
This book and all corresponding materials (such as source code) are
provided on an “as is” basis, without warranty of any kind, express of
implied, including but not limited to the warranties of
merchantability, fitness for a particular purpose, and
noninfringement. In no event shall the authors or copyright holders
be liable for any claim, damages or other liability, whether in action of
contract, tort or otherwise, arising from, out of or in connection with
the software or the use of other dealing in the software.
Trademarks
All trademarks and registered trademarks appearing in this book are
the property of their own respective owners.
3
Download from finelybook 7450911@qq.com
4
Download from finelybook 7450911@qq.com
Chris Belanger is the editor of this book. Chris is the Editor in Chief at
raywenderlich.com. He was a developer for nearly 20 years in various
fields from e-health to aerial surveillance to industrial controls. If
there are words to wrangle or a paragraph to ponder, he’s on the case.
When he kicks back, you can usually find Chris with guitar in hand,
looking for the nearest beach. Twitter: @crispytwit.
5
Download from finelybook 7450911@qq.com
Ray Fix is the final pass editor of this book. A passionate Swift
educator, enthusiast and advocate, he is actively using Swift to create
Revolve: a next generation iPad controlled research microscope at
Discover Echo Inc. Ray is mostly-fluent in spoken and written
Japanese and stays healthy by walking, jogging, and playing ultimate
Frisbee. When he is not doing one of those things, he is writing and
dreaming of code in Swift. You can find him on Twitter: @rayfix.
6
Download from finelybook 7450911@qq.com
7
Download from finelybook 7450911@qq.com
Book license
By purchasing Data Structures & Algorithms in Swift, you have the
following license:
You are allowed to use and/or modify the source code in Data
Structures & Algorithms in Swift in as many apps as you want,
with no attribution required.
You are allowed to use and/or modify all art, images and designs
that are included in Data Structures & Algorithms in Swift in as
many apps as you want, but must include this attribution line
somewhere inside your app: “Artwork/images/designs: from Data
Structures & Algorithms in Swift, available at
www.raywenderlich.com”.
This book is for your personal use only. You are NOT allowed to
sell this book without prior authorization, or distribute it to
friends, coworkers or students; they would need to purchase their
own copies.
All materials provided with this book are provided on an “as is” basis,
without warranty of any kind, express or implied, including but not
limited to the warranties of merchantability, fitness for a particular
purpose and noninfringement. In no event shall the authors or
copyright holders be liable for any claim, damages or other liability,
whether in an action of contract, tort or otherwise, arising from, out
of or in connection with the software or the use or other dealings in
the software.
9
Download from finelybook 7450911@qq.com
We hope you enjoy the preview of this book, and that you’ll come
back to help us celebrate the full launch of Data Structures &
Algorithms in Swift later in 2018!
The best way to get update notifications is to sign up for our monthly
newsletter. This includes a list of the tutorials that came out on
raywenderlich.com that month, any important news like book updates
or new books, and a list of our favorite development links for that
month. You can sign up here:
www.raywenderlich.com/newsletter
10
Download from finelybook 7450911@qq.com
https://store.raywenderlich.com/products/swift-apprentice
https://store.raywenderlich.com/products/ios-apprentice
11
Download from finelybook 7450911@qq.com
12
Download from finelybook 7450911@qq.com
www.raywenderlich.com/store/data-structures-algorithms-
swift/source-code
There, you’ll find all the code from the chapters for your use.
13
Download from finelybook 7450911@qq.com
Little is known about the giant squid, due to its preference for cold,
deep-water habitats. It’s much like the data structures and algorithms
that lurk deep within software; although you may not yet understand
how data structures and algorithms form the basis of scalable, high-
performance solutions, this book will be your own personal Nautilus
that will transport you 20,000 leagues under a sea of code!
14
Download from finelybook 7450911@qq.com
Preface
The study of data structures is one about efficiency. Given a particular
amount of data, what is the best way to store it to achieve a particular
goal?
Data structures are a well-studied area, and the concepts are language
agnostic; a data structure from C is functionally and conceptually
identical to the same data structure in any other language, such as
Swift. At the same time, the high-level expressiveness of Swift make it
an ideal choice for learning these core concepts without sacrificing
too much performance.
Interviews
When you interview for a software engineering position, chances are
you’ll be tested on data structures and algorithms. Having a strong
foundation in data structures and algorithms is the “bar” for many
companies with software engineering positions.
Work
Data structures are most relevant when working with large amounts
15
Download from finelybook 7450911@qq.com
Data structures are most relevant when working with large amounts
of data. If you’re dealing with a non-trivial amount of data, using the
appropriate data structure will play a big role in the performance and
scalability of your software.
Self-improvement
Knowing about the strategies used by algorithms to solve tricky
problems gives you ideas for improvements you can make to your own
code. Swift’s Standard Library has small set of general purpose
collection types; they definitely don’t cover every case.
And yet, as you will see, these primitives can be used as a great
starting point for building more complex and special purpose
constructs. Knowing more data structures than just the standard array
and dictionary gives you a bigger collection of tools you can use to
build your own apps.
16
Download from finelybook 7450911@qq.com
In this chapter you’ll focus on two data structures that the standard
library provides right out of the box: Array and Dictionary.
Arrays
An array is a general-purpose, generic container for storing a
collection of elements, and is used commonly in all sorts of Swift
programs. You can create an array by using an array literal, which is a
comma-separated list of values surrounded with square brackets. For
example:
This is a generic type in that it abstracts across any element type. The
element type has no formal requirements; it can be anything. In the
above example, the compiler type infers the elements to be String
types.
17
Download from finelybook 7450911@qq.com
Order
Elements in an array are explicitly ordered. Using the above people
array as an example, "Brian" comes before "Stanley".
You can retrieve the value of an element in the array by writing the
following:
people[0] // "Brian"
people[1] // "Stanley"
people[2] // "Ringo"
Order is defined by the array data structure and should not be taken
for granted. Some data structures, such as Dictionary, have a weaker
concept of order.
Random-access
Random-access is a trait that data structures can claim if they can
handle element retrieval in constant O(1) time. For example, getting
"Ringo" from the people array takes constant time. Again, this
performance should not be taken for granted. Other data structures
such as linked lists and trees do not have constant time access.
Array performance
18
Download from finelybook 7450911@qq.com
Insertion location
The first factor is where you choose to insert the new element inside
the array. The most efficient scenario for adding an element to an
array is to append it at the end of the array:
people.append("Charles")
print(people) // prints ["Brian", "Stanley", "Ringo", "Charles"]
Inserting "Charles" using the append method will place the string at
the end of the array. This is a constant-time operation, and is the
most efficient way to add elements into an array. However, there may
come a time that you need to insert an element in a particular
location, such as in the very middle of the array. In such a scenario,
this is an O(n) operation.
To help illustrate why that is the case, consider the following analogy.
You’re standing in line for the theater. Someone new comes along, to
join the lineup. What’s the easiest place to add people to the lineup?
At the end of course!
If the newcomer tried to insert themselves into the middle of the line,
they would have to convince half the lineup to shuffle back to make
room.
And if they were terribly rude, they’d try to insert themselves at the
head of the line. This is the worst-case scenario, because every single
person in the lineup would need to shuffle back to make room for this
new person in front!
This is exactly how the array works. Inserting new elements from
19
Download from finelybook 7450911@qq.com
This is exactly how the array works. Inserting new elements from
anywhere aside from the end of the array will force elements to
shuffle backwards to make room for the new element:
people.insert("Andy", at: 0)
// ["Andy", "Brian", "Stanley", "Ringo", "Charles"]
The second factor that determines the speed of insertion is the array’s
capacity. If the space that the array pre-allocated (the capacity) is
exceeded it must reallocate storage and copy over the current
elements. This means that any given insertion, even at the end, could
take n steps to complete if a copy is made. However, the standard
library employs a subtle trick to prevent appends from being O(n)
time. Each time it runs out of storage and needs to copy, it doubles
the capacity. Doing this allows arrays to have an amortized cost that
it is still constant time O(1).
Dictionary
A dictionary is another generic collection that holds key-value pairs.
For example, here’s a dictionary containing a user’s name and their
score:
Dictionaries don’t have any guarantees of order, nor can you insert at
20
Download from finelybook 7450911@qq.com
Dictionaries don’t have any guarantees of order, nor can you insert at
a specific index. They also put a requirement on the Key type that it
be Hashable. Fortunately almost all of the standard types are already
Hashable and in the most recent versions Swift, adopting the
Hashable protocol is now trivial.
You can add a new entry to the dictionary with the following syntax:
scores["Andrew"] = 0
21
Download from finelybook 7450911@qq.com
22
Download from finelybook 7450911@qq.com
Linked list
A linked list is a collection of values arranged in a linear
unidirectional sequence. A linked list has several theoretical
advantages over contiguous storage options such as the Swift Array:
Constant time insertion and removal from the front of the list.
1. Hold a value.
2. Hold a reference to the next node. A nil value represents the end
of the list.
Open up the starter playground for this chapter so you can dive right
into the code.
Node
Create a new Swift file in the Sources directory and name it
Node.swift. Add the following to the file:
23
Download from finelybook 7450911@qq.com
node1.next = node2
node2.next = node3
print(node1)
}
24
Download from finelybook 7450911@qq.com
LinkedList
In the Sources directory, create a new file and name it
LinkedList.swift. Add the following to the file:
public init() {}
25
Download from finelybook 7450911@qq.com
}
}
A linked list has the concept of a head and tail, which refers to the
first and last nodes of the list respectively:
You’ll implement each of these in the next section and analyze their
performance characteristics.
push
Adding a value at the front of the list is known as a push operation.
This is also known as head-first insertion. The code for it is
deliciously simple.
26
Download from finelybook 7450911@qq.com
In the case where you’re pushing into an empty list, the new node is
both the head and tail of the list.
example(of: "push") {
var list = LinkedList<Int>()
list.push(3)
list.push(2)
list.push(1)
print(list)
}
---Example of push---
1 -> 2 -> 3
append
The next operation you’ll look at is append. This is meant to add a
value at the end of the list, and is known as tail-end insertion.
Head back into LinkedList.swift and add the following code just below
push:
// 1
guard !isEmpty else {
push(value)
return
27
Download from finelybook 7450911@qq.com
// 2
tail!.next = Node(value: value)
// 3
tail = tail!.next
}
1. Like before, if the list is empty, you’ll need to update both head
and tail to the new node. Since append on an empty list is
functionally identical to push, you simply invoke push to do the
work for you.
2. In all other cases, you simply create a new node after the tail
node. Force unwrapping is guaranteed to succeed since you push
in the isEmpty case with the above guard statement.
3. Since this is tail-end insertion, your new node is also the tail of
the list.
Leap back into the playground and write the following at the bottom:
example(of: "append") {
var list = LinkedList<Int>()
list.append(1)
list.append(2)
list.append(3)
print(list)
}
---Example of append---
1 -> 2 -> 3
28
Download from finelybook 7450911@qq.com
insert(after:)
The third and final operation for adding values is insert(after:).
This operation inserts a value at a particular place in the list, and
requires two steps:
First, you’ll implement the code to find the node where you want to
insert your value.
// 2
while currentNode != nil && currentIndex < index {
currentNode = currentNode!.next
currentIndex += 1
}
return currentNode
}
node(at:) will try to retrieve a node in the list based on the given
index. Since you can only access the nodes of the list from the head
node, you’ll have to make iterative traversals. Here’s the play-by-
play:
1. You create a new reference to head and keep track of the current
number of traversals.
2. Using a while loop, you move the reference down the list until
you’ve reached the desired index. Empty lists or out-of-bounds
29
Another random document with
no related content on Scribd:
NOTAS:
[7] Este artículo fué leído por su autor en una velada literario-
musical, dispuesta por el Alcalde de Santander, don Tomás C. de
Agüero, á beneficio de los pobres.
MANÍAS
Por cierto que esta moral debe de ser muy antigua y corriente entre
la gente del rebusco, porque recuerdo haber leído, con referencia á
Barthélemy, que habiéndosele preguntado una vez cómo había
podido reunir la rica colección de medallas que poseía, respondió
con el candor de un niño:
—Me han regalado algunas; he comprado otras, y las demás las he
robado.
Dicho esto, lector (que, cuando menos, tendrás la manía de ser
buen mozo, por ruin y encanijado que seas), hago punto aquí,
apostándote las dos orejas á que siendo, como te juzgo, hombre de
bien, después de meter la mano en tu pecho no te atreves á tirar
una chinita á mi pecado.
1880.
LA INTOLERANCIA
Bien saben los que á usted y á mí nos conocen, que de este pecado
no tenemos, gracias á Dios, que arrepentirnos.
No van, pues, conmigo ni con usted los presentes rasguños,
aunque mi pluma los trace y á usted se los dedique; ni van tampoco
con los que tengan, en el particular, la conciencia menos tranquila
que la nuestra, porque los pecadores de este jaez ni se arrepienten
ni se enmiendan; además de que á mí no me da el naipe para
convertir infieles. Son, por tanto, las presentes líneas, un inofensivo
desahogo entre usted y yo, en el seno de la intimidad y bajo la
mayor reserva. Vamos, como quien dice, á echar un párrafo, en
confianza, en este rinconcito del libro, como pudiéramos echarle
dando un paseo por las soledades de Puerto Chico á las altas horas
de la noche. El asunto no es de transcendencia; pero sí de perenne
actualidad, como ahora se dice, y se presta, como ningún otro, á la
salsa de una murmuración lícita, sin ofensa para nadie, como las
que á usted le gustan, y de cuya raya no pasa aunque le desuellen
vivo.
Ya sabe usted, por lo que nos cuentan los que de allá vienen, lo que
se llama en la Isla de Cuba un ¡ataja! Un quídam toma de una tienda
un pañuelo... ó una oblea; le sorprende el tendero, huye el
delincuente, sale aquél tras éste, plántase en la acera, y grita ¡ataja!
y de la tienda inmediata, y de todas las demás, por cuyos frentes va
pasando á escape el fugitivo, le salen al encuentro banquetas,
palos, pesas, ladrillos y cuanto Dios ó el arte formaron de más duro
y contundente. El atajado así, según su estrella, muere, unas veces
en el acto, y otras al día siguiente, ó sale con vida del apuro; pero,
por bien que le vaya en él, no se libra de una tunda que le balda.
Como se deja comprender, para que al hombre más honrado del
mundo le toque allí la lotería, basta la casualidad de que al correr
por una calle, porque sus negocios así lo requieran, le dé á un
chusco la gana de gritar ¡ataja! Porque allí no se pregunta jamás por
qué, después que se oye el grito: se ve quién corre, y, sin otras
averiguaciones, se le tira con lo primero que se halla á mano.
Pues bien: á un procedimiento semejante se ajusta, por lo común,
entre los hombres cultos de ambos hemisferios, la formación de los
caracteres. No diré que sea la fama quien los hace; pero sí quien los
califica, los define... y los ataja.
Me explicaré mejor con algunos ejemplos.
Un hombre, porque tiene la cara así y el talle del otro modo, es
cordialmente antipático á cuantos no le conocen sino de vista, que
son los más.
—¡Qué cara! ¡qué talle! ¡qué levita! ¡qué aire!—dice con ira cada
uno de ellos, al verle pasar. Y si averiguan que se ha descalabrado,
por resbalarse en la acera,
—¡Me alegro!—exclaman con fruición,—porque ¡cuidado si es
cargante ese mozo!
Y si se habla de un ahogado en el baño, ó de un infeliz cosido á
puñaladas en una callejuela, ó de un desgraciado mordido por un
perro rabioso, dícense, con cierta delectación, pensando en el
antipático:
—¡Él es!
Pero llega un día en que se le ve del brazo de quien más le
despellejaba; pregúntase á éste cómo puede soportar la compañía
de un hombre tan insufrible, y responde con el corazón en la mano:
—Amigo, estábamos en un grandísimo error: ese sujeto es lo más
fino, lo más discreto, lo más bondadoso... lo más simpático que
darse puede.
Así es, en efecto, el fondo de aquel carácter que en el concepto
público, según la fama, es todo lo contrario, por lo cual se le niega la
sal y el fuego.
Ilustraré este caso con otro dato, que si no es enteramente
irrecusable, es, cuando menos, de una ingenuidad meritoria. No sé,
ni me importa saber, la opinión de que goza mi propio carácter entre
la gente; pero es lo cierto que hombres que hoy son íntimos y bien
probados amigos míos, me han dicho alguna vez:
—¡Caray, qué insoportable me eras cuando no te conocía tan á
fondo como ahora!
Jamás me he cansado en preguntarles el por qué de su antipatía.
Cabalmente la sentía yo hacia ellos en igual grado de fuerza.
—¡Qué hombre tan célebre es Diego!—dice la fama.—Es un costal
de gracias y donaires.
Y es porque Diego hace reir á cuantas personas le escuchan, y sus
burlas son celebradas en todas partes, y sus bromazos corren de
boca en boca y de tertulia en tertulia, y hasta las anécdotas más
antiguas y resobadas se le atribuyen á él por sus admiradores.
Ocúrresele á usted un día estudiar un poco á fondo al célebre
Diego, y hállale hombre vulgarísimo, ignorante y sin pizca de ingenio
ni de cultura; capaz de desollar la honra de su madre, á trueque de
hacerse aplaudir de aquellos mismos que le han colocado con sus
palmoteos en la imprescindible necesidad de ser gracioso.
Al revés de Diego, Juan es ingenioso y prudente, seco y punzante
en sus sátiras, oportuno y justo al servirse de ellas; y, sin embargo,
Juan, según dicen, es una vulgaridad antipática.
Una dama espléndida y de buen humor, reúne en su casa, muy á
menudo, una escogida sociedad. La tal señora no tiene, en buena
justicia, prenda que digna de notar sea en su persona. En terreno
neutral, sería una completa vulgaridad. Pero hay lujo en sus salones
y gabinetes, variedad en sus fiestas, abundancia en sus buffets,
novedad en sus trajes, y siempre una sonrisa en su cara. Los
asiduos tertulianos se saturan de este conjunto; siéntense repletitos
de estómago en el elegante comedor, bien divertidos en el estrado
suntuoso, hartos de música y de danza, y todo de balde y cada día.
¿Cómo, á la luz de tantas satisfacciones, no ha de parecerles
encantadora, ó por lo menos distinguidísima, la persona que se las
procura, con celo y desinterés verdaderamente maternales?
Así nace la fama de esa distinción: pregónanla las bocas de los
tertulianos donde quiera que se baila y se cena de balde, y luego en
corrillos y cafés, y cátala proverbial en todo el pueblo, y á la dama,
autorizada para enmendar la plana á la moda reinante y acreditar
caprichosos aditamentos de su invención, como prendas de gusto
superfino.
Enséñansela en la calle á usted, que no baila, y dícenle los que la
saludan:
—¡Qué señora tan elegante, tan chic... y qué talento tiene!
Ni usted la halla elegante, ni eso que los elegantes llaman chic, no
sé por qué; ni ha visto usted una muestra del ensalzado talento;
pero tanto se lo aseguran, que antes duda usted de la claridad de su
vista y de la solidez de su juicio, que de la razón de la fama.
Al mismo tiempo pasa otra señora, bella á todas luces, elegante sin
trapos raros, y discreta á carta cabal; y usted, que es sincero, dice al
punto á los otros:
—¡Esto es lo que se llama un tipo elegante y distinguido!...
—Cierto que no es enteramente vulgo—le contestan con desdén;—
no es fea, no es tonta... pero le falta, le falta... vamos, le falta...
—¡Qué canario!—digo yo:—lo que le falta es dar un baile cada tres
días y una cena en cada baile, como la otra; pues la mayor parte de
los juicios que hacemos de las cosas, dependen, según afirmó muy
cuerdamente el poeta,