Data Structures & Algorithms using Kotlin, Second Edition Hemant Jain - Own the complete ebook with all chapters in PDF format
Data Structures & Algorithms using Kotlin, Second Edition Hemant Jain - Own the complete ebook with all chapters in PDF format
com
https://ebookmeta.com/product/data-structures-algorithms-
using-kotlin-second-edition-hemant-jain/
OR CLICK HERE
DOWLOAD EBOOK
https://ebookmeta.com/product/problem-solving-in-data-structures-
algorithms-using-c-2nd-edition-hemant-jain/
ebookmeta.com
https://ebookmeta.com/product/a-common-sense-guide-to-data-structures-
and-algorithms-second-edition-jay-wengrow/
ebookmeta.com
https://ebookmeta.com/product/data-structures-algorithms-in-python-
john-canning/
ebookmeta.com
https://ebookmeta.com/product/apostles-of-transformation-anthology-of-
muslim-women-trailblazers-in-india-akhtarul-wasey-juhi-gupta-eds/
ebookmeta.com
Find Your Way Home (Small Town Dreams #1) 1st Edition
Jackie Ashenden
https://ebookmeta.com/product/find-your-way-home-small-town-
dreams-1-1st-edition-jackie-ashenden/
ebookmeta.com
https://ebookmeta.com/product/mrexcel-2022-boosting-excel-6th-edition-
bill-jelen-2/
ebookmeta.com
https://ebookmeta.com/product/india-africa-partnerships-for-food-
security-and-capacity-building-south-south-cooperation-1st-edition-
renu-modi/
ebookmeta.com
https://ebookmeta.com/product/epicurus-and-the-singularity-of-
death-1st-edition-david-b-suits/
ebookmeta.com
Digitalization and Analytics for Smart Plant Performance
Theory and Applications 1st Edition Frank (Xin X.) Zhu
https://ebookmeta.com/product/digitalization-and-analytics-for-smart-
plant-performance-theory-and-applications-1st-edition-frank-xin-x-zhu/
ebookmeta.com
Data Structures &
Algorithms using
Kotlin
Second Edition
By Hemant Jain
https://t.me/KotlinSenior
Data Structures & Algorithms using Kotlin
Hemant Jain
Hemant Jain asserts the moral right to be identified as the author of this work.
The author is very grateful to GOD ALMIGHTY for his grace and blessing.
I would like to express profound gratitude to my family and friends for their invaluable
encouragement, supervision and useful suggestions throughout this book writing work.
Their support and continuous guidance enable me to complete my work successfully.
Hemant Jain
Table of Contents
CHAPTER 0: ABOUT THIS BOOK...............................................................................................................................1
CHAPTER 1: ALGORITHMS ANALYSIS.......................................................................................................................2
CHAPTER 2: APPROACH TO SOLVE PROBLEMS......................................................................................................24
CHAPTER 3: ABSTRACT DATA TYPE........................................................................................................................29
CHAPTER 4: SORTING............................................................................................................................................43
CHAPTER 5: SEARCHING........................................................................................................................................82
CHAPTER 6: LINKED LIST......................................................................................................................................153
CHAPTER 7: STACK...............................................................................................................................................206
CHAPTER 8: QUEUE.............................................................................................................................................243
CHAPTER 9: TREE.................................................................................................................................................267
CHAPTER 10: PRIORITY QUEUE / HEAPS..............................................................................................................346
CHAPTER 11: HASH TABLE...................................................................................................................................381
CHAPTER 12: GRAPHS..........................................................................................................................................396
CHAPTER 13: STRING ALGORITHMS....................................................................................................................447
CHAPTER 14: ALGORITHM DESIGN TECHNIQUES................................................................................................467
CHAPTER 15: BRUTE FORCE ALGORITHM............................................................................................................470
CHAPTER 16: GREEDY ALGORITHM.....................................................................................................................475
CHAPTER 17: DIVIDE AND CONQUER..................................................................................................................492
CHAPTER 18: DYNAMIC PROGRAMMING............................................................................................................503
CHAPTER 19: BACKTRACKING..............................................................................................................................541
CHAPTER 20: COMPLEXITY THEORY.....................................................................................................................550
APPENDIX............................................................................................................................................................559
Table of Contents
CHAPTER 0: ABOUT THIS BOOK...............................................................................................................................1
WHAT THIS BOOK IS ABOUT........................................................................................................................................1
PREREQUISITES.........................................................................................................................................................1
WHO SHOULD TAKE THIS COURSE ?..............................................................................................................................1
CODE DOWNLOADS...................................................................................................................................................1
END....................................................................................................................................................................... 1
CHAPTER 1: ALGORITHMS ANALYSIS.......................................................................................................................2
INTRODUCTION........................................................................................................................................................2
ASYMPTOTIC ANALYSIS OR ASYMPTOTIC NOTATIONS.......................................................................................................2
BIG-O NOTATION.....................................................................................................................................................2
OMEGA-Ω NOTATION...............................................................................................................................................3
THETA-Θ NOTATION.................................................................................................................................................4
COMPLEXITY ANALYSIS OF ALGORITHMS........................................................................................................................4
GROWTH OF FUNCTIONS............................................................................................................................................5
DERIVING AN ALGORITHM'S RUNTIME FUNCTION...........................................................................................................7
TIME COMPLEXITY EXAMPLES.....................................................................................................................................7
RECURSIVE FUNCTION.............................................................................................................................................13
COMPLEXITIES FROM RECURRENCE RELATION..............................................................................................................18
MASTER THEOREM.................................................................................................................................................21
EXERCISE...............................................................................................................................................................23
CHAPTER 2: APPROACH TO SOLVE PROBLEMS......................................................................................................24
INTRODUCTION.......................................................................................................................................................24
CONSTRAINTS........................................................................................................................................................24
IDEA GENERATION..................................................................................................................................................25
COMPLEXITIES........................................................................................................................................................26
CODING................................................................................................................................................................27
TESTING................................................................................................................................................................27
EXAMPLE..............................................................................................................................................................28
SUMMARY.............................................................................................................................................................28
CHAPTER 3: ABSTRACT DATA TYPE........................................................................................................................29
ABSTRACT DATA TYPE (ADT)...................................................................................................................................29
DATA-STRUCTURE...................................................................................................................................................29
KOTLIN COLLECTION FRAMEWORK.............................................................................................................................30
ARRAY..................................................................................................................................................................30
LINKED LIST...........................................................................................................................................................31
STACK..................................................................................................................................................................33
QUEUE.................................................................................................................................................................34
TREE.................................................................................................................................................................... 35
BINARY SEARCH TREE (BST).....................................................................................................................................35
HEAP / PRIORITY QUEUE.........................................................................................................................................37
HASH TABLE..........................................................................................................................................................39
ENDNOTE..............................................................................................................................................................42
CHAPTER 4: SORTING............................................................................................................................................43
INTRODUCTION.......................................................................................................................................................43
TYPES OF SORTING..................................................................................................................................................43
COMPARISON FUNCTION..........................................................................................................................................43
BUBBLE SORT........................................................................................................................................................44
INSERTION SORT.....................................................................................................................................................46
SELECTION SORT.....................................................................................................................................................47
MERGE SORT.........................................................................................................................................................49
PROS AND CONS OF MERGE-SORT ALGORITHM............................................................................................................51
EXTERNAL SORT (EXTERNAL MERGE-SORT).................................................................................................................51
QUICK SORT..........................................................................................................................................................52
QUICK SELECT........................................................................................................................................................54
COUNTING SORT....................................................................................................................................................56
RADIX SORT...........................................................................................................................................................57
HEAP SORT...........................................................................................................................................................59
TREE SORTING.......................................................................................................................................................59
SHELL SORT...........................................................................................................................................................59
BUCKET SORT........................................................................................................................................................61
GENERALISED BUCKET SORT.....................................................................................................................................62
STABLE SORTING....................................................................................................................................................63
COMPARISONS OF THE VARIOUS SORTING ALGORITHMS..................................................................................................63
SELECTION OF BEST SORTING ALGORITHM...................................................................................................................64
PROBLEMS BASED ON SORTING..................................................................................................................................65
EXERCISE...............................................................................................................................................................80
CHAPTER 5: SEARCHING........................................................................................................................................82
INTRODUCTION.......................................................................................................................................................82
WHY SEARCHING?..................................................................................................................................................82
DIFFERENT SEARCHING ALGORITHMS..........................................................................................................................82
LINEAR SEARCH OR SEQUENTIAL SEARCH – UNSORTED INPUT.........................................................................................82
LINEAR SEARCH – SORTED........................................................................................................................................83
BINARY SEARCH......................................................................................................................................................84
BINARY SEARCH IMPLEMENTATION USING RECURSION....................................................................................................85
FIBONACCI SEARCH.................................................................................................................................................86
HOW IS SORTING USEFUL IN SELECTION ALGORITHMS?..................................................................................................87
PROBLEMS IN SEARCHING........................................................................................................................................88
EXERCISE.............................................................................................................................................................151
CHAPTER 6: LINKED LIST......................................................................................................................................153
INTRODUCTION.....................................................................................................................................................153
LINKED LIST.........................................................................................................................................................153
TYPES OF LINKED LIST............................................................................................................................................153
SINGLY LINKED LIST...............................................................................................................................................154
DOUBLY LINKED LIST.............................................................................................................................................178
CIRCULAR LINKED LIST...........................................................................................................................................189
DOUBLY CIRCULAR LIST..........................................................................................................................................197
SKIP LIST.............................................................................................................................................................201
USES OF LINKED LIST.............................................................................................................................................203
EXERCISE.............................................................................................................................................................204
CHAPTER 7: STACK...............................................................................................................................................206
INTRODUCTION.....................................................................................................................................................206
THE STACK ABSTRACT DATA TYPE............................................................................................................................206
STACK USING ARRAY..............................................................................................................................................207
STACK USING ARRAY WITH MEMORY MANAGEMENT....................................................................................................209
STACK USING LINKED LIST.......................................................................................................................................210
SYSTEM STACK AND FUNCTION CALLS.......................................................................................................................213
PROBLEMS IN STACK.............................................................................................................................................214
USES OF STACK....................................................................................................................................................241
EXERCISE.............................................................................................................................................................241
CHAPTER 8: QUEUE.............................................................................................................................................243
INTRODUCTION.....................................................................................................................................................243
THE QUEUE ABSTRACT DATA TYPE..........................................................................................................................243
QUEUE USING ARRAY............................................................................................................................................244
QUEUE USING CIRCULAR LINKED LIST.......................................................................................................................245
PROBLEMS IN QUEUE............................................................................................................................................248
USES OF QUEUE...................................................................................................................................................265
EXERCISE.............................................................................................................................................................265
CHAPTER 9: TREE.................................................................................................................................................267
INTRODUCTION.....................................................................................................................................................267
TERMINOLOGY IN TREE..........................................................................................................................................267
BINARY TREE.......................................................................................................................................................269
TYPES OF BINARY TREES.........................................................................................................................................270
PROBLEMS IN BINARY TREE....................................................................................................................................272
BINARY SEARCH TREE (BST)...................................................................................................................................292
PROBLEMS IN BINARY SEARCH TREE (BST)................................................................................................................292
SEGMENT TREE....................................................................................................................................................306
BINARY INDEX TREE / FENWICK TREE.......................................................................................................................310
AVL TREE...........................................................................................................................................................313
RED-BLACK TREE..................................................................................................................................................319
SPLAY TREE.........................................................................................................................................................331
B TREE...............................................................................................................................................................336
B+ TREE.............................................................................................................................................................341
THREADED BINARY TREE........................................................................................................................................342
USES OF TREES.....................................................................................................................................................343
EXERCISE.............................................................................................................................................................343
CHAPTER 10: PRIORITY QUEUE / HEAPS..............................................................................................................346
INTRODUCTION.....................................................................................................................................................346
TYPES OF HEAP....................................................................................................................................................347
HEAP ADT OPERATIONS........................................................................................................................................348
OPERATION ON HEAP............................................................................................................................................348
HEAP SORT.........................................................................................................................................................358
PROBLEMS IN HEAP..............................................................................................................................................363
BINOMIAL HEAP...................................................................................................................................................369
FIBONACCI HEAP..................................................................................................................................................374
USES OF HEAP.....................................................................................................................................................378
EXERCISE.............................................................................................................................................................379
CHAPTER 11: HASH TABLE...................................................................................................................................381
INTRODUCTION.....................................................................................................................................................381
HASH-TABLE........................................................................................................................................................381
HASHING WITH OPEN ADDRESSING..........................................................................................................................383
HASHING WITH SEPARATE CHAINING.........................................................................................................................387
SET IMPLEMENTATION OF KOTLIN COLLECTIONS.........................................................................................................389
DICTIONARY IMPLEMENTATION IN KOTLIN COLLECTION................................................................................................389
PROBLEMS IN HASHING.........................................................................................................................................390
USES OF HASH-TABLE...........................................................................................................................................393
EXERCISE.............................................................................................................................................................393
CHAPTER 12: GRAPHS..........................................................................................................................................396
INTRODUCTION.....................................................................................................................................................396
GRAPH TERMINOLOGY...........................................................................................................................................397
GRAPH REPRESENTATION.......................................................................................................................................401
GRAPH TRAVERSALS..............................................................................................................................................404
DEPTH FIRST TRAVERSAL........................................................................................................................................405
BREADTH FIRST TRAVERSAL....................................................................................................................................407
DFS & BFS BASED PROBLEMS................................................................................................................................410
MINIMUM SPANNING TREE (MST)..........................................................................................................................426
EULER PATH AND EULER CIRCUIT.............................................................................................................................431
SHORTEST PATH ALGORITHMS IN GRAPH..................................................................................................................433
HAMILTONIAN PATH.............................................................................................................................................441
HAMILTONIAN CIRCUIT..........................................................................................................................................443
TRAVELLING SALESMAN PROBLEM (TSP)..................................................................................................................444
USES OF GRAPH ALGORITHMS.................................................................................................................................446
EXERCISE.............................................................................................................................................................446
CHAPTER 13: STRING ALGORITHMS....................................................................................................................447
INTRODUCTION.....................................................................................................................................................447
STRING MATCHING...............................................................................................................................................447
DICTIONARY / SYMBOL TABLE.................................................................................................................................451
PROBLEMS IN STRING............................................................................................................................................458
EXERCISE.............................................................................................................................................................465
CHAPTER 14: ALGORITHM DESIGN TECHNIQUES................................................................................................467
INTRODUCTION.....................................................................................................................................................467
BRUTE FORCE ALGORITHM.....................................................................................................................................467
GREEDY ALGORITHM.............................................................................................................................................468
DIVIDE AND CONQUER...........................................................................................................................................468
DYNAMIC PROGRAMMING......................................................................................................................................468
BACKTRACKING....................................................................................................................................................469
CONCLUSION.......................................................................................................................................................469
CHAPTER 15: BRUTE FORCE ALGORITHM............................................................................................................470
INTRODUCTION.....................................................................................................................................................470
PROBLEMS IN BRUTE FORCE ALGORITHM..................................................................................................................470
CONCLUSION.......................................................................................................................................................474
CHAPTER 16: GREEDY ALGORITHM.....................................................................................................................475
INTRODUCTION.....................................................................................................................................................475
PROBLEMS ON GREEDY ALGORITHM.........................................................................................................................475
CONVEX-HULL PROBLEM........................................................................................................................................489
CONCLUSION.......................................................................................................................................................491
CHAPTER 17: DIVIDE AND CONQUER..................................................................................................................492
INTRODUCTION.....................................................................................................................................................492
GENERAL DIVIDE & CONQUER RECURRENCE..............................................................................................................493
PROBLEMS ON DIVIDE & CONQUER ALGORITHM........................................................................................................493
STRASSEN’S MATRIX MULTIPLICATION......................................................................................................................499
EXERCISE.............................................................................................................................................................501
CHAPTER 18: DYNAMIC PROGRAMMING............................................................................................................503
INTRODUCTION.....................................................................................................................................................503
DYNAMIC PROGRAMMING METHODS.......................................................................................................................504
TABULATION (BOTTOM-UP)...................................................................................................................................504
MEMOIZATION (TOP-DOWN).................................................................................................................................505
DYNAMIC PROGRAMMING PATTERNS.......................................................................................................................506
TYPE 1 : MAXIMUM / MINIMUM COST TO REACH SOME STATE PROBLEMS......................................................................508
TYPE 2 : DISTINCT WAYS TO REACH SOME STATE PROBLEMS.........................................................................................513
TYPE 3 : MERGING INTERVALS TO GET OPTIMAL SOLUTION PROBLEMS............................................................................517
TYPE 4 : SUBSEQUENCE, SUBSTRINGS AND STRING MANIPULATION PROBLEMS................................................................525
TYPE 5 : STATE SELECTION KIND OF PROBLEMS..........................................................................................................534
EXERCISE.............................................................................................................................................................539
CHAPTER 19: BACKTRACKING..............................................................................................................................541
INTRODUCTION.....................................................................................................................................................541
PROBLEMS ON BACKTRACKING ALGORITHM...............................................................................................................542
EXERCISE.............................................................................................................................................................549
CHAPTER 20: COMPLEXITY THEORY.....................................................................................................................550
INTRODUCTION.....................................................................................................................................................550
DECISION PROBLEM..............................................................................................................................................550
COMPLEXITY CLASSES............................................................................................................................................550
CLASS P PROBLEMS..............................................................................................................................................551
CLASS NP PROBLEMS............................................................................................................................................552
REDUCTION.........................................................................................................................................................553
NP HARD PROBLEMS............................................................................................................................................554
NP-COMPLETE PROBLEMS.....................................................................................................................................554
CLASS CO-NP PROBLEMS.......................................................................................................................................558
END NOTE..........................................................................................................................................................558
APPENDIX............................................................................................................................................................559
CHAPTER 0: ABOUT THIS BOOK
Designing an efficient algorithm is a very important skill that all software companies pursue. Most of
the interviews for software companies are focused on knowledge of data structures and algorithms.
Apart from knowing a programming language, you also need to have a good command of these key
computer fundamentals to not only crack the interview but also excel in your jobs as a software
engineer.
Prerequisites
You should have a working knowledge of Kotlin programming language. You are not an expert in the
Kotlin language, but you are well familiar with concepts of classes, functions, references, and
recursion.
Code downloads
You can download the code of solved examples in the book from the author's GitHub repositories at
https://GitHub.com/Hemant-Jain-Author/. Hear the author had solved examples in various
programming languages like C, C++, C#, Java, Python, JavaScript, Swift, GoLang, Ruby, etc.
End
It is highly recommended that you should read the problem statement, try to solve the problems by
yourself and then only you should look into the solution to find the approach of this book. Practising
more and more problems will increase your thinking capacity, and you will be able to handle unseen
problems in an interview. We recommend you to practice all the problems given in this book, then
solve more and more problems from online resources like www.topcoder.com, www.careercup.com,
https://leetcode.com/ etc.
1
CHAPTER 1: ALGORITHMS ANALYSIS
Introduction
An Algorithm is a finite set of unambiguous steps or instructions to solve a given problem. Knowledge
of algorithms helps us to get desired results faster by applying the appropriate algorithm. We learn by
experience. With experience, it becomes easy to solve new problems. By looking into various problem-
solving algorithms or techniques, we begin to develop a pattern that will help us in solving similar
problems.
The complexity of an algorithm is the amount of Time or Space required by the algorithm to process
the input and produce the output.
In most cases, we are interested in the order of growth of the algorithm instead of the exact time
required for running an algorithm. This time is also known as Asymptotic Running Time.
Big-O Notation
Definition: “f(n) is big-O of g(n)” or f(n) = O(g(n)), if there are two +ve constants c and n1 such that f(n)
≤ c g(n) for all n ≥ n1,
2
Chapter 1: Algorithms Analysis Big-O Notation
In other words, c g(n) is an upper bound for f(n) for all n ≥ n0. The function f(n) growth is slower than c
g(n). For a sufficiently large value of input n, the (c.g(n)) will always be greater than f(n).
Omega-Ω Notation
Definition: “f(n) is omega of g(n)” or f(n)=Ω(g(n)) if there are two +ve constants c and n1 such that c
g(n) ≤ f(n) for all n ≥ n1
In other words, c g(n) is the lower bound for f(n). Function f(n) growth is faster than c g(n)
3
Chapter 1: Algorithms Analysis Theta-Θ Notation
Theta-Θ Notation
Definition: “f(n) is theta of g(n).” or f(n) = Θ(g(n)) if there are three +ve constants c1, c2 and n1 such
that c1 g(n) ≤ f(n) ≤ c2 g(n) for all n ≥ n1
Function g(n) is an asymptotically tight bound on f(n). Function f(n) grows at the same rate as g(n).
Note: Worst-case complexity is used to find the guarantee in how much time some particular algorithm
will finish. This is the most important time complexity. If the type of complexity is not mentioned, then
always consider Worst-Case time complexity.
4
Chapter 1: Algorithms Analysis Growth of functions
Growth of functions
Let’s look at these growth rates of various functions. The size of the input is n.
Examples:
1 Accessing an nth element of an Array
2 Push and pop of a stack.
3 Add and remove from a queue.
4 Accessing an element of Hash-Table.
Examples:
1 Array operations like search element, find min, find max etc.
2 Linked list operations like traversal, find min, find max etc.
Note: If we need to traverse all the nodes of a data structure for some task, then complexity cant be
less than O(n)
An example is the Binary search algorithm. We will read about this algorithm in this book.
5
Chapter 1: Algorithms Analysis Growth of functions
The time taken by certain algorithms to run varies dramatically with the size of the input. Some
algorithms take minutes or even seconds to run on huge input, whereas others may take days to
complete their execution. To understand how the rate of growth changes with the size of the input in
different functions, the following table presents the approximate number of steps required to run an
algorithm:
6
Chapter 1: Algorithms Analysis Deriving an Algorithm's Runtime Function
Constants
If any line of code is a statement with basic operations, e.g., comparisons, assignments, or reading a
variable, they take constant time each. Thus, the time complexity of each statement is O(1).
Loops
In loop, a repetition of a particular code for n times, where n is the size of the loop. Every statement
inside the loop has a runtime of O(1). The running time of a loop is a product of the running time of the
statement inside a loop and the number of iterations in the loop. Time Complexity is O(n)
Nested Loops
The running time of a nested loops is a product of the running time of the statements inside the loop
multiplied by a product of the size of all the loops. Time Complexity is O(n^c). Where c is the number of
loops. For two loops, it will be O(n^2)
Consecutive Statements
In this case, we add the running time of all the consecutive lines of code.
If-Else Statement
In this case, either “if” will run or “else” will run. So, the block with larger runtime will be considered.
Logarithmic Statement
In this case, each iteration will cut the input size into b pieces and consider one of the pieces for the
next iteration. Time complexity in this situation will be O(logb(n)).
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n):: " + fun1(100))
}
Output:
N = 100, Number of instructions in O(n)::100
7
Chapter 1: Algorithms Analysis Time Complexity Examples
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^2):: " + fun2(100))
}
Output:
N = 100, Number of instructions in O(n^2)::10000
Time Complexity: O(n^2), two nested for loop, takes quadratic time. Both the “for” loop is executed n
number of times, so the internal statement executed n^2 number of times.
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^3):: " + fun3(100))
}
Output:
N = 100, Number of instructions in O(n^3)::1000000
Time Complexity: O(n^3), All the three nested loops run for n number of iterations. So the statement
inside the innermost loop will run for n^3 number of times.
8
Chapter 1: Algorithms Analysis Time Complexity Examples
}
return m
}
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^3):: " + fun4(100))
}
Output:
N = 100, Number of instructions in O(n^3)::166650
Time Complexity: Three nested loops each run for n number of times. The innermost statement will
run for n^3 number of times. Time complexity is O(n^3)
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^2):: " + fun5(100))
}
Output:
N = 100, Number of instructions in O(n^2)::4950
Time Complexity: Statement inside inner loop executes for 1 time in first iteration then 2 times then 3
times and so on for n iterations. Total number of times the inner statement is executed = 1 + 2+ 3 +…..
+ n. This series is an arithmetic progression, which sums to n(n+1)/2. So the final time complexity is
O(n(n+1)/2) ignoring the constant factors, time complexity will be O(n^2).
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^2):: " + fun6(100))
}
9
Chapter 1: Algorithms Analysis Time Complexity Examples
Output:
N = 100, Number of instructions in O(n^2)::5050
Time Complexity: The inner loop will run 1 time in the first iteration, then 2 times in the second
iteration and so on. It is an arithmetic progression, so time complexity will be O(n^2).
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n):: " + fun7(100))
}
Output:
N = 100, Number of instructions in O(n)::197
For nested loops, look for inner loop iterations. Time complexity will be calculated by looking into the
inner loop. First, it will run for n number of times then n/2 and so on. (n+n/2 +n/4+n/8+n/16 ……)
Time Complexity: O(n)
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n):: " + fun8(100))
}
10
Chapter 1: Algorithms Analysis Time Complexity Examples
Output:
N = 100, Number of instructions in O(n)::134
Time Complexity: The inner loop will run for 1, 2, 4, 8,… n times in successive iteration of the outer
loop. T(n) = O(1+ 2+ 4+ ….+n/2+n) = O(n)
// Testing code.
fun main() {
println("N = 100, Number of instructions O(log(n)):: " + fun9(100))
}
Output:
N = 100, Number of inst in O(log(n))::7
In each iteration, i value is doubled. So the value of i after k iterations will be 2^k.
2^k = n ...Will be the condition at the time of exit.
log(2^k) = log(n) ….Taking log both sides.
k = log(n)
Time Complexity: O(log(n))
// Testing code.
fun main() {
println("N = 100, Number of instructions O(log(n)):: " + fun10(100))
}
Output:
N = 100, Number of instructions in O(log(n))::7
11
Chapter 1: Algorithms Analysis Time Complexity Examples
for (i in 0 until n) {
for (k in 0 until n) {
m += 1
}
}
return m
}
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^2):: " + fun11(100))
}
Output:
N = 100, Number of instructions in O(n^2)::20000
These two groups of loops are consecutive, so their complexity will add up to form the final complexity
of the program.
Time Complexity: O(n^2) + O(n^2) = O(n^2)
Example 1.12:
fun fun12(n: Int): Int {
var m = 0
for (i in 0 until n) {
for (j in 0 until Math.sqrt(n.toDouble()).toInt()) {
m += 1
}
}
return m
}
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n^(3/2)):: " + fun12(100))
}
Output:
N = 100, Number of instructions in O(n^(3/2))::1000
12
Chapter 1: Algorithms Analysis Time Complexity Examples
Time Complexity: Inner loop always runs for √n times. O(n * √n ) = O(n^3/2)
// Testing code.
fun main() {
println("N = 100, Number of instructions O(n):: " + fun13(100))
}
Output:
N = 100, Number of instructions in O(n)::100
Time Complexity: In this example, j is not initialised for every iteration. For i=0, the loop of j executes
completely, making the value of j as n. But for the remaining values of i, the loop of j does not execute.
So the time complexity in this case is O(n).
Recursive Function
Recursion: A recursive function is a function that calls itself, directly or indirectly. A recursive method
consists of two parts: Termination Condition and Body (which includes recursive expansion).
1 Termination Condition: A recursive method always contains one or more terminating conditions.
A condition in which a recursive method processes a simple case and does not call itself.
2 Body (including recursive expansion): The main logic of the recursive method is contained in the
body of the method. It also contains the recursion expansion statement that, in turn, calls the
method itself.
Note: The speed of a recursive program is slower because of stack overheads. If the same problem
can be solved using an iterative solution (using loops), then we should prefer an iterative solution in
place of recursion to avoid stack overhead.
Note: Without termination conditions, the recursive method may run forever and consume full-stack
memory.
13
Chapter 1: Algorithms Analysis Recursive Function
Factorial
Problem: Given a value N find N!. Where N! = N* (N-1)…. 2*1. Use recursion to solve the problem.
// Testing code.
fun main() {
println("Factorial:" + factorial(5))
}
Output:
Factorial:120
14
Chapter 1: Algorithms Analysis Recursive Function
// Testing code.
fun main() {
var i = 1000
printInt(i, 16)
}
Output:
3E8
Analysis:
1 The base value is provided along with the number in the function parameter.
2 The remainder of the number is calculated and stored in digits.
3 If the number is greater than the base, then the number divided by the base is passed recursively
as an argument to the print() method.
4 The number will be printed higher-ordered first, then the lower order digits.
Tower of Hanoi
Problem: In the Tower of Hanoi, we are given three rods and N number of disks, initially all the disks
are added to the first rod (the leftmost one) such that no smaller disk is under the larger one. The
objective is to transfer the entire stack of disks from the first tower to the third tower (the rightmost
one), moving only one disk at a time. Moving a larger disk onto a smaller one is not allowed.
Solution: If we want to transfer N disks from source to destination tower. Let's consider the bottom-
most disk, it is the largest disk so can not be placed to any other tower except the destination tower.
Also, all the disks above the largest disk need to be placed in the temporary tower, then only the
largest disk can be moved to the destination tower. So we move N-1 disks from source to temporary
tower and then move the lowest Nth disk from source to destination. Then we will move N-1 disks from
the temporary tower to the destination tower.
Example 1.16:
fun towerOfHanoi(num:Int, src:Char, dst:Char, temp:Char) {
if (num < 1) {
return
}
15
Chapter 1: Algorithms Analysis Recursive Function
// Testing code.
fun main() {
var num = 3
println("Moves involved in the Tower of Hanoi are:")
towerOfHanoi(num, 'A', 'C', 'B')
}
Output:
Moves involved in the Tower of Hanoi are:
Move 1 disk from peg A to peg C
Move 2 disk from peg A to peg B
Move 1 disk from peg C to peg B
Move 3 disk from peg A to peg C
Move 1 disk from peg B to peg A
Move 2 disk from peg B to peg C
Move 1 disk from peg A to peg C
Analysis:
Recurrence Relation: T(n) = 1 + 2T(n-1)
T(n-1) = 1 + 2*T(n-2)
T(n-2) = 1 + 2*T(n-3)
T(n) = 1 + 2*( 1 + 2*T(n-2)) = 1 + 2 + 4*T(n-2) = 1 + 2 + 4*( 1 + 2*(T(n-3)) = 1 + 2+ 22+ 23T(n-3)
= 1 + 2 + 22 …. + 2nT(0) = 1(2n+1 – 1)/2 – 1 = 2n+1 – 1 // Geometric progression sum
Time complexity will be O(2^n) ignoring the constants.
Solution: There are many ways to find the greatest common divisor (GCD). We are using Euclid’s
algorithm to find the GCD. The following are steps of Euclid’s algorithm:
1. If n = 0 then GCD(n, m) = m, and this is a termination condition.
2. If m = 0 then GCD(n, m) = n, and this is a termination condition.
3. Write n in the form of a quotient remainder n = mq + q. q is the quotient, and r is the remainder.
4. Since GCD(n, m) = GCD(m, r), use the Euclidean Algorithm to find GCD(m , r).
Example 1.17:
fun gcd(m:Int, n:Int):Int {
if (m == 0) {
return n
}
if (n == 0) {
return m
}
16
Chapter 1: Algorithms Analysis Recursive Function
return gcd(n, m % n)
}
// Testing code.
fun main() {
println("Gcd is:: " + gcd(5, 2));
}
Output:
Gcd is:: 1
Time-Complexity: O(Max(log(m), log(n))), Each step input is reduced by nearly half or more.
Fibonacci number
Problem: Given N, find the Nth number in the Fibonacci series.
Solution: Fibonacci numbers are calculated by adding the sum of the previous two numbers.
Example 1.18:
fun fibonacci(n:Int):Int {
if (n <= 1) {
return n
}
// Testing code.
fun main() {
println(fibonacci(10));
}
Output:
55
Note: - There is an inefficiency in the solution. We will look for a better solution in the coming chapters.
17
Chapter 1: Algorithms Analysis Complexities from Recurrence Relation
Example 1.20: Find complexity of the function with the following recurrence relation.
T(n) =
{T ( n−11)+nif n=0if n>0
Solution:
T(n) = T(n-1) + n
T(n-1) = T(n-2) + n
T(n-2) = T(n-3) + n
T(n) = ( T(n-2) + n) + n = T(n-2) + 2n = (T(n-3) + n) + 2n = T(n-3) + 3n
T(n) = T(n-k) + kn
base case when T(0) = 1, n-k = 0 => n = k
T(n) = T(0) + n*n = 1 + n^2
Time Complexity is O(n^2)
Example 1.21: Find complexity of the function with the following recurrence relation.
T(n) =
{1T (n− 1)+ log (n) ififn=0
n>0
Solution:
T(n) = T(n-1) + log(n)
T(n-1) = T(n-2) + log(n) // for simplicity make log(n-1) as log(n)
T(n-2) = T(n-3) + log(n)
T(n) = ( T(n-2) + log(n)) + log(n) = T(n-2) + 2log(n) = (T(n-3) + log(n)) + 2log(n) = T(n-3) + 3log(n)
18
Chapter 1: Algorithms Analysis Complexities from Recurrence Relation
Example 1.22: Find complexity of the function with the following recurrence relation.
T(n) =
{T (n/12)+nif n=1if n>1
Solution:
T(n) = T(n/2) + n
T(n/2) = T(n/22) + (n/2) // substituting n as n/2
T(n/22) = T(n/23) + (n/22) // substituting n as n/22
T(n) = ( T(n/22) + (n/2) ) + n = T(n/22) + n/2 + n
T(n) = ( T(n/23) + (n/22) ) + n/2 + n = T(n/23) + n/22 + n/2 + n
T(n) = T(n/2^k) + n/2^(k-1) + …… + n/22 + n/2 + n
base case when n = 2^k,
T(n) = T(1) + n/2^k-1 + …… + n/22 + n/2 + n
T(n) = T(1) + n * ( 1/2^(k-1) + …… + 1/22 + 1/2 + 1 )
T(n) = 1 + n*2
Time Complexity is O(n)
Example 1.23: Find complexity of the function with the following recurrence relation.
T(n) =
{2∗
1 if n=1
T (n/2)+ n if n>1
Solution:
T(n) = 2 T(n/2) + n
T(n/2) = 2 T(n/22) + (n/2) // substituting n as n/2
T(n/22) = 2 T(n/23) + (n/22) // substituting n as n/22
19
Chapter 1: Algorithms Analysis Complexities from Recurrence Relation
Example 1.24: Find complexity of the function with the following recurrence relation.
T(n) =
{12∗ T (n −1)+1 if n=0
if n>0
Solution:
T(n) = 2 T(n-1) + 1
T(n-1) = 2T(n-2) + 1
T(n-2) = 2T(n-3) + 1
T(n) = 2( 2T(n-2) + 1) + 1 = 22T(n-2) + 2 + 1 = 22 (2T(n-3) + 1) + 2 + 1 = 23T(n-3) + 22 + 2 + 1
T(n) = 2kT(n-k) + 2(k-1) + ….. + 22 + 2 + 1
base case when T(0) = 1, n-k = 0 => n = k
T(n) = 2nT(0) + 2(n-1) + ….. + 22 + 2 + 1 = 2n + 2(n-1) + ….. + 22 + 2 + 1 = 2(n+1) – 1 // GP
Time Complexity O(2^n)
Example 1.25: Find complexity of the function with the following recurrence relation.
T(n) =
{T (√1 n)+1 if n ≤2
if n>2
Solution:
T(n) = T(n1/2) + 1
T(n1/2) = T( n1/4) + 1
T(n1/4) = T( n1/8) + 1
T(n) = T(n1/2) + 1 = (T( n1/4) + 1) + 1 = T( n1/4) + 2 = (T( n1/8) + 1) + 2 = T( n1/8) + 3
T(n) = T(n1/2k) + k
for base case n,1/2k = 2
(1/(2^k) ) * log(n)= log2 = 1 // taking log.
log(n) = 2^k
log(log(n)) = k log(2) = k // taking log again.
Time Complexity is O(log(log(n)))
20
Chapter 1: Algorithms Analysis Master Theorem
Master Theorem
The master theorem solves recurrence relations of the form: T(n) = a T(n/b) + f(n), Where a≥1 and
b>1. In this relation, “n” is the size of the input. "a" is the number of sub-problems in the recursion.
“n/b” is the size of each sub-problem. "f(n)" is the cost of the division of the problem into sub-problems
and merging the individual solutions of the sub-problems into the solution.
T(n) = Θ(n
logba. k+1
log n)
logba+ε
Case 3: When f(n) = Ω(n ) and constant Є > 1, then the final time complexity is T(n) = Θ(f(n))
Example 1.26: In the case of Merge Sort. Its time complexity is T(n) = 2 T(n/2) + n
Solution: In this example, a and b both equal to 2. So, logba = log22 = 1.
Which means, f(n) = n = Θ(nlog22log0n). That means case 2 is applied and T(n) = Θ(nlog22log0+1n).
So, its final time complexity will be T(n) = Θ(n.log(n))
Example 1.27: It is the case of Binary Search, Its time complexity is T(n) = T(n/2) + 1
Solution: In this example, a is equal to 1 and b is equal to 2. So, logba = log21 = 0
Which means, f(n) = 1 = Θ(nlog21log0n). That means case 2 is applied and T(n) = Θ(nlog21log0+1n).
So, its final time complexity will be T(n) = Θ(log(n))
21
Chapter 1: Algorithms Analysis Master Theorem
Example 1.28: In the case of binary tree traversal, Its time complexity is T(n) = 2T(n/2) + 1
Solution: In this example, a is equal to 2 and b is also equal to 2. So, logba = log22 = 1
Which means, f(n) =1 = O(nlog22 - 1). That means case 1 is applied and T(n) = Θ(nlog22).
So, its final time complexity will be T(n) = Θ(n)
22
Chapter 1: Algorithms Analysis Master Theorem
Exercise
1 True or false
➢ 5 n + 10 n^2= O(n^2)
➢ n.log(n) + 4 n = O(n)
➢ log(n^2) + 4 log(log(n)) = O(log(n))
➢ 12.n1/2+ 3 = O(n^2)
➢ 3^n + 11.n^2 + n^20= O(2^n)
2 What is the best-case runtime complexity of searching an Array?
3 What is the average-case runtime complexity of searching an Array?
4 Given an array of positive numbers, you need to find the maximum sum under the constraint
that no two elements should be adjacent.
23
CHAPTER 2: APPROACH TO SOLVE PROBLEMS
Introduction
Theoretical knowledge of the algorithm is essential, but it is insufficient. When an interviewer asks the
interviewee to solve a problem, then the interviewee can use our five-step approach to solve problems.
If you master this technique, you will outperform the majority of applicants in interviews.
Constraints
Solving a technical question is not just about knowing the algorithms and designing a good software
system. The interviewer is interested in seeing your approach to any given problem. Often, people
make mistakes by failing to ask clarifying follow-up questions about a given problem. They make a lot
of assumptions at once and start working with them. Before you start solving a problem, you need to
collect a lot of missing information from your interviewer.
In this step, you will write down all the problem’s constraints. Never attempt to solve a problem that
isn’t completely defined. Interview questions are not like exam paper questions, where all the details
about a problem are well-defined. The interviewer wants you to ask questions and clarify the problem
during the interview.
Suppose, when the interviewer says to write an algorithm to sort numbers. You need to ask the
following clarifying question:
1. The first thing you need to know is what sort of data is being given. Assume the interviewer
gives you the answer Integer.
2. The size of the data is the second piece of information you need to know. If the input data is
100 integers or 1 billion integers, the algorithm is different.
24
Chapter 2: Approach to Solve Problems Constraints
We will see in the graph chapter that depending upon the constraints the algorithm applied changes
and so is the complexity of the solution.
Idea Generation
We will cover a lot of theoretical knowledge in this book. It is impossible to cover all the questions, as
new questions are created every day. Therefore, you should know how to handle new problems. Even
if you know the solution to the problem asked by the interviewer, then also you need to have a
discussion with the interviewer and try to reach the solution. You need to analyse the problem also
because the interviewer may modify a question a bit, so the approach to solve it will vary.
How to solve an unseen problem? The solution to this problem is to learn a lot, and the more you
practice, the more you will be able to answer any unseen problem. When you’ve solved enough
problems, you’ll see a pattern in the questions and be able to answer unseen problems with ease.
Following is the strategy that you need to follow to solve an unknown problem:
1. Try to simplify the task at hand.
2. Try a few examples
3. Think of a suitable data structure.
4. Think about similar problems that you have already solved.
25
Chapter 2: Approach to Solve Problems Idea Generation
At first look, it looks complicated, but it is a simple problem. Try to find a relation to the final position.
P(Hi) = i * 2 – 1 and P(Wi) = i * 2
We are leaving an exercise for you to do something like Insertion-Sort for the rest of the algorithm, and
you are done.
Problem 2: We are given a stream of data, at any time, we can be asked to tell the median value of
the data, and maybe we can be asked to pop median data.
Analysis: We may visualise a tree, maybe a balanced tree with the median at the root. Wait a minute!
It’s not straightforward to ensure that the tree root is a median. We can’t get the median from a heap,
although it can give us the minimum or maximum. What if we use two heaps, a max-heap and a min-
heap? The max heap will hold the smaller values, while the min-heap will have the larger values.
Furthermore, we will keep track of how many elements are in the heaps. It would help if you came up
with the rest of the algorithm on your own.
For every unseen problem, think about the data structures you know, and maybe one of them or some
combination of them will solve your problem. Think about similar problems you have already solved.
Problem 3: Given head pointers of two linked lists that intersect at some point. Find the point of
intersection. However, in place of the end of the linked list to be a null pointer, there is a loop.
Analysis: You know how to find the intersection point of two intersecting linked lists, and you know
how to find if a linked list has a loop (three-pointer solution). Therefore, you can combine both solutions
to solve the problem at hand.
Complexities
Solving a problem is not just finding a correct solution. The solution should be fast and should have
reasonable memory requirements. In the previous chapters, you learned about big-O notation. You
should be able to perform Big-O analysis. If you believe the solution you have provided is not optimal
and there is a better solution, then try to figure it out.
26
Chapter 2: Approach to Solve Problems Complexities
Most interviewers expect that you should be able to find the Time and Space Complexity of the
algorithms. You should be able to calculate the Time and Space Complexity quickly. Whenever you
are solving any problem, you should find the complexity associated with it. From this, you would be
able to choose the best solutions. In some problems there are some trade-offs between Space and
Time Complexity, so you should know these trade-offs. Taking a little extra space will save you a lot of
time and make your algorithm much faster.
Coding
At this stage, you have already captured all the constraints of the problem, suggested a few solutions,
evaluated the complexities of those solutions and selected the one for final coding. Never begin coding
without first discussing with the interviewer about constraints, Idea generation and complexity.
We are used to writing code in an IDE like a Visual Studio. So several people struggle when asked to
write code on a whiteboard or some blank sheet. Therefore, you should do some practice coding on a
sheet of paper. You should think before coding because there is no back button on the sheet of paper.
Always try to write modular code. Small functions need to be created so that the code is clean and
managed. If there is a requirement for a swap function, just use this function and tell the interviewer
that you will write it later. Everybody knows that you can write a swap function.
Testing
You’re not done even if the code is written. It is essential to validate the code using a variety of small
test cases. It shows that you understand the importance of testing. It also gives the interviewer
confidence that you would not write a bug-ridden program. Once you have finished coding, you should
go over the code line-by-line for some small test cases. This is to ensure that the code is functioning as
intended.
Note: Always follow these five steps, never jump to coding before doing constraint analysis, idea
generation, and complexity analysis: At last, never miss the testing step.
27
Chapter 2: Approach to Solve Problems Example
Example
Let us suppose the interviewer asks you to give the best sorting algorithm.
Some interviewees will directly jump to Quick-Sort O(n.log(n)). Oops, mistake! You need to ask many
questions before beginning to solve this problem.
Question 5: Can we modify the given data structure? And many, many more questions…
Answer: No, you cannot modify the data structure provided
So, we are all set to use the given information to make a perfect solution. From the first answer, we will
know the type of data we are going to get is an integer. From the second answer, we can conclude that
data size is limited. It’s only in some thousands. From the next answer, we can conclude that it’s age-
related data. So we can assume that a person’s age will be between 1 to 150. And lastly, we know that
data is in the form of a list and cannot change it.
To summarise, we can use bucket sort to sort the data. Since the range is only 1-150, we only need an
integer list of 150 elements. We don’t have to think about data overflow because the data is in
thousands, and we get the solution in linear time.
Summary
At this point, you know the process of handling unseen problems very well. In the coming chapter, we
will be looking into various data structures and the problems they solve. It may be possible that the
user cannot understand some portion of this chapter as knowledge of the rest of the book is needed,
so they can reread this chapter after reading the rest of the data structures portion. A huge number of
problems are solved in this book. However, it is recommended that you first try to solve them yourself
and then look for the solution. Always think about the complexity of the problem. In the interview,
interaction is the key to get the problem described completely and discuss your approach with the
interviewer.
28
CHAPTER 3: ABSTRACT DATA TYPE
For example, a user wants to store some integers and find their mean value. ADT for this data
structure would have two functions, one for adding integers and another to get the mean value. ADT
for this data structure does not talk about how exactly it will be implemented.
Data-Structure
Data structures are concrete representations of data that are defined from the perspective of a
programmer. The data structure represents how data can be stored in memory. Each data structure
has its own set of advantages and disadvantages. Depending on the type of problem, we choose the
most appropriate data structure.
For example, according to the question, we can store data in arrays, stack, queue, linked list, and
many more.
Note: - In this chapter, we will be studying various data structures and their API. So that the user can
use them without knowing their internal implementation.
29
Chapter 3: Abstract Data Type Kotlin Collection Framework
Array
Arrays are the simplest data structures that store items of the same data type.
Example 3.1:
fun main() {
val arr = IntArray(10)
for (i in 0..9) {
arr[i] = i
}
for (i in arr){
print(" " + i)
}
}
Output:
0 1 2 3 4 5 6 7 8 9
30
Chapter 3: Abstract Data Type Array
Application of Arrays
Applications of Arrays are:
1. Storing data in tabular format.
2. Used in the creation of Matrices. Online ticket booking system in which seats are represented
in the form of Matrices.
3. Used in the creation of various higher level data structures like Stacks, Queues, Heaps,
HashTables etc.
Example 3.2:
fun main() {
val al = ArrayList<Int>()
al.add(1) // add 1 to the end of the list
al.add(2) // add 2 to the end of the list
println("Array : $al")
println("Array Size : " + al.size)
println("Array IsEmpty : " + al.isEmpty())
Output:
Array : [1, 2]
Array Size : 2
Array IsEmpty : false
Array : [1]
Array IsEmpty : true
Linked List
Linked list is a dynamic data structure and memory is allocated at run time. The concept of linked list is
not to store data contiguously. Nodes of linked list contain links that point to the next elements in the
list.
31
Exploring the Variety of Random
Documents with Different Content
The full-grown Manatee is from ten to twelve feet in length. Its long
body terminates in a thin, wide, shovel-shaped, fibrous, horizontal
tail, proportionally broader, but resembling somewhat that of the
Beaver. The fore-limbs, or flippers, have diminutive flat nails. The
skin of the body can be compared only to that of the Elephant, not
in colour alone, but also in its coarse, wrinkly texture, and widely-
scattered, delicate, but long hairs. Its deep-set, minute eye is
surrounded by skin wrinkles. As in the preceding genera, the muzzle
is peculiar—a kind of half-moon-shaped swelling above, with deep
crossing wrinkles set with short stiff bristles. Beneath this there
projects a mass of hard gum, covered with a roughened horny plate.
The lower jaw also has a gum plate, underhung by a bristle-clad
lower lip. The nostrils are two semi-lunar, valve-like slits, at the apex
of the muzzle. When the mouth is opened, the marginal inner
cheeks are seen to be hair-covered, and the hard, horny palate to be
very conspicuous above and below. This remarkable muzzle and
mouth are specially adapted to the animal’s mode of feeding. Steller
long ago remarked that the Rhytina’s muzzle was exceedingly
prehensile; but in a live Manatee exhibited at the London Zoological
Gardens, Professor Garrod observed and has recorded the
remarkable manner and use of this lip-structure. In grasping its
food, the bristly-clad outer angles of the upper lip at first diverge,
and then approximate like a pair of pincers, holding the object firmly,
which is then drawn inwards by a backward movement of the lips.
The horny pads again on the closing of the mouth further bruise the
vegetable matter. In 1866, the Zoological Society sent Mr. Clarence
Bartlett to Surinam, to bring home a young Manatee. This suckling,
christened “Patcheley,” had been obtained when quite a baby by the
Indians, and duly transferred to a lakelet, where he had his freedom.
Although fishy in form and fondness for the water, he had
nevertheless to receive daily a good quantum of Cow’s milk from a
bottle. He soon got fond of the “black Jack,” as well as of his keeper.
Mr. Bartlett, as wet nurse, had a difficulty in training his charge.
Loosely attired, he waded about and coaxed his pet to the water’s
edge, where, after a stolen suck or two, he permitted himself to be
raised partly on his knees, and then sucked away might and main till
the bottle was dry. His appetite satisfied, he seemed in high glee,
tumbled and rolled about a while, then got quieter, retired to the
pool, and slept lazily near the surface. At times his disposition was
more rollicking, and Master Patcheley would overturn his nurse into
the mud, where the two spluttered and floundered for possession of
the bottle. Clusius recounts how a pet “Mato” was kept by a Spanish
Governor for twenty-six years; it came at call to the side of the lake
to be fed, and would even allow boys to mount on its back while it
harmlessly swam about. For long the pursuit of the Manatee has
been a favourite amusement with the natives. One instance is
related of Indians on the Mosquito shore spearing it from canoes,
when the animal darted off as he felt the weapon, dragging the
canoe after it round and round the bight until exhausted. Mr. Alfred
R. Wallace says the natives of the Amazon capture them alive, in
strong nets, at the mouth of the streams, and afterwards kill them
by thrusting wooden plugs up their nostrils. The Manatee has no
milk-teeth, though when young there are two rudimentary incisors in
each jaw, which afterwards become covered in. Canines are entirely
absent, and the molars vary in number from nine to eleven in the
upper and lower jaw on each side. Those in the upper series are
three-rooted, in the lower series two-rooted; all the molars are
broad, square-crowned, and with transverse ridging or cusp
structure like that of the Hippopotamus or partly like that of
Mastodon. The molar series are never simultaneously in place and
use, those in front dropping out and making room for those behind.
FOSSIL SIRENIA.—The HALITHERIUM is the name given to certain fossil
remains which have been found in the Miocene strata of Germany
and various other parts of Europe. These remains show that there
may have been several species, but all are truly of a Sirenian
character. The fossil remains were intermediate, though possibly
most closely allied to the Manatee, some of them being slightly
larger than this animal. The dentition is unusually interesting,
inasmuch as there appear to have been vertical successors;
anteriorly there are simple, cylindrical premolars, and posteriorly
larger, complex molars, while the somewhat bent-down upper jaw
bore tusk-like appendages. But the most peculiar and interesting
point in connection with the Halitheria, is that they were provided
with rudiments of a hind limb, a thigh-bone some few inches in
length having been found by the late Professor Kaup, though
curiously enough no further vestige of it has since turned up.
Judging from the almost complete skeletons obtained, and from
comparison with what we know of other Sirenia, the Halitherium
must have closely resembled the living Manatee, and possibly have
lived in the lagoons and brackish waters of mid-Europe and
elsewhere, for in the Eocene and Miocene times these regions, now
high and dry, formed watery areas in communication with the ocean.
Besides the foregoing, within the last few years our knowledge of
Sirenoids has been considerably augmented by the discovery of
other fossil remains indicating several new genera. Prorastomus is
founded by Owen on a skull from West Indian (doubtful) Tertiary
strata. Crassitherium is applied by Van Beneden to vertebræ, and
part of a skull from deposits near Antwerp. Felsinotherium, (with but
5–5
molar teeth) is a form described by Capellini, from Pliocene beds
5–5
in Bologna. Pachyacanthus, found in strata in the neighbourhood of
Vienna, Brandt supposed a Cetacean, but Van Beneden regards it as
a Sirenian. The Rhytiodus, of Lartet, is based on some fossil teeth
bearing resemblances to those of the Dugong. Lastly comes (in the
cast of a brain), the still more remarkable Eotherium of Owen, from
the nummulitic Eocene of Egypt. Some of these fossils are of intense
interest, for example, Prorastomus, the Tapir-like dentition of which
is—Incisors, 3–3; canines, 1–1; premolars, 5–5; molars, 3–3 = 48. Very
3–3 1–1 5–5 3–3
interesting also are Pachyacanthus, with possibly but six neck
vertebræ, like the Manatee; and Halitherium, with its hind limb
bones, and which also, along with Felsinotherium, foreshadows the
molar pattern of Hippopotamus. Thus, taking these facts into
consideration, together with many other structural peculiarities,
Elephant-like and otherwise, and notwithstanding that the Sirenia
are aquatic and Whale-like, their structural relationship with the
Proboscidea and Ungulata is not so far-fetched as at first sight might
seem. But the gap is not yet bridged, and until that is done the
order Sirenia must be retained.
JAMES MURIE.
The molar or grinding-teeth of the Elephant are for the most part
buried in the socket, and present little more than a surface for
mastication above the gum. Each is composed of a number of
transverse perpendicular plates, built up of a body of dentine,
covered by a layer of enamel, and this again by a layer of cement,
which fills the interspaces of the plates, and binds together the
divisions into one solid mass. Each of these enamel plates, however,
in the perfect tooth is united at the base. When these plates of
enamel—which stand out in the transverse plates on account of their
superior hardness, and cause the grinding surface to be uneven—are
worn out, the animal either dies of indigestion, or more often
becomes weak, and falls a prey to wild beasts.
LAST LOWER TOOTH OF LAST LOWER TOOTH OF
AFRICAN ELEPHANT. INDIAN ELEPHANT.
Endless other stories are told of the sagacity of this noble animal,
some of them, however, probably not ungarnished with considerable
exaggeration. However, this creature does undoubtedly possess a
most wonderful amount of intelligence, and it is believed that the
Indian species, both in sagacity and docility, surpasses the African.
The White Elephants, held in reverence in Siam, and extremely
rare, are not distinct from the rest; they are merely albinoes, or
white varieties, and are to be viewed in the same light as white
Blackbirds or white Sparrows.
THE AFRICAN ELEPHANT[259] is distinguished at once from the Indian
species by the great size of its ears, its larger eye, convex forehead,
darker colour of its skin, and by possessing only three instead of four
nails or hoofs in the hind foot. It is indigenous to Africa, being found
south of the Sahara as far as Cape Colony, and from the Indian
Ocean to the Atlantic. It formerly lived north of the Sahara, and in
the Pleistocene age of geologists was found in Europe, in Italy, and
in Spain, to which points it probably crossed at the time when the
submerged barriers between Sicily and Africa, and Gibraltar and
Africa, were above the level of the water.
Unlike the Indian species, both the males and the females are
provided with tusks. The African differs also considerably in his
habits, for while the Indian enjoys coolness and shade, the African is
more or less exposed to the burning sun.
According to Sir Samuel Baker, “in Africa the country being
generally more open than in Ceylon, the Elephant remains
throughout the day either beneath a solitary tree, or exposed to the
sun in the vast prairies, where the thick grass attains a height of
from nine to twelve feet. The general food of the African Elephant
consists of the foliage of trees, especially of mimosas. Many of the
mimosas are flat-headed, about thirty feet high, and the richer
portion of the foliage confined to the crown. Thus, the Elephant, not
being able to reach to so great a height, must overturn the tree to
procure the coveted food. The destruction caused by a herd of
Elephants in a mimosa forest is extraordinary, and I have seen trees
uprooted of so large a size that I am convinced no single Elephant
could have overturned them. I have measured trees four feet six
inches in circumference, and about thirty feet high, uprooted by
Elephants. The natives have assured me that they mutually assist
each other, and that several engage together in the work of
overturning a large tree. None of the mimosas have tap roots; thus
the powerful tusks of the Elephants applied as crowbars at the roots,
while others pull at the branches with their trunks, will effect the
destruction of a tree so large as to appear invulnerable.”
The following account by Gordon Cumming, which, on some
points as to the habits and haunts of the African Elephant does not
agree with that of Sir Samuel Baker, may be explained by the
different nature of the country hunted by him:—“The Elephant is
widely diffused through the vast forests, and is met with in herds of
various numbers. The male is much larger than the female. He is
provided with two enormous tusks. These are long, tapering, and
beautifully arched; their length averages from six to eight feet, and
they weigh from sixty to a hundred pounds each. In the vicinity of
the Equator the Elephants attain to a larger size than to the
southward; and I am in possession of a pair of tusks of the African
bull Elephant, the larger of which measures ten feet nine inches in
length, and weighs one hundred and seventy-three pounds.
“Old bull Elephants are found singly or in pairs, or consorting
together in small herds, varying from six to twenty individuals. The
younger bulls remain for many years in the company of their
mothers, and these are met together in large herds of from twenty
to a hundred individuals. The food of the Elephant consists of the
branches, leaves, and roots of the trees, and also of a variety of
bulbs, of the situation of which he is advised by his exquisite sense
of smell. To obtain these he turns up the ground with his tusks, and
whole acres may be seen thus ploughed up. Elephants consume an
immense quantity of food, and pass the greater part of the day and
night in feeding. Like the Whale in the ocean, the Elephant on land
is acquainted with, and roams over, wide and extensive tracts. He is
extremely particular in always frequenting the freshest and most
verdant districts of the forests, and when one district is parched and
barren, he will forsake it for years and wander to great distances in
quest of better pasture.”
AFRICAN ELEPHANT.
❏
LARGER IMAGE