100% found this document useful (1 vote)
0 views

(eBook PDF) Data Structures & Algorithm Analysis in C++ 4th Edition pdf download

The document is a promotional listing for the eBook 'Data Structures & Algorithm Analysis in C++ 4th Edition' available for download in PDF format. It includes links to various related eBooks on data structures and algorithms in different programming languages. Additionally, it outlines the contents of the book, covering topics such as programming basics, algorithm analysis, data structures, and algorithm design techniques.

Uploaded by

nehirhaveyhy
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
0 views

(eBook PDF) Data Structures & Algorithm Analysis in C++ 4th Edition pdf download

The document is a promotional listing for the eBook 'Data Structures & Algorithm Analysis in C++ 4th Edition' available for download in PDF format. It includes links to various related eBooks on data structures and algorithms in different programming languages. Additionally, it outlines the contents of the book, covering topics such as programming basics, algorithm analysis, data structures, and algorithm design techniques.

Uploaded by

nehirhaveyhy
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 51

(eBook PDF) Data Structures & Algorithm Analysis

in C++ 4th Edition install download

https://ebookluna.com/product/ebook-pdf-data-structures-
algorithm-analysis-in-c-4th-edition/

Download more ebook from https://ebookluna.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Data Structures & Algorithm Analysis in C++ 4th Edition


(eBook PDF)

https://ebookluna.com/product/data-structures-algorithm-analysis-
in-c-4th-edition-ebook-pdf/

ebookluna.com

(eBook PDF) Starting Out with Java: From Control


Structures through Data Structures 4th Edition

https://ebookluna.com/product/ebook-pdf-starting-out-with-java-from-
control-structures-through-data-structures-4th-edition/

ebookluna.com

Data Structures - eBook PDF

https://ebookluna.com/download/data-structures-ebook-pdf/

ebookluna.com

C++ Programming. Program Design including Data Structures


8th Edition D.S. Malik - eBook PDF

https://ebookluna.com/download/c-programming-program-design-including-
data-structures-ebook-pdf/

ebookluna.com
(eBook PDF) Data Structures and Abstractions with Java 4th
Edition

https://ebookluna.com/product/ebook-pdf-data-structures-and-
abstractions-with-java-4th-edition/

ebookluna.com

(eBook PDF) Data Structures and Abstractions with Java 4th


Global Edition

https://ebookluna.com/product/ebook-pdf-data-structures-and-
abstractions-with-java-4th-global-edition/

ebookluna.com

(eBook PDF) Data Structures and Other Objects Using Java


4th Edition

https://ebookluna.com/product/ebook-pdf-data-structures-and-other-
objects-using-java-4th-edition/

ebookluna.com

(eBook PDF) Data Structures and Problem Solving Using Java


4th Edition

https://ebookluna.com/product/ebook-pdf-data-structures-and-problem-
solving-using-java-4th-edition/

ebookluna.com

Data Structures & Algorithms in Python 1st Edition John


Canning - eBook PDF

https://ebookluna.com/download/data-structures-algorithms-in-python-
ebook-pdf-2/

ebookluna.com
CO NTE NTS

Preface xv

Chapter 1 Programming: A General Overview 1


1.1 What’s This Book About? 1
1.2 Mathematics Review 2
1.2.1 Exponents 3
1.2.2 Logarithms 3
1.2.3 Series 4
1.2.4 Modular Arithmetic 5
1.2.5 The P Word 6
1.3 A Brief Introduction to Recursion 8
1.4 C++ Classes 12
1.4.1 Basic class Syntax 12
1.4.2 Extra Constructor Syntax and Accessors 13
1.4.3 Separation of Interface and Implementation 16
1.4.4 vector and string 19
1.5 C++ Details 21
1.5.1 Pointers 21
1.5.2 Lvalues, Rvalues, and References 23
1.5.3 Parameter Passing 25
1.5.4 Return Passing 27
1.5.5 std::swap and std::move 29
1.5.6 The Big-Five: Destructor, Copy Constructor, Move Constructor, Copy
Assignment operator=, Move Assignment operator= 30
1.5.7 C-style Arrays and Strings 35
1.6 Templates 36
1.6.1 Function Templates 37
1.6.2 Class Templates 38
1.6.3 Object, Comparable, and an Example 39
1.6.4 Function Objects 41
1.6.5 Separate Compilation of Class Templates 44
1.7 Using Matrices 44
1.7.1 The Data Members, Constructor, and Basic Accessors 44
1.7.2 operator[] 45
vii
viii Contents

1.7.3 Big-Five 46
Summary 46
Exercises 46
References 48

Chapter 2 Algorithm Analysis 51


2.1 Mathematical Background 51
2.2 Model 54
2.3 What to Analyze 54
2.4 Running-Time Calculations 57
2.4.1 A Simple Example 58
2.4.2 General Rules 58
2.4.3 Solutions for the Maximum Subsequence
Sum Problem 60
2.4.4 Logarithms in the Running Time 66
2.4.5 Limitations of Worst-Case Analysis 70
Summary 70
Exercises 71
References 76

Chapter 3 Lists, Stacks, and Queues 77


3.1 Abstract Data Types (ADTs) 77
3.2 The List ADT 78
3.2.1 Simple Array Implementation of Lists 78
3.2.2 Simple Linked Lists 79
3.3 vector and list in the STL 80
3.3.1 Iterators 82
3.3.2 Example: Using erase on a List 83
3.3.3 const_iterators 84
3.4 Implementation of vector 86
3.5 Implementation of list 91
3.6 The Stack ADT 103
3.6.1 Stack Model 103
3.6.2 Implementation of Stacks 104
3.6.3 Applications 104
3.7 The Queue ADT 112
3.7.1 Queue Model 113
3.7.2 Array Implementation of Queues 113
3.7.3 Applications of Queues 115
Summary 116
Exercises 116
Contents ix

Chapter 4 Trees 121


4.1 Preliminaries 121
4.1.1 Implementation of Trees 122
4.1.2 Tree Traversals with an Application 123
4.2 Binary Trees 126
4.2.1 Implementation 128
4.2.2 An Example: Expression Trees 128
4.3 The Search Tree ADT—Binary Search Trees 132
4.3.1 contains 134
4.3.2 findMin and findMax 135
4.3.3 insert 136
4.3.4 remove 139
4.3.5 Destructor and Copy Constructor 141
4.3.6 Average-Case Analysis 141
4.4 AVL Trees 144
4.4.1 Single Rotation 147
4.4.2 Double Rotation 149
4.5 Splay Trees 158
4.5.1 A Simple Idea (That Does Not Work) 158
4.5.2 Splaying 160
4.6 Tree Traversals (Revisited) 166
4.7 B-Trees 168
4.8 Sets and Maps in the Standard Library 173
4.8.1 Sets 173
4.8.2 Maps 174
4.8.3 Implementation of set and map 175
4.8.4 An Example That Uses Several Maps 176
Summary 181
Exercises 182
References 189

Chapter 5 Hashing 193


5.1 General Idea 193
5.2 Hash Function 194
5.3 Separate Chaining 196
5.4 Hash Tables without Linked Lists 201
5.4.1 Linear Probing 201
5.4.2 Quadratic Probing 202
5.4.3 Double Hashing 207
5.5 Rehashing 208
5.6 Hash Tables in the Standard Library 210
x Contents

5.7 Hash Tables with Worst-Case O(1) Access 212


5.7.1 Perfect Hashing 213
5.7.2 Cuckoo Hashing 215
5.7.3 Hopscotch Hashing 227
5.8 Universal Hashing 230
5.9 Extendible Hashing 233
Summary 236
Exercises 237
References 241

Chapter 6 Priority Queues (Heaps) 245


6.1 Model 245
6.2 Simple Implementations 246
6.3 Binary Heap 247
6.3.1 Structure Property 247
6.3.2 Heap-Order Property 248
6.3.3 Basic Heap Operations 249
6.3.4 Other Heap Operations 252
6.4 Applications of Priority Queues 257
6.4.1 The Selection Problem 258
6.4.2 Event Simulation 259
6.5 d-Heaps 260
6.6 Leftist Heaps 261
6.6.1 Leftist Heap Property 261
6.6.2 Leftist Heap Operations 262
6.7 Skew Heaps 269
6.8 Binomial Queues 271
6.8.1 Binomial Queue Structure 271
6.8.2 Binomial Queue Operations 271
6.8.3 Implementation of Binomial Queues 276
6.9 Priority Queues in the Standard Library 282
Summary 283
Exercises 283
References 288

Chapter 7 Sorting 291


7.1 Preliminaries 291
7.2 Insertion Sort 292
7.2.1 The Algorithm 292
7.2.2 STL Implementation of Insertion Sort 293
7.2.3 Analysis of Insertion Sort 294
7.3 A Lower Bound for Simple Sorting Algorithms 295
Contents xi

7.4 Shellsort 296


7.4.1 Worst-Case Analysis of Shellsort 297
7.5 Heapsort 300
7.5.1 Analysis of Heapsort 301
7.6 Mergesort 304
7.6.1 Analysis of Mergesort 306
7.7 Quicksort 309
7.7.1 Picking the Pivot 311
7.7.2 Partitioning Strategy 313
7.7.3 Small Arrays 315
7.7.4 Actual Quicksort Routines 315
7.7.5 Analysis of Quicksort 318
7.7.6 A Linear-Expected-Time Algorithm for Selection 321
7.8 A General Lower Bound for Sorting 323
7.8.1 Decision Trees 323
7.9 Decision-Tree Lower Bounds for Selection Problems 325
7.10 Adversary Lower Bounds 328
7.11 Linear-Time Sorts: Bucket Sort and Radix Sort 331
7.12 External Sorting 336
7.12.1 Why We Need New Algorithms 336
7.12.2 Model for External Sorting 336
7.12.3 The Simple Algorithm 337
7.12.4 Multiway Merge 338
7.12.5 Polyphase Merge 339
7.12.6 Replacement Selection 340
Summary 341
Exercises 341
References 347

Chapter 8 The Disjoint Sets Class 351


8.1 Equivalence Relations 351
8.2 The Dynamic Equivalence Problem 352
8.3 Basic Data Structure 353
8.4 Smart Union Algorithms 357
8.5 Path Compression 360
8.6 Worst Case for Union-by-Rank and Path Compression 361
8.6.1 Slowly Growing Functions 362
8.6.2 An Analysis by Recursive Decomposition 362
8.6.3 An O( M log * N ) Bound 369
8.6.4 An O( M α(M, N) ) Bound 370
8.7 An Application 372
xii Contents

Summary 374
Exercises 375
References 376

Chapter 9 Graph Algorithms 379


9.1 Definitions 379
9.1.1 Representation of Graphs 380
9.2 Topological Sort 382
9.3 Shortest-Path Algorithms 386
9.3.1 Unweighted Shortest Paths 387
9.3.2 Dijkstra’s Algorithm 391
9.3.3 Graphs with Negative Edge Costs 400
9.3.4 Acyclic Graphs 400
9.3.5 All-Pairs Shortest Path 404
9.3.6 Shortest Path Example 404
9.4 Network Flow Problems 406
9.4.1 A Simple Maximum-Flow Algorithm 408
9.5 Minimum Spanning Tree 413
9.5.1 Prim’s Algorithm 414
9.5.2 Kruskal’s Algorithm 417
9.6 Applications of Depth-First Search 419
9.6.1 Undirected Graphs 420
9.6.2 Biconnectivity 421
9.6.3 Euler Circuits 425
9.6.4 Directed Graphs 429
9.6.5 Finding Strong Components 431
9.7 Introduction to NP-Completeness 432
9.7.1 Easy vs. Hard 433
9.7.2 The Class NP 434
9.7.3 NP-Complete Problems 434
Summary 437
Exercises 437
References 445

Chapter 10 Algorithm Design Techniques 449


10.1 Greedy Algorithms 449
10.1.1 A Simple Scheduling Problem 450
10.1.2 Huffman Codes 453
10.1.3 Approximate Bin Packing 459
10.2 Divide and Conquer 467
10.2.1 Running Time of Divide-and-Conquer Algorithms 468
10.2.2 Closest-Points Problem 470
Contents xiii

10.2.3 The Selection Problem 475


10.2.4 Theoretical Improvements for Arithmetic Problems 478
10.3 Dynamic Programming 482
10.3.1 Using a Table Instead of Recursion 483
10.3.2 Ordering Matrix Multiplications 485
10.3.3 Optimal Binary Search Tree 487
10.3.4 All-Pairs Shortest Path 491
10.4 Randomized Algorithms 494
10.4.1 Random-Number Generators 495
10.4.2 Skip Lists 500
10.4.3 Primality Testing 503
10.5 Backtracking Algorithms 506
10.5.1 The Turnpike Reconstruction Problem 506
10.5.2 Games 511
Summary 518
Exercises 518
References 527

Chapter 11 Amortized Analysis 533


11.1 An Unrelated Puzzle 534
11.2 Binomial Queues 534
11.3 Skew Heaps 539
11.4 Fibonacci Heaps 541
11.4.1 Cutting Nodes in Leftist Heaps 542
11.4.2 Lazy Merging for Binomial Queues 544
11.4.3 The Fibonacci Heap Operations 548
11.4.4 Proof of the Time Bound 549
11.5 Splay Trees 551
Summary 555
Exercises 556
References 557

Chapter 12 Advanced Data Structures


and Implementation 559
12.1 Top-Down Splay Trees 559
12.2 Red-Black Trees 566
12.2.1 Bottom-Up Insertion 567
12.2.2 Top-Down Red-Black Trees 568
12.2.3 Top-Down Deletion 570
12.3 Treaps 576
xiv Contents

12.4 Suffix Arrays and Suffix Trees 579


12.4.1 Suffix Arrays 580
12.4.2 Suffix Trees 583
12.4.3 Linear-Time Construction of Suffix Arrays and Suffix Trees 586
12.5 k-d Trees 596
12.6 Pairing Heaps 602
Summary 606
Exercises 608
References 612

Appendix A Separate Compilation of


Class Templates 615
A.1 Everything in the Header 616
A.2 Explicit Instantiation 616

Index 619
P R E FAC E

Purpose/Goals
The fourth edition of Data Structures and Algorithm Analysis in C++ describes data structures,
methods of organizing large amounts of data, and algorithm analysis, the estimation of the
running time of algorithms. As computers become faster and faster, the need for programs
that can handle large amounts of input becomes more acute. Paradoxically, this requires
more careful attention to efficiency, since inefficiencies in programs become most obvious
when input sizes are large. By analyzing an algorithm before it is actually coded, students
can decide if a particular solution will be feasible. For example, in this text students look at
specific problems and see how careful implementations can reduce the time constraint for
large amounts of data from centuries to less than a second. Therefore, no algorithm or data
structure is presented without an explanation of its running time. In some cases, minute
details that affect the running time of the implementation are explored.
Once a solution method is determined, a program must still be written. As computers
have become more powerful, the problems they must solve have become larger and more
complex, requiring development of more intricate programs. The goal of this text is to teach
students good programming and algorithm analysis skills simultaneously so that they can
develop such programs with the maximum amount of efficiency.
This book is suitable for either an advanced data structures course or a first-year
graduate course in algorithm analysis. Students should have some knowledge of inter-
mediate programming, including such topics as pointers, recursion, and object-based
programming, as well as some background in discrete math.

Approach
Although the material in this text is largely language-independent, programming requires
the use of a specific language. As the title implies, we have chosen C++ for this book.
C++ has become a leading systems programming language. In addition to fixing many
of the syntactic flaws of C, C++ provides direct constructs (the class and template) to
implement generic data structures as abstract data types.
The most difficult part of writing this book was deciding on the amount of C++ to
include. Use too many features of C++ and one gets an incomprehensible text; use too few
and you have little more than a C text that supports classes.
The approach we take is to present the material in an object-based approach. As such,
there is almost no use of inheritance in the text. We use class templates to describe generic
data structures. We generally avoid esoteric C++ features and use the vector and string
classes that are now part of the C++ standard. Previous editions have implemented class
templates by separating the class template interface from its implementation. Although
this is arguably the preferred approach, it exposes compiler problems that have made it xv
xvi Preface

difficult for readers to actually use the code. As a result, in this edition the online code
represents class templates as a single unit, with no separation of interface and implementa-
tion. Chapter 1 provides a review of the C++ features that are used throughout the text and
describes our approach to class templates. Appendix A describes how the class templates
could be rewritten to use separate compilation.
Complete versions of the data structures, in both C++ and Java, are available on
the Internet. We use similar coding conventions to make the parallels between the two
languages more evident.

Summary of the Most Significant Changes in the Fourth Edition


The fourth edition incorporates numerous bug fixes, and many parts of the book have
undergone revision to increase the clarity of presentation. In addition,

r Chapter 4 includes implementation of the AVL tree deletion algorithm—a topic often
requested by readers.
r Chapter 5 has been extensively revised and enlarged and now contains material on
two newer algorithms: cuckoo hashing and hopscotch hashing. Additionally, a new
section on universal hashing has been added. Also new is a brief discussion of the
unordered_set and unordered_map class templates introduced in C++11.
r Chapter 6 is mostly unchanged; however, the implementation of the binary heap makes
use of move operations that were introduced in C++11.
r Chapter 7 now contains material on radix sort, and a new section on lower-bound
proofs has been added. Sorting code makes use of move operations that were
introduced in C++11.
r Chapter 8 uses the new union/find analysis by Seidel and Sharir and shows the
O( M α(M, N) ) bound instead of the weaker O( M log∗ N ) bound in prior editions.
r Chapter 12 adds material on suffix trees and suffix arrays, including the linear-time
suffix array construction algorithm by Karkkainen and Sanders (with implementation).
The sections covering deterministic skip lists and AA-trees have been removed.
r Throughout the text, the code has been updated to use C++11. Notably, this means
use of the new C++11 features, including the auto keyword, the range for loop, move
construction and assignment, and uniform initialization.

Overview
Chapter 1 contains review material on discrete math and recursion. I believe the only way
to be comfortable with recursion is to see good uses over and over. Therefore, recursion
is prevalent in this text, with examples in every chapter except Chapter 5. Chapter 1 also
includes material that serves as a review of basic C++. Included is a discussion of templates
and important constructs in C++ class design.
Chapter 2 deals with algorithm analysis. This chapter explains asymptotic analysis
and its major weaknesses. Many examples are provided, including an in-depth explana-
tion of logarithmic running time. Simple recursive programs are analyzed by intuitively
converting them into iterative programs. More complicated divide-and-conquer programs
are introduced, but some of the analysis (solving recurrence relations) is implicitly delayed
until Chapter 7, where it is performed in detail.
Preface xvii

Chapter 3 covers lists, stacks, and queues. This chapter includes a discussion of the STL
vector and list classes, including material on iterators, and it provides implementations
of a significant subset of the STL vector and list classes.
Chapter 4 covers trees, with an emphasis on search trees, including external search
trees (B-trees). The UNIX file system and expression trees are used as examples. AVL trees
and splay trees are introduced. More careful treatment of search tree implementation details
is found in Chapter 12. Additional coverage of trees, such as file compression and game
trees, is deferred until Chapter 10. Data structures for an external medium are considered
as the final topic in several chapters. Included is a discussion of the STL set and map classes,
including a significant example that illustrates the use of three separate maps to efficiently
solve a problem.
Chapter 5 discusses hash tables, including the classic algorithms such as sepa-
rate chaining and linear and quadratic probing, as well as several newer algorithms,
namely cuckoo hashing and hopscotch hashing. Universal hashing is also discussed, and
extendible hashing is covered at the end of the chapter.
Chapter 6 is about priority queues. Binary heaps are covered, and there is additional
material on some of the theoretically interesting implementations of priority queues. The
Fibonacci heap is discussed in Chapter 11, and the pairing heap is discussed in Chapter 12.
Chapter 7 covers sorting. It is very specific with respect to coding details and analysis.
All the important general-purpose sorting algorithms are covered and compared. Four
algorithms are analyzed in detail: insertion sort, Shellsort, heapsort, and quicksort. New to
this edition is radix sort and lower bound proofs for selection-related problems. External
sorting is covered at the end of the chapter.
Chapter 8 discusses the disjoint set algorithm with proof of the running time. This is a
short and specific chapter that can be skipped if Kruskal’s algorithm is not discussed.
Chapter 9 covers graph algorithms. Algorithms on graphs are interesting, not only
because they frequently occur in practice but also because their running time is so heavily
dependent on the proper use of data structures. Virtually all of the standard algorithms
are presented along with appropriate data structures, pseudocode, and analysis of running
time. To place these problems in a proper context, a short discussion on complexity theory
(including NP-completeness and undecidability) is provided.
Chapter 10 covers algorithm design by examining common problem-solving tech-
niques. This chapter is heavily fortified with examples. Pseudocode is used in these later
chapters so that the student’s appreciation of an example algorithm is not obscured by
implementation details.
Chapter 11 deals with amortized analysis. Three data structures from Chapters 4 and
6 and the Fibonacci heap, introduced in this chapter, are analyzed.
Chapter 12 covers search tree algorithms, the suffix tree and array, the k-d tree, and
the pairing heap. This chapter departs from the rest of the text by providing complete and
careful implementations for the search trees and pairing heap. The material is structured so
that the instructor can integrate sections into discussions from other chapters. For example,
the top-down red-black tree in Chapter 12 can be discussed along with AVL trees (in
Chapter 4).
Chapters 1 to 9 provide enough material for most one-semester data structures courses.
If time permits, then Chapter 10 can be covered. A graduate course on algorithm analysis
could cover chapters 7 to 11. The advanced data structures analyzed in Chapter 11 can
easily be referred to in the earlier chapters. The discussion of NP-completeness in Chapter 9
xviii Preface

is far too brief to be used in such a course. You might find it useful to use an additional
work on NP-completeness to augment this text.

Exercises
Exercises, provided at the end of each chapter, match the order in which material is pre-
sented. The last exercises may address the chapter as a whole rather than a specific section.
Difficult exercises are marked with an asterisk, and more challenging exercises have two
asterisks.

References
References are placed at the end of each chapter. Generally the references either are his-
torical, representing the original source of the material, or they represent extensions and
improvements to the results given in the text. Some references represent solutions to
exercises.

Supplements
The following supplements are available to all readers at http://cssupport.pearsoncmg.com/

r Source code for example programs


r Errata

In addition, the following material is available only to qualified instructors at Pearson


Instructor Resource Center (www.pearsonhighered.com/irc). Visit the IRC or contact your
Pearson Education sales representative for access.

r Solutions to selected exercises


r Figures from the book
r Errata

Acknowledgments
Many, many people have helped me in the preparation of books in this series. Some are
listed in other versions of the book; thanks to all.
As usual, the writing process was made easier by the professionals at Pearson. I’d like
to thank my editor, Tracy Johnson, and production editor, Marilyn Lloyd. My wonderful
wife Jill deserves extra special thanks for everything she does.
Finally, I’d like to thank the numerous readers who have sent e-mail messages and
pointed out errors or inconsistencies in earlier versions. My website www.cis.fiu.edu/~weiss
will also contain updated source code (in C++ and Java), an errata list, and a link to submit
bug reports.
M.A.W.
Miami, Florida
C H A P T E R 1

Programming: A General
Overview

In this chapter, we discuss the aims and goals of this text and briefly review programming
concepts and discrete mathematics. We will . . .

r See that how a program performs for reasonably large input is just as important as its
performance on moderate amounts of input.
r Summarize the basic mathematical background needed for the rest of the book.
r Briefly review recursion.
r Summarize some important features of C++ that are used throughout the text.

1.1 What’s This Book About?


Suppose you have a group of N numbers and would like to determine the kth largest. This
is known as the selection problem. Most students who have had a programming course
or two would have no difficulty writing a program to solve this problem. There are quite a
few “obvious” solutions.
One way to solve this problem would be to read the N numbers into an array, sort the
array in decreasing order by some simple algorithm such as bubble sort, and then return
the element in position k.
A somewhat better algorithm might be to read the first k elements into an array and
sort them (in decreasing order). Next, each remaining element is read one by one. As a new
element arrives, it is ignored if it is smaller than the kth element in the array. Otherwise, it
is placed in its correct spot in the array, bumping one element out of the array. When the
algorithm ends, the element in the kth position is returned as the answer.
Both algorithms are simple to code, and you are encouraged to do so. The natural ques-
tions, then, are: Which algorithm is better? And, more important, Is either algorithm good
enough? A simulation using a random file of 30 million elements and k = 15,000,000
will show that neither algorithm finishes in a reasonable amount of time; each requires
several days of computer processing to terminate (albeit eventually with a correct answer).
An alternative method, discussed in Chapter 7, gives a solution in about a second. Thus,
although our proposed algorithms work, they cannot be considered good algorithms, 1
2 Chapter 1 Programming: A General Overview

1 2 3 4

1 t h i s
2 w a t s
3 o a h g
4 f g d t

Figure 1.1 Sample word puzzle

because they are entirely impractical for input sizes that a third algorithm can handle in a
reasonable amount of time.
A second problem is to solve a popular word puzzle. The input consists of a two-
dimensional array of letters and a list of words. The object is to find the words in the puzzle.
These words may be horizontal, vertical, or diagonal in any direction. As an example, the
puzzle shown in Figure 1.1 contains the words this, two, fat, and that. The word this begins
at row 1, column 1, or (1,1), and extends to (1,4); two goes from (1,1) to (3,1); fat goes
from (4,1) to (2,3); and that goes from (4,4) to (1,1).
Again, there are at least two straightforward algorithms that solve the problem. For each
word in the word list, we check each ordered triple (row, column, orientation) for the pres-
ence of the word. This amounts to lots of nested for loops but is basically straightforward.
Alternatively, for each ordered quadruple (row, column, orientation, number of characters)
that doesn’t run off an end of the puzzle, we can test whether the word indicated is in the
word list. Again, this amounts to lots of nested for loops. It is possible to save some time
if the maximum number of characters in any word is known.
It is relatively easy to code up either method of solution and solve many of the real-life
puzzles commonly published in magazines. These typically have 16 rows, 16 columns, and
40 or so words. Suppose, however, we consider the variation where only the puzzle board is
given and the word list is essentially an English dictionary. Both of the solutions proposed
require considerable time to solve this problem and therefore might not be acceptable.
However, it is possible, even with a large word list, to solve the problem very quickly.
An important concept is that, in many problems, writing a working program is not
good enough. If the program is to be run on a large data set, then the running time becomes
an issue. Throughout this book we will see how to estimate the running time of a program
for large inputs and, more important, how to compare the running times of two programs
without actually coding them. We will see techniques for drastically improving the speed
of a program and for determining program bottlenecks. These techniques will enable us to
find the section of the code on which to concentrate our optimization efforts.

1.2 Mathematics Review


This section lists some of the basic formulas you need to memorize, or be able to derive,
and reviews basic proof techniques.
1.2 Mathematics Review 3

1.2.1 Exponents
XA XB = XA+B
XA
= XA−B
XB
(XA )B = XAB
XN + XN = 2XN = X2N
2N + 2N = 2N+1

1.2.2 Logarithms
In computer science, all logarithms are to the base 2 unless specified otherwise.
Definition 1.1
XA = B if and only if logX B = A
Several convenient equalities follow from this definition.
Theorem 1.1

logC B
logA B = ; A, B, C > 0, A = 1
logC A

Proof
Let X = logC B, Y = logC A, and Z = logA B. Then, by the definition of loga-
rithms, CX = B, CY = A, and AZ = B. Combining these three equalities yields
B = CX = (CY )Z . Therefore, X = YZ, which implies Z = X/Y, proving the theorem.
Theorem 1.2

log AB = log A + log B; A, B > 0

Proof
Let X = log A, Y = log B, and Z = log AB. Then, assuming the default base of 2,
2X = A, 2Y = B, and 2Z = AB. Combining the last three equalities yields
2X 2Y = AB = 2Z . Therefore, X + Y = Z, which proves the theorem.
Some other useful formulas, which can all be derived in a similar manner, follow.

log A/B = log A − log B

log(AB ) = B log A

log X < X for all X > 0

log 1 = 0, log 2 = 1, log 1,024 = 10, log 1,048,576 = 20


4 Chapter 1 Programming: A General Overview

1.2.3 Series
The easiest formulas to remember are

N
2i = 2N+1 − 1
i=0

and the companion,



N
AN+1 − 1
Ai =
A−1
i=0

In the latter formula, if 0 < A < 1, then



N
1
Ai ≤
1−A
i=0

and as N tends to ∞, the sum approaches 1/(1 − A). These are the “geometric series”
formulas. 
We can derive the last formula for ∞i=0 A (0 < A < 1) in the following manner. Let
i

S be the sum. Then


S = 1 + A + A2 + A3 + A4 + A5 + · · ·
Then
AS = A + A2 + A3 + A4 + A5 + · · ·
If we subtract these two equations (which is permissible only for a convergent series),
virtually all the terms on the right side cancel, leaving
S − AS = 1
which implies that
1
S=
1−A

We can use this same technique to compute ∞ i
i=1 i/2 , a sum that occurs frequently.
We write
1 2 3 4 5
S = + 2 + 3 + 4 + 5 + ···
2 2 2 2 2
and multiply by 2, obtaining
2 3 4 5 6
2S = 1 + + + 3 + 4 + 5 + ···
2 22 2 2 2
Subtracting these two equations yields
1 1 1 1 1
S=1+ + + 3 + 4 + 5 + ···
2 22 2 2 2
Thus, S = 2.
1.2 Mathematics Review 5

Another type of common series in analysis is the arithmetic series. Any such series can
be evaluated from the basic formula:


N
N(N + 1) N2
i= ≈
2 2
i=1

For instance, to find the sum 2 + 5 + 8 + · · · + (3k − 1), rewrite it as 3(1 + 2 + 3 +


· · · + k) − (1 + 1 + 1 + · · · + 1), which is clearly 3k(k + 1)/2 − k. Another way to remember
this is to add the first and last terms (total 3k + 1), the second and next-to-last terms (total
3k + 1), and so on. Since there are k/2 of these pairs, the total sum is k(3k + 1)/2, which
is the same answer as before.
The next two formulas pop up now and then but are fairly uncommon.


N
N(N + 1)(2N + 1) N3
i2 = ≈
6 3
i=1

N
Nk+1
ik ≈ k = −1
|k + 1|
i=1

When k = −1, the latter formula is not valid. We then need the following formula,
which is used far more in computer science than in other mathematical disciplines. The
numbers HN are known as the harmonic numbers, and the sum is known as a harmonic
sum. The error in the following approximation tends to γ ≈ 0.57721566, which is known
as Euler’s constant.


N
1
HN = ≈ loge N
i
i=1

These two formulas are just general algebraic manipulations:


N
f(N) = Nf(N)
i=1

N 
N 0 −1
n
f(i) = f(i) − f(i)
i=n0 i=1 i=1

1.2.4 Modular Arithmetic


We say that A is congruent to B modulo N, written A ≡ B (mod N), if N divides
A − B. Intuitively, this means that the remainder is the same when either A or B is
divided by N. Thus, 81 ≡ 61 ≡ 1 (mod 10). As with equality, if A ≡ B (mod N), then
A + C ≡ B + C (mod N) and AD ≡ BD (mod N).
6 Chapter 1 Programming: A General Overview

Often, N is a prime number. In that case, there are three important theorems:

First, if N is prime, then ab ≡ 0 (mod N) is true if and only if a ≡ 0 (mod N)


or b ≡ 0 (mod N). In other words, if a prime number N divides a product of two
numbers, it divides at least one of the two numbers.
Second, if N is prime, then the equation ax ≡ 1 (mod N) has a unique solution
(mod N) for all 0 < a < N. This solution, 0 < x < N, is the multiplicative inverse.
Third, if N is prime, then the equation x2 ≡ a (mod N) has either two solutions
(mod N) for all 0 < a < N, or it has no solutions.

There are many theorems that apply to modular arithmetic, and some of them require
extraordinary proofs in number theory. We will use modular arithmetic sparingly, and the
preceding theorems will suffice.

1.2.5 The P Word


The two most common ways of proving statements in data-structure analysis are proof
by induction and proof by contradiction (and occasionally proof by intimidation, used
by professors only). The best way of proving that a theorem is false is by exhibiting a
counterexample.

Proof by Induction
A proof by induction has two standard parts. The first step is proving a base case, that is,
establishing that a theorem is true for some small (usually degenerate) value(s); this step is
almost always trivial. Next, an inductive hypothesis is assumed. Generally this means that
the theorem is assumed to be true for all cases up to some limit k. Using this assumption,
the theorem is then shown to be true for the next value, which is typically k + 1. This
proves the theorem (as long as k is finite).
As an example, we prove that the Fibonacci numbers, F0 = 1, F1 = 1, F2 = 2, F3 = 3,
F4 = 5, . . . , Fi = Fi−1 + Fi−2 , satisfy Fi < (5/3)i , for i ≥ 1. (Some definitions have F0 = 0,
which shifts the series.) To do this, we first verify that the theorem is true for the trivial
cases. It is easy to verify that F1 = 1 < 5/3 and F2 = 2 < 25/9; this proves the basis.
We assume that the theorem is true for i = 1, 2, . . . , k; this is the inductive hypothesis. To
prove the theorem, we need to show that Fk+1 < (5/3)k+1 . We have

Fk+1 = Fk + Fk−1

by the definition, and we can use the inductive hypothesis on the right-hand side,
obtaining

Fk+1 < (5/3)k + (5/3)k−1


< (3/5)(5/3)k+1 + (3/5)2 (5/3)k+1
< (3/5)(5/3)k+1 + (9/25)(5/3)k+1
which simplifies to
Other documents randomly have
different content
Straw, 46, 57
―, amount of bleaching powder needed by, 112
―, boiled, washing, 100
―, boilers for, 99
―, boiling, 100
―, cellulose yield from, 98
―, cleaning, 100
―, composition, 59, 99
―, cutting, 100
―, dimensions of cells, 58
―, general chemical characteristics, 58
― in paper, detecting, 200, 201
―, microscopic features, 57
― paper, source of weakness, 103
―, pressure in boiling, 100
―, proportion of soda for, 99
― pulp, ash, 136
― ―, chlorinating, 102
― ―, dimensions of fibre, 119
― pulp, draining, 100
― ―, dry, preparing, 119
― ―, grinding, 101
― ―, yield, 99
―, soda treatment, 98
―, treating for paper, 63
― washer, 101
Strengths of alum solutions, table, 143
― of paper, classification, 197
― ―, influence of glazing, 198
― ―, measuring, 193
Sugar-cane fibre, 59
Sulphide processes, economy of, 68
― ―, malodours of, 68
Sulphite processes, objection to, 75
Sulphur, action on cellulose, 130
― and lime for neutralising bleaching powder, 129
Sulphuric acid and cellulose, 12
― ― and ligno-cellulose, 22
― ― in bleaching pulps, 112
Sulphurous acid for isolating cellulose, 64
― ― processes for wood, 70
― ― processes, objection to, 75
Sunda, see Sunn hemp.
Sunn hemp, 44, 46, 50
― ―, characters, 50
― ―, composition, 50
― ―, general chemical characteristics, 50
― ―, micro-chemical reactions, 50
― ―, microscopic features, 50
Synthesis of cellulose, 15

Table of processes for resolving wood, 78


― of strengths of alum solutions, 143
― ― ― of caustic soda solutions, 109
Teazing needles, 38
Telegram paper, 104
Test paper, making, 130
Testing antichlor, 130
― iodine solution, 36
― paper, 193
― ― by rubbing, 197
Textile trade waste, treating for paper, 62
Thickness of paper, gauging, 153
― ― ―, measuring, 198
Thompson’s rag-bleaching process, 115
Thune’s mechanical wood pulp, 107
Tilghmann’s sulphurous acid process, 70
Tilia grandifolia fibre, 39, 54
Time of boiling rags, 84
Toned paper, 142
Trade statistics, 221
Triacetyl cellulose, 8
Tub sizing, 137
― ― on the machine, 160
Twaddle degrees, converting into specific gravity, 109

Ultramarine, 141
Umpherstoil’s beater, 123
Urtica dioica fibre, 52
― heterophylla fibre, 44

Vacuum strainer, 148


Victory cutter, 174
Vinegar plant forming cellulose, 16
Vomiting boiler, 91
Washing boiled esparto, 95
― ― rags, 85
― ― straw, 100
― out bleaching liquor from half-stuff, 127
Waste paper, pulp from, 104
Water and ligno-cellulose, 21
― at high temperature and cellulose, 15
―, clarifier, 211
―, clarifying, 125
―, filter bags, 126
― for beaters, 125
―, lime salts, 212
― marks, 145, 156
―, Porter-Clark process, 214
― proportion to pulp in beating, 118
―, purification, 211
―, quantity for boiling rags, 84
― resolving wood by, 65
―, settling ponds, 125
―, soft, objections to, 216
―, soluble impurities, 212
Water supply, 210
Web glazing, 167
Webster on analysis of fibres, 42
Weighing paper ash, 134
Weight per ream, 176
Weighting paper, 130
Wet end of machine, 154
― felt, 157
Wheat straw, 98
White fir fibre, 61
― pine for mechanical wood pulp, 108
Width of paper, gauging, 152
Willesden canvas, 219
― paper, 219
― scrim, 219
― welded goods, 220
Willowing adansonia fibre, 103
― jute, 103
― Manilla hemp, 103
― rags, 81
Winding, 160
Wire-cloth, 153
― in rag washer, 87
―, shifting, 156
Wood, acid processes, 69
―, amount of bleaching powder needed by, 112
―, bisulphite processes, 71
―, boiling with sulphites, 74
―, chemical, in paper, detecting, 200
―, cutting up for pulp, 105
―, grinding, 105
―, mechanical, in paper, detecting, 200, 201
―, objection to acid in bleaching, 112
― processes, table of, 78
― pulps, 60
― ―, ash, 136
― ― beating, 117
― ―, dimensions of fibre, 119
― ―, dry, preparing, 119
― ― from aspen, 108
― ― from white pine, 108
― ―, mechanical, 105
― ―, ―, quantitative estimation, 202
― ―, statistics, 224
―, resolving by water, 65
―, Schultze’s method of isolating cellulose from, 21
―, soaking, 107
― splitting machine, 74
―, steaming, 107
― suitable for Ekman’s process, 73
―, sulphide treatment, 67
―, sulphurous acid processes, 70
―, treating for paper, 64
Woods, pulp yield of, 77
Wool fibre, character, 31
Wove paper, 156
Wrapping paper, 104

Yankee machine, 164


Yaryan evaporator, 232
Young and Pettigrew’s acid process, 69
Yucca gloriosa fibre, 44, 46
Zinc chloride and cellulose, 13
LONDON: PRINTED BY WM. CLOWES AND SONS, LIMITED, STAMFORD STREET AND
CHARING CROSS.
ADVE RTISEM EN TS.

First-class Medal, London International Exhibition, 1862.


SPECIALTIES. SPECIALTIES.
Improved Paper Making Machines Improved Damping Rolls.
(nearly 100 at work). Patent Deckle for Wire Frames
Presse Pâte Machines. (Archibald and Purdie’s).
Single Cylinder Machines. Patent Wire Guide.
Patent Flat Strainers (over 200 at Improved Pulp Engines.
work). Direct Driving Gear for Pulp Engines.
Special Strainer Plates. Pumps of All Kinds.
Kollergangs or Edge Runners. Hydraulic Presses and Hoists.
Angle and Square Paper Cutters. ALSO
Slitting and Winding Machines. Steam En­gines of all Clas­ses, High-
Web Glazing Calenders. pres­sure. Con­dens­ing, or Com­pound,
Superior Chilled Rolls. up to any in­di­cat­ed Horse-pow­er, Ov­er
Patent Cone Beater. 300 at work.
Sheet and Boarding Calenders.
COMPRISING:
Fourdrinier Paper Machines, of the Ripping and Winding Machines.
most modern construction, of any Reeling Machines (in­clud­ing Lowe’s
specified width, and having any Pat­ent).
required number of Cylinders. Improved Revolving Paper Cutters.
Single Cylinder, Millboard and Square and Circular Dusters.
Half-Stuff Machines. Double and Single Willows.
Revolving and Flat Strainers Hydraulic Presses, Agitators, Stuff
(including Wrigley and Robertson’s Chests.
Patent). Mixing Pans and Cisterns.
Rag and Rope Choppers of various Double and Single Acting Pumps of
sizes. all sizes, for Water, Pulp, or
Spherical or Cylindrical Revolving Chemicals.
Boilers and Vertical Boilers, in Brass Couch and Press Rolls, and
Wrought Iron or Steel. Brass Strainer Plates.
Rag Engines of all Sizes, with Steam Boilers, Steam Engines.
Troughs cast in one piece, or in Shafting, Pulleys, Pipes, &c.
segments.
Web and Plate Glazing Calenders,
with Rolls of Chilled Iron, Steel,
Brass, Paper, or Cotton.
LONDON OFFICE:—7, QUEEN VICTORIA STREET.
Fcap. 8vo, cloth, price 3s.

THE PRACTICAL PAPER-


MAKER.
BY JAMES DUNBAR.
Third Edition.

SPONS’
ENCYCLOPÆDIA OF RAW MATERIALS AND
MANUFACTURES.
Parts XV. and XVI.—FIBROUS SUBSTANCES.
Part XXIV.—PAPER.
Price 2s. each Part.
E. & F. N. SPON, 125, Strand, London.
New York: 35, Murray Street.

PURE POWDERED 98% CAUSTIC SODA.


BLEACHING POWDER
OF EXTRA STRENGTH.

ALUMINATE OF SODA,
Substitute for Alum: a new Specialty for Paper Makers.
ABOVE IN ALL SIZES OF PACKAGES TO SUIT LARGE OR SMALL
CONSUMERS.
Correspondence invited. Special information given.

Greenbank Alkali Works


Co.,
ST. HELENS, LANCASHIRE.
ESTABLISHED 1866.
CONTENTS:
Bookbinding — Bronzes — Candles — Cement — Cleaning — Concretes — Dyeing —
Elec­tro-Me­tal­lurgy — Enamels — Engraving — Etching — Firework Making — Freez­ing —
Ful­mi­nates — Fur­ni­ture Creams, Oils, Polishes, Lacquers, and Pastes — Gilding — Glass
Cutting — Glass Making — Graining — Gums — Horn Working — India-rubber — Ink —
Japans — Lacquers — Marble Working — Matches — Mortars — Paper Hanging —
Painting in Oils — Photography — Polishes — Pottery — Silvering — Soap-Solders —
Taxidermy — Treating Horn, Mother-o’-Pearl, and like substances — Varnishes —
Veneering — Whitewashing, &c., &c.

Crown 8vo, cloth, 5s.

WORKSHOP RECEIPTS
(SECOND SERIES).
B Y R OBERT H ALDANE .
Devoted mainly to subjects connected with Chemical Manufactures. An
entirely New Volume. Uniform in Size, Style, and Type with the Original
‘Workshop Receipts.’
CONTENTS.
Acidimetry and Alkalimetry — Albumen — Alcohol — Alkaloids — Baking Powders —
Bitters — Bleaching — Boiler Incrustations — Cements and Lutes — Cleansing —
Confectionery — Copying — Disinfectants — Dyeing — Staining and Colouring —
Essences — Extracts — Fireproofing — Gelatine — Glue and Size — Glycerine — Gut —
Hydrogen Peroxide — Inks — Iodine — Iodoform — Isinglass — Ivory Substitutes —
Leather — Luminous Bodies — Magnesia — Matches — Paper — Parchment — Perchloric
Acid — Pigments — Paint and Painting — Potassium Oxalate — Preserving.
E. & F. N. SPON, 125, Strand, London.
Crown 8vo, cloth, 5s.

WORKSHOP RECEIPTS
(THIRD SERIES).
B Y C. G. WARNFORD LOCK, F.L.S.
Devoted mainly to Electrical and Metallurgical subjects.
CONTENTS:
Alloys — Aluminium — Antimony — Barium — Beryllium — Bismuth — Cadmium —
Cæsium — Calcium — Cerrium — Chromium — Cobalt — Copper — Didymium —
Electrics (including alarms, batteries, bells, carbons, coils [induction, intensity, and
resistance], dynamo-electric machines, fire risks, measuring, microphones, motors,
phonographs, photophones, storing, telephones) — Enamels and Glazes — Erbium —
Gallium — Glass — Gold — Indium — Iridium — Iron — Lacquers — Lanthanum — Lead
— Lithium — Lubricants — Magnesium — Manganese — Mercury — Mica — Molybdenum
— Nickel — Nisbium — Osmium — Palladium — Platinum — Potassium — Rhodium —
Rubidium — Ruthenium — Silenium — Silver — Slag — Sodium — Strontium — Tantalum
— Terbium — Thallium — Thorium — Tin — Titanium — Tungsten — Uranium —
Vanadium — Yttrium — Zinc — Zirconium.
Crown 8vo, cloth, 5s.

WORKSHOP RECEIPTS
(FOURTH SERIES).
By C. G. WARNFORD LOCK, F.L.S.
Devoted mainly to Handicrafts and Mechanical subjects.
250 Illustrations, with complete Index and a general Index to the Four
Series.
CONTENTS:
Waterproofing: rubber goods, cu­pram­mon­ium processes, miscellaneous preparations
— Packing and Storing articles of delicate odour or colour, of a deliquescent character,
liable to ignition, apt to suffer from insects or damp, or easily broken — Embalming and
Preserving anatomical specimens — Leather Polishes — Cooling Air and Water,
producing low temperatures, making ice, cooling syrups and solutions, and separating
salts from liquors by refrigeration — Pumps and Syphons, embracing every useful
contrivance for raising and supplying water on a moderate scale, and moving corrosive,
tenacious, and other liquids — Desiccating: air- and water-ovens, and other appliances
for drying natural and artificial products — Distilling: water, tinctures, extracts,
pharmaceutical preparations, essences, perfumes, and alcoholic liquids — Emulsifying as
required by pharmacists and photographers — Evaporating: saline and other solutions,
and liquids demanding special precautions — Filtering: water, and solutions of various
kinds — Percolating and Macerating — Electrotyping — Stereotyping by both plaster and
paper processes — Bookbinding in all its details — Straw Plaiting and the fabrication of
baskets, matting, etc. — Musical Instruments: the preservation, tuning, and repair of
pianos, harmoniums, musical boxes, etc. — Clock and Watch Mending: adapted for
intelligent amateurs — Photography: recent development in rapid processes, handy
apparatus numerous recipes for sensitizing and developing solutions, and applications to
modern illustrative purposes.
E. & F. N. SPON, 125, Strand, London.
SPONS’ ENCYCLOPÆDIA
OF THE

INDUSTRIAL ARTS, MANUFACTURES, & COMMERCIAL PRODUCTS.

E DITED BY C. G. WARNFORD LOCK, F.L.S., &c., &c.


In Super-royal 8vo, containing 2100 pp., and Illustrated by nearly 1500
Engravings.

Can be had in the following bindings:—


£ s. d.
In 2 vols., cloth 3 10 0
In 5 divisions, cloth 3 11 6
In 2 vols., half-morocco, top edge gilt,
bound in a superior manner 4 10 0
In 33 monthly parts, at 2s. each.
Any Part can be had separate, price 2s., postage 2d.
COMPLETE LIST OF ALL THE SUBJECTS.
Acids, Parts 1, 2, 3 | Alcohol, 3, 4 | Alkalies, 4, 5 | Alloys, 5, 6 | Arsenic, 6 | Asphalte, 6 |
Aerated Waters, 6 | Beer and Wine, 6, 7 | Beverages, 7, 8 | Bleaching Powder, 8 |
Bleaching, 8, 9 | Borax, 9 | Brushes, 9 | Buttons, 9 | Camphor, 9, 10 | Candles, 10 |
Carbon, 10 | Celluloid, 10 | Clays, 10 | Carbolic Acid, 11 | Coal-tar Products, 11 | Cocoa,
11 | Coffee, 11, 12 | Cork, 12 | Cotton Manufactures, 12, 13 | Drugs, 13 | Dyeing and
Calico Printing, 13, 14 | Dyestuffs, 14 | Electro-Metallurgy, 14 | Explosives, 14, 15 |
Feathers, 15 | Fibrous Substances, 15, 16 | Floor-cloth, 16 | Food Preservation, 16 |
Fruit, 16, 17 | Fur, 17 | Gas, Coal, 17 | Gems, 17 | Glass, 17 | Graphite, 18 | Hair
Manufactures, 18 | Hats, 18 | Ice, Artificial, 18 | Indiarubber Manufactures, 18, 19 | Ink,
19 | Jute Manufactures, 19 | Knitted Fabrics (Hosiery), 19 | Lace, 19 | Leather, 19, 20 |
Linen Manufactures, 20 | Manures, 20 | Matches, 20, 21 | Mordants, 21 | Narcotics, 21,
22 | Oils & Fatty Substances, 22, 23, 24 | Paper, 24 | Paraffin, 24 | Pearl and Coral, 24 |
Perfumes, 24 | Photography, 24, 25 | Pigments and Paint, 25 | Pottery, 25, 26 | Printing
and Engraving, 26 | Resinous and Gummy Substances, 26, 27 | Rope, 27 | Salt, 27, 28 |
Silk, 28 | Skins, 28 | Soap, Railway Grease, and Glycerine, 28, 29 | Spices, 29 | Starch,
29 | Sugar, 29, 30, 31 | Tannin, 31, 32 | Tea, 32 | Timber, 32 | Varnish, 32 | Wool and
Woollen Manufactures, 32, 33 |
E. & F. N. SPON, 125, Strand, London.
TRANSCRIBER’S NOTE:
Original spelling and grammar have been generally retained, with
some exceptions noted below. Original printed page numbers are
shown like this: {52}. Footnotes have been relabeled 1–18, and
moved from within paragraphs to nearby locations between
paragraphs. The transcriber produced the cover image and hereby
assigns it to the public domain. Original page images are available
from archive.org—search for “gri_33125007981968”.
Some missing full stops have been inserted. Many ditto marks
have been eliminated, replaced by repeated text. Enlarged curly
brackets “}{” employed to combine information in two or more lines
or columns have been eliminated, by restructuring text if necessary.
One such instance is the table on page 39. The table on page 44 and
some other large tables were moved from their original locations
inside a paragraph of text to nearby locations between paragraphs.
The page 44 table was also divided into two parts, after column six.
Illustrations have also been moved from within paragraphs of text to
nearby locations between paragraphs.
Page 12. “tranformation” to “transformation”. “C12H20O11” to
“C12H22O11”.
Page 14n. The note had no anchor; a new one has been inserted
after “in sealed glass”.
Page 17. “chemisty” to “chemistry”.
Page 65. “revolution” to “resolution”.
Page 136. “being therefore equivalent to one mgrm” is retained, but
presumably should be read “being therefore equivalent to ten
mgrm”.
Page 196n. The note had no anchor in the text. A new one has been
inserted after “papers published by the Institute for 1885.”, as a
plausible guess.
Page 197. “following seven groups” to “following eight groups”.
Page 220. “the following way” to “the following may”.
*** END OF THE PROJECT GUTENBERG EBOOK A TEXT-BOOK OF
PAPER-MAKING ***

Updated editions will replace the previous one—the old editions


will be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States copyright
in these works, so the Foundation (and you!) can copy and
distribute it in the United States without permission and without
paying copyright royalties. Special rules, set forth in the General
Terms of Use part of this license, apply to copying and
distributing Project Gutenberg™ electronic works to protect the
PROJECT GUTENBERG™ concept and trademark. Project
Gutenberg is a registered trademark, and may not be used if you
charge for an eBook, except by following the terms of the
trademark license, including paying royalties for use of the
Project Gutenberg trademark. If you do not charge anything for
copies of this eBook, complying with the trademark license is
very easy. You may use this eBook for nearly any purpose such
as creation of derivative works, reports, performances and
research. Project Gutenberg eBooks may be modified and
printed and given away—you may do practically ANYTHING in
the United States with eBooks not protected by U.S. copyright
law. Redistribution is subject to the trademark license, especially
commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG LICENSE
PLEASE READ THIS BEFORE YOU DISTRIBUTE OR USE THIS WORK

To protect the Project Gutenberg™ mission of promoting the free


distribution of electronic works, by using or distributing this work
(or any other work associated in any way with the phrase
“Project Gutenberg”), you agree to comply with all the terms of
the Full Project Gutenberg™ License available with this file or
online at www.gutenberg.org/license.

Section 1. General Terms of Use and


Redistributing Project Gutenberg™
electronic works
1.A. By reading or using any part of this Project Gutenberg™
electronic work, you indicate that you have read, understand,
agree to and accept all the terms of this license and intellectual
property (trademark/copyright) agreement. If you do not agree
to abide by all the terms of this agreement, you must cease
using and return or destroy all copies of Project Gutenberg™
electronic works in your possession. If you paid a fee for
obtaining a copy of or access to a Project Gutenberg™ electronic
work and you do not agree to be bound by the terms of this
agreement, you may obtain a refund from the person or entity to
whom you paid the fee as set forth in paragraph 1.E.8.

1.B. “Project Gutenberg” is a registered trademark. It may only


be used on or associated in any way with an electronic work by
people who agree to be bound by the terms of this agreement.
There are a few things that you can do with most Project
Gutenberg™ electronic works even without complying with the
full terms of this agreement. See paragraph 1.C below. There are
a lot of things you can do with Project Gutenberg™ electronic
works if you follow the terms of this agreement and help
preserve free future access to Project Gutenberg™ electronic
works. See paragraph 1.E below.
1.C. The Project Gutenberg Literary Archive Foundation (“the
Foundation” or PGLAF), owns a compilation copyright in the
collection of Project Gutenberg™ electronic works. Nearly all the
individual works in the collection are in the public domain in the
United States. If an individual work is unprotected by copyright
law in the United States and you are located in the United
States, we do not claim a right to prevent you from copying,
distributing, performing, displaying or creating derivative works
based on the work as long as all references to Project Gutenberg
are removed. Of course, we hope that you will support the
Project Gutenberg™ mission of promoting free access to
electronic works by freely sharing Project Gutenberg™ works in
compliance with the terms of this agreement for keeping the
Project Gutenberg™ name associated with the work. You can
easily comply with the terms of this agreement by keeping this
work in the same format with its attached full Project
Gutenberg™ License when you share it without charge with
others.

1.D. The copyright laws of the place where you are located also
govern what you can do with this work. Copyright laws in most
countries are in a constant state of change. If you are outside
the United States, check the laws of your country in addition to
the terms of this agreement before downloading, copying,
displaying, performing, distributing or creating derivative works
based on this work or any other Project Gutenberg™ work. The
Foundation makes no representations concerning the copyright
status of any work in any country other than the United States.

1.E. Unless you have removed all references to Project


Gutenberg:

1.E.1. The following sentence, with active links to, or other


immediate access to, the full Project Gutenberg™ License must
appear prominently whenever any copy of a Project Gutenberg™
work (any work on which the phrase “Project Gutenberg”
appears, or with which the phrase “Project Gutenberg” is
associated) is accessed, displayed, performed, viewed, copied or
distributed:

This eBook is for the use of anyone anywhere in the United


States and most other parts of the world at no cost and with
almost no restrictions whatsoever. You may copy it, give it
away or re-use it under the terms of the Project Gutenberg
License included with this eBook or online at
www.gutenberg.org. If you are not located in the United
States, you will have to check the laws of the country where
you are located before using this eBook.

1.E.2. If an individual Project Gutenberg™ electronic work is


derived from texts not protected by U.S. copyright law (does not
contain a notice indicating that it is posted with permission of
the copyright holder), the work can be copied and distributed to
anyone in the United States without paying any fees or charges.
If you are redistributing or providing access to a work with the
phrase “Project Gutenberg” associated with or appearing on the
work, you must comply either with the requirements of
paragraphs 1.E.1 through 1.E.7 or obtain permission for the use
of the work and the Project Gutenberg™ trademark as set forth
in paragraphs 1.E.8 or 1.E.9.

1.E.3. If an individual Project Gutenberg™ electronic work is


posted with the permission of the copyright holder, your use and
distribution must comply with both paragraphs 1.E.1 through
1.E.7 and any additional terms imposed by the copyright holder.
Additional terms will be linked to the Project Gutenberg™
License for all works posted with the permission of the copyright
holder found at the beginning of this work.

1.E.4. Do not unlink or detach or remove the full Project


Gutenberg™ License terms from this work, or any files
containing a part of this work or any other work associated with
Project Gutenberg™.
1.E.5. Do not copy, display, perform, distribute or redistribute
this electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1
with active links or immediate access to the full terms of the
Project Gutenberg™ License.

1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if you
provide access to or distribute copies of a Project Gutenberg™
work in a format other than “Plain Vanilla ASCII” or other format
used in the official version posted on the official Project
Gutenberg™ website (www.gutenberg.org), you must, at no
additional cost, fee or expense to the user, provide a copy, a
means of exporting a copy, or a means of obtaining a copy upon
request, of the work in its original “Plain Vanilla ASCII” or other
form. Any alternate format must include the full Project
Gutenberg™ License as specified in paragraph 1.E.1.

1.E.7. Do not charge a fee for access to, viewing, displaying,


performing, copying or distributing any Project Gutenberg™
works unless you comply with paragraph 1.E.8 or 1.E.9.

1.E.8. You may charge a reasonable fee for copies of or


providing access to or distributing Project Gutenberg™ electronic
works provided that:

• You pay a royalty fee of 20% of the gross profits you derive from the
use of Project Gutenberg™ works calculated using the method you
already use to calculate your applicable taxes. The fee is owed to the
owner of the Project Gutenberg™ trademark, but he has agreed to
donate royalties under this paragraph to the Project Gutenberg
Literary Archive Foundation. Royalty payments must be paid within
60 days following each date on which you prepare (or are legally
required to prepare) your periodic tax returns. Royalty payments
should be clearly marked as such and sent to the Project Gutenberg
Literary Archive Foundation at the address specified in Section 4,
“Information about donations to the Project Gutenberg Literary
Archive Foundation.”

• You provide a full refund of any money paid by a user who notifies
you in writing (or by e-mail) within 30 days of receipt that s/he does
not agree to the terms of the full Project Gutenberg™ License. You
must require such a user to return or destroy all copies of the works
possessed in a physical medium and discontinue all use of and all
access to other copies of Project Gutenberg™ works.

• You provide, in accordance with paragraph 1.F.3, a full refund of any


money paid for a work or a replacement copy, if a defect in the
electronic work is discovered and reported to you within 90 days of
receipt of the work.

• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.

1.E.9. If you wish to charge a fee or distribute a Project


Gutenberg™ electronic work or group of works on different
terms than are set forth in this agreement, you must obtain
permission in writing from the Project Gutenberg Literary Archive
Foundation, the manager of the Project Gutenberg™ trademark.
Contact the Foundation as set forth in Section 3 below.

1.F.

1.F.1. Project Gutenberg volunteers and employees expend


considerable effort to identify, do copyright research on,
transcribe and proofread works not protected by U.S. copyright
law in creating the Project Gutenberg™ collection. Despite these
efforts, Project Gutenberg™ electronic works, and the medium
on which they may be stored, may contain “Defects,” such as,
but not limited to, incomplete, inaccurate or corrupt data,
transcription errors, a copyright or other intellectual property
infringement, a defective or damaged disk or other medium, a
computer virus, or computer codes that damage or cannot be
read by your equipment.

1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except


for the “Right of Replacement or Refund” described in paragraph
1.F.3, the Project Gutenberg Literary Archive Foundation, the
owner of the Project Gutenberg™ trademark, and any other
party distributing a Project Gutenberg™ electronic work under
this agreement, disclaim all liability to you for damages, costs
and expenses, including legal fees. YOU AGREE THAT YOU HAVE
NO REMEDIES FOR NEGLIGENCE, STRICT LIABILITY, BREACH
OF WARRANTY OR BREACH OF CONTRACT EXCEPT THOSE
PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE THAT THE
FOUNDATION, THE TRADEMARK OWNER, AND ANY
DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE
TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL,
PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE
NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.

1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you


discover a defect in this electronic work within 90 days of
receiving it, you can receive a refund of the money (if any) you
paid for it by sending a written explanation to the person you
received the work from. If you received the work on a physical
medium, you must return the medium with your written
explanation. The person or entity that provided you with the
defective work may elect to provide a replacement copy in lieu of
a refund. If you received the work electronically, the person or
entity providing it to you may choose to give you a second
opportunity to receive the work electronically in lieu of a refund.
If the second copy is also defective, you may demand a refund
in writing without further opportunities to fix the problem.

1.F.4. Except for the limited right of replacement or refund set


forth in paragraph 1.F.3, this work is provided to you ‘AS-IS’,
WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR

You might also like