From eb54bc8544f0d482336878e211269ea43da9a7a7 Mon Sep 17 00:00:00 2001 From: Mike Taghavi Date: Mon, 30 Jan 2017 11:38:32 +0100 Subject: [PATCH 01/39] Add Simulated annealing --- Simulated annealing/README.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 Simulated annealing/README.md diff --git a/Simulated annealing/README.md b/Simulated annealing/README.md new file mode 100644 index 000000000..bee8ffe94 --- /dev/null +++ b/Simulated annealing/README.md @@ -0,0 +1 @@ +# Simulated annealing From a6afbc107e25b96bdb86b9186f4a5794046b004b Mon Sep 17 00:00:00 2001 From: Mike Taghavi Date: Mon, 30 Jan 2017 18:18:50 +0100 Subject: [PATCH 02/39] Initial --- Simulated annealing/README.md | 32 ++++ Simulated annealing/simann.swift | 105 +++++++++++ Simulated annealing/simann_example.swift | 222 +++++++++++++++++++++++ 3 files changed, 359 insertions(+) create mode 100644 Simulated annealing/simann.swift create mode 100644 Simulated annealing/simann_example.swift diff --git a/Simulated annealing/README.md b/Simulated annealing/README.md index bee8ffe94..e7fe75778 100644 --- a/Simulated annealing/README.md +++ b/Simulated annealing/README.md @@ -1 +1,33 @@ # Simulated annealing + +Simulated Annealing is a nature inspired global optimization technique and a metaheuristic to approximate global maxima in a (often discrete)large search space. The name comes from the process of annealing in metallurgy where a material is heated and cooled down under controlled conditions in order to improve its strength and durabilility. The objective is to find a minimum cost solution in the search space by exploiting properties of a thermodynamic system. +Unlike hill climbing techniques which usually gets stuck in a local maxima ( downward moves are not allowed ), simulated annealing can escape local maxima. The interesting property of simulated annealing is that probability of allowing downward moves is high at the high temperatures and gradually reduced as it cools down. In other words, high temperature relaxes the acceptance criteria for the search space and triggers chaotic behavior of acceptance function in the algorithm (e.x initial/high temperature stages) which should make it possible to escape from local maxima and cooler temperatures narrows it and focuses on improvements. + +Pseucocode + + Input: initial, temperature, coolingRate, acceptance + Output: Sbest + Scurrent <- CreateInitialSolution(initial) + Sbest <- Scurrent + while temperature is not minimum: + Snew <- FindNewSolution(Scurrent) + if acceptance(Energy(Scurrent), Energy(Snew), temperature) > Rand(): + Scurrent = Snew + if Energy(Scurrent) < Energy(Sbest): + Sbest = Scurrent + temperature = temperature * (1-coolingRate) + +Common acceptance criteria : P(accept) <- exp((e-ne)/T) where + e is the current energy ( current solution ), + ne is new energy ( new solution ), + T is current temperature. + + +We use this algorithm to solve a Travelling salesman problem instance with 20 cities. The code is in `simann_example.swift` + +#See also + +[Simulated annealing on Wikipedia](https://en.wikipedia.org/wiki/Simulated_annealing) +[Travelling salesman problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) + +Written for Swift Algorithm Club by [Mike Taghavi](https://github.com/mitghi) diff --git a/Simulated annealing/simann.swift b/Simulated annealing/simann.swift new file mode 100644 index 000000000..8adfbf817 --- /dev/null +++ b/Simulated annealing/simann.swift @@ -0,0 +1,105 @@ +// The MIT License (MIT) +// Copyright (c) 2017 Mike Taghavi (mitghi[at]me.com) +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#if os(OSX) + import Foundation +#elseif os(Linux) + import Glibc +#endif + +public extension Double { + public static func random(_ lower: Double, _ upper: Double) -> Double { + #if os(OSX) + return (Double(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower + #elseif os(Linux) + return (Double(random()) / 0xFFFFFFFF) * (upper - lower) + lower + #endif + } +} + +protocol Clonable { + init(current: Self) +} + +// MARK: - create a clone from instance + +extension Clonable { + func clone() -> Self { + return Self.init(current: self) + } +} + +protocol SAObject: Clonable { + var count: Int { get } + func randSwap(a: Int, b: Int) + func currentEnergy() -> Double + func shuffle() +} + +// MARK: - create a new copy of elements + +extension Array where Element: Clonable { + func clone() -> Array { + var newArray = Array() + for elem in self { + newArray.append(elem.clone()) + } + + return newArray + } +} + +typealias AcceptanceFunc = (Double, Double, Double) -> Double + +func SimulatedAnnealing(initial: T, temperature: Double, coolingRate: Double, acceptance: AcceptanceFunc) -> T { + // Step 1: + // Calculate the initial feasible solution based on a random permutation. + // Set best and current solutions to initial solution + + var temp: Double = temperature + var currentSolution = initial.clone() + currentSolution.shuffle() + var bestSolution = currentSolution.clone() + + // Step 2: + // Repeat while the system is still hot + // Randomly modify the current solution by swapping its elements + // Randomly decide if the new solution ( neighbor ) is acceptable and set current solution accordingly + // Update the best solution *iff* it had improved ( lower energy = improvement ) + // Reduce temperature + + while temp > 1 { + let newSolution: T = currentSolution.clone() + let pos1: Int = Int(arc4random_uniform(UInt32(newSolution.count))) + let pos2: Int = Int(arc4random_uniform(UInt32(newSolution.count))) + newSolution.randSwap(a: pos1, b: pos2) + let currentEnergy: Double = currentSolution.currentEnergy() + let newEnergy: Double = newSolution.currentEnergy() + + if acceptance(currentEnergy, newEnergy, temp) > Double.random(0, 1) { + currentSolution = newSolution.clone() + } + if currentSolution.currentEnergy() < bestSolution.currentEnergy() { + bestSolution = currentSolution.clone() + } + + temp *= 1-coolingRate + } + + return bestSolution +} diff --git a/Simulated annealing/simann_example.swift b/Simulated annealing/simann_example.swift new file mode 100644 index 000000000..a0dfaa19a --- /dev/null +++ b/Simulated annealing/simann_example.swift @@ -0,0 +1,222 @@ +// The MIT License (MIT) +// Copyright (c) 2017 Mike Taghavi (mitghi[at]me.com) +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#if os(OSX) + import Foundation +#elseif os(Linux) + import Glibc +#endif + +public extension Double { + + public static func random(_ lower: Double, _ upper: Double) -> Double { + #if os(OSX) + return (Double(arc4random()) / 0xFFFFFFFF) * (upper - lower) + lower + #elseif os(Linux) + return (Double(random()) / 0xFFFFFFFF) * (upper - lower) + lower + #endif + } +} + +protocol Clonable { + init(current: Self) +} + +extension Clonable { + func clone() -> Self { + return Self.init(current: self) + } +} + +protocol SAObject: Clonable { + var count: Int { get } + func randSwap(a: Int, b: Int) + func currentEnergy() -> Double + func shuffle() +} + +// MARK: - create a new copy of elements + +extension Array where Element: Clonable { + func clone() -> Array { + var newArray = Array() + for elem in self { + newArray.append(elem.clone()) + } + + return newArray + } +} + +typealias Points = [Point] +typealias AcceptanceFunc = (Double, Double, Double) -> Double + +class Point: Clonable { + var x: Int + var y: Int + + init(x: Int, y: Int) { + self.x = x + self.y = y + } + + required init(current: Point){ + self.x = current.x + self.y = current.y + } +} + +// MARK: - string representation + +extension Point: CustomStringConvertible { + public var description: String { + return "Point(\(x), \(y))" + } +} + +// MARK: - return distance between two points using operator '<->' + +infix operator <->: AdditionPrecedence +extension Point { + static func <-> (left: Point, right: Point) -> Double { + let xDistance = (left.x - right.x) + let yDistance = (left.y - right.y) + + return Double(sqrt(Double((xDistance * xDistance) + (yDistance * yDistance)))) + } +} + + +class Tour: SAObject { + var tour: Points + var energy: Double = 0.0 + var count: Int { + get { + return self.tour.count + } + } + + init(points: Points){ + self.tour = points.clone() + } + + required init(current: Tour) { + self.tour = current.tour.clone() + } +} + +// MARK: - calculate current tour distance ( energy ). + +extension Tour { + func randSwap(a: Int, b: Int) -> Void { + let (cpos1, cpos2) = (self[a], self[b]) + self[a] = cpos2 + self[b] = cpos1 + } + + func shuffle() { + for i in stride(from: self.count - 1, through: 1, by: -1) { + let j = Int(arc4random()) % (i + 1) + if i != j { + swap(&self.tour[i], &self.tour[j]) + } + } + } + + func currentEnergy() -> Double { + if self.energy == 0 { + var tourEnergy: Double = 0.0 + for i in 0..destCity + tourEnergy = tourEnergy + e + + } + self.energy = tourEnergy + } + return self.energy + } + +} + +// MARK: - subscript to manipulate elements of Tour. + +extension Tour { + subscript(index: Int) -> Point { + get { + return self.tour[index] + } + set(newValue) { + self.tour[index] = newValue + } + } +} + +func SimulatedAnnealing(initial: T, temperature: Double, coolingRate: Double, acceptance: AcceptanceFunc) -> T { + var temp: Double = temperature + var currentSolution = initial.clone() + currentSolution.shuffle() + var bestSolution = currentSolution.clone() + print("Initial solution: ", bestSolution.currentEnergy()) + + while temp > 1 { + let newSolution: T = currentSolution.clone() + let pos1: Int = Int(arc4random_uniform(UInt32(newSolution.count))) + let pos2: Int = Int(arc4random_uniform(UInt32(newSolution.count))) + newSolution.randSwap(a: pos1, b: pos2) + let currentEnergy: Double = currentSolution.currentEnergy() + let newEnergy: Double = newSolution.currentEnergy() + + if acceptance(currentEnergy, newEnergy, temp) > Double.random(0, 1) { + currentSolution = newSolution.clone() + } + if currentSolution.currentEnergy() < bestSolution.currentEnergy() { + bestSolution = currentSolution.clone() + } + + temp *= 1-coolingRate + } + + print("Best solution: ", bestSolution.currentEnergy()) + return bestSolution +} + +let points: [Point] = [ + (60 , 200), (180, 200), (80 , 180), (140, 180), + (20 , 160), (100, 160), (200, 160), (140, 140), + (40 , 120), (100, 120), (180, 100), (60 , 80) , + (120, 80) , (180, 60) , (20 , 40) , (100, 40) , + (200, 40) , (20 , 20) , (60 , 20) , (160, 20) , + ].map{ Point(x: $0.0, y: $0.1) } + +let acceptance : AcceptanceFunc = { + (e: Double, ne: Double, te: Double) -> Double in + if ne < e { + return 1.0 + } + return exp((e - ne) / te) +} + +let result: Tour = SimulatedAnnealing(initial : Tour(points: points), + temperature : 100000.0, + coolingRate : 0.003, + acceptance : acceptance) From a794dec1522cd0df09b96a2d8744b261b8185f2a Mon Sep 17 00:00:00 2001 From: Mike Date: Mon, 30 Jan 2017 18:23:23 +0100 Subject: [PATCH 03/39] Update README.md --- Simulated annealing/README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Simulated annealing/README.md b/Simulated annealing/README.md index e7fe75778..3a36464d7 100644 --- a/Simulated annealing/README.md +++ b/Simulated annealing/README.md @@ -17,10 +17,12 @@ Pseucocode Sbest = Scurrent temperature = temperature * (1-coolingRate) -Common acceptance criteria : P(accept) <- exp((e-ne)/T) where - e is the current energy ( current solution ), - ne is new energy ( new solution ), - T is current temperature. +Common acceptance criteria : + + P(accept) <- exp((e-ne)/T) where + e is the current energy ( current solution ), + ne is new energy ( new solution ), + T is current temperature. We use this algorithm to solve a Travelling salesman problem instance with 20 cities. The code is in `simann_example.swift` @@ -28,6 +30,7 @@ We use this algorithm to solve a Travelling salesman problem instance with 20 ci #See also [Simulated annealing on Wikipedia](https://en.wikipedia.org/wiki/Simulated_annealing) + [Travelling salesman problem](https://en.wikipedia.org/wiki/Travelling_salesman_problem) Written for Swift Algorithm Club by [Mike Taghavi](https://github.com/mitghi) From d7f172a8db597a7c699679b9b9977bede7469487 Mon Sep 17 00:00:00 2001 From: remlostime Date: Sun, 23 Jul 2017 13:13:39 -0700 Subject: [PATCH 04/39] Improvement of Apple Ordered Set Add explaination for apple ordered set --- .../AppleOrderedSet.playground/Contents.swift | 13 +- .../Sources/AppleOrderedSet.swift | 4 + Ordered Set/AppleOrderedSet.swift | 4 + Ordered Set/README.markdown | 126 +++++++++++++++++- .../contents.xcworkspacedata | 8 +- 5 files changed, 144 insertions(+), 11 deletions(-) diff --git a/Ordered Set/AppleOrderedSet.playground/Contents.swift b/Ordered Set/AppleOrderedSet.playground/Contents.swift index 4388c664b..c5548c2c2 100644 --- a/Ordered Set/AppleOrderedSet.playground/Contents.swift +++ b/Ordered Set/AppleOrderedSet.playground/Contents.swift @@ -6,8 +6,17 @@ s.add(-1) s.add(0) s.insert(4, at: 3) -s.set(-1, at: 0) +print(s.all()) // [1, 2, -1, 4, 0] + +s.set(-1, at: 0) // We already have -1 in index: 2, so we will do nothing here + +print(s.all()) // [1, 2, -1, 4, 0] + s.remove(-1) -print(s.object(at: 1)) +print(s.all()) // [1, 2, 4, 0] + +print(s.object(at: 1)) // 2 + +print(s.object(at: 2)) // 4 diff --git a/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift b/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift index 3ff19cb8d..6bd8f94a0 100644 --- a/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift +++ b/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift @@ -69,4 +69,8 @@ public class AppleOrderedSet { indexOfKey[objects[i]] = i } } + + public func all() -> [T] { + return objects + } } diff --git a/Ordered Set/AppleOrderedSet.swift b/Ordered Set/AppleOrderedSet.swift index 3ff19cb8d..6bd8f94a0 100644 --- a/Ordered Set/AppleOrderedSet.swift +++ b/Ordered Set/AppleOrderedSet.swift @@ -69,4 +69,8 @@ public class AppleOrderedSet { indexOfKey[objects[i]] = i } } + + public func all() -> [T] { + return objects + } } diff --git a/Ordered Set/README.markdown b/Ordered Set/README.markdown index bc5003a61..11096d5bb 100644 --- a/Ordered Set/README.markdown +++ b/Ordered Set/README.markdown @@ -1,5 +1,7 @@ # Ordered Set +## Sorted Array Version + An Ordered Set is a collection of unique items in sorted order. Items are usually sorted from least to greatest. The Ordered Set data type is a hybrid of: @@ -323,15 +325,129 @@ The right side did not contain the item, so we look at the left side: [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] * mid - + [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] * mid Finally, we've found `Player 2`, and return index 3. -## See Also +## Apple's Ordered Set +Below the ordered set is based on sorted array. But [Apple's version](https://developer.apple.com/documentation/foundation/nsorderedset), it's pretty different. Now, let's look into how to implement apple's ordered set. + +Here is the example about how it works + +```swift +let s = AppleOrderedSet() + +s.add(1) +s.add(2) +s.add(-1) +s.add(0) +s.insert(4, at: 3) + +print(s.all()) // [1, 2, -1, 4, 0] + +s.set(-1, at: 0) // We already have -1 in index: 2, so we will do nothing here + +print(s.all()) // [1, 2, -1, 4, 0] + +s.remove(-1) + +print(s.all()) // [1, 2, 4, 0] + +print(s.object(at: 1)) // 2 + +print(s.object(at: 2)) // 4 +``` + +The significant difference is the the array is not sorted. The elements in the array are the same when insert them. Image the array without duplicates and with `O(logn)` or `O(1)` search time. + +The idea here is using a data structure to provide `O(1)` or `O(logn)` time complexity, so it's easy to think about hash table. + +```swift +var indexOfKey: [T: Int] +var objects: [T] +``` + +`indexOfKey` is used to track the index of the element. `objects` is array holding elements. + +We will go through some key functions details here. + +### Add -[Apple Ordered Set](AppleOrderedSet.playground) -@remlostime added an Apple version of `OrderedSet` +Update `indexOfKey` and insert element in the end of `objects` + +```swift +// O(1) +public func add(_ object: T) { + guard indexOfKey[object] == nil else { + return + } + + objects.append(object) + indexOfKey[object] = objects.count - 1 +} +``` + +### Insert + +Insert in a random place of the array will cost `O(n)` time. + +```swift +// O(n) +public func insert(_ object: T, at index: Int) { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + guard indexOfKey[object] == nil else { + return + } + + objects.insert(object, at: index) + indexOfKey[object] = index + for i in index+1..= 0, "Index should be bigger than 0") + + guard indexOfKey[object] == nil else { + return + } + + indexOfKey.removeValue(forKey: objects[index]) + indexOfKey[object] = index + objects[index] = object +} +``` + +### Remove + +Remove element in the array will cost `O(n)`. At the same time, we need to update all elements's index after the removed element. + +```swift +// O(n) +public func remove(_ object: T) { + guard let index = indexOfKey[object] else { + return + } + + indexOfKey.removeValue(forKey: object) + objects.remove(at: index) + for i in index.. + location = "group:AppleOrderedSet.playground"> + location = "group:AppleOrderedSet.swift"> + location = "group:OrderedSet.playground"> + location = "group:OrderedSet.swift"> From 95b45f038bfaba63fac2621c24dd3bd0bd9d59be Mon Sep 17 00:00:00 2001 From: remlostime Date: Sat, 18 Nov 2017 20:08:36 -0800 Subject: [PATCH 05/39] Split sorted set and ordered set --- .../Sources/AppleOrderedSet.swift | 76 ---- .../contents.xcplayground | 4 - Ordered Set/AppleOrderedSet.swift | 76 ---- .../Contents.swift | 2 +- .../timeline.xctimeline | 6 - .../Sources/OrderedSet.swift | 171 ++++----- .../contents.xcplayground | 8 +- Ordered Set/OrderedSet.swift | 172 ++++----- Ordered Set/README.markdown | 336 +----------------- Sorted Set/README.markdown | 334 +++++++++++++++++ .../Example 1.xcplaygroundpage/Contents.swift | 2 +- .../timeline.xctimeline | 6 +- .../Example 2.xcplaygroundpage/Contents.swift | 2 +- .../Example 3.xcplaygroundpage/Contents.swift | 2 +- .../Sources/Player.swift | 6 +- .../Sources/Random.swift | 4 +- .../Sources/SortedSet.swift | 118 ++++++ .../contents.xcplayground | 8 + .../contents.xcworkspacedata | 0 Sorted Set/SortedSet.swift | 118 ++++++ .../contents.xcworkspacedata | 19 +- 21 files changed, 738 insertions(+), 732 deletions(-) delete mode 100644 Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift delete mode 100644 Ordered Set/AppleOrderedSet.playground/contents.xcplayground delete mode 100644 Ordered Set/AppleOrderedSet.swift rename Ordered Set/{AppleOrderedSet.playground => OrderedSet.playground}/Contents.swift (91%) delete mode 100644 Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/timeline.xctimeline create mode 100644 Sorted Set/README.markdown rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/Pages/Example 1.xcplaygroundpage/Contents.swift (94%) rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/Pages/Example 1.xcplaygroundpage/timeline.xctimeline (50%) rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/Pages/Example 2.xcplaygroundpage/Contents.swift (95%) rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/Pages/Example 3.xcplaygroundpage/Contents.swift (95%) rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/Sources/Player.swift (95%) rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/Sources/Random.swift (88%) create mode 100644 Sorted Set/SortedSet.playground/Sources/SortedSet.swift create mode 100644 Sorted Set/SortedSet.playground/contents.xcplayground rename {Ordered Set/OrderedSet.playground => Sorted Set/SortedSet.playground}/playground.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 Sorted Set/SortedSet.swift diff --git a/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift b/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift deleted file mode 100644 index 6bd8f94a0..000000000 --- a/Ordered Set/AppleOrderedSet.playground/Sources/AppleOrderedSet.swift +++ /dev/null @@ -1,76 +0,0 @@ -public class AppleOrderedSet { - private var objects: [T] = [] - private var indexOfKey: [T: Int] = [:] - - public init() {} - - // O(1) - public func add(_ object: T) { - guard indexOfKey[object] == nil else { - return - } - - objects.append(object) - indexOfKey[object] = objects.count - 1 - } - - // O(n) - public func insert(_ object: T, at index: Int) { - assert(index < objects.count, "Index should be smaller than object count") - assert(index >= 0, "Index should be bigger than 0") - - guard indexOfKey[object] == nil else { - return - } - - objects.insert(object, at: index) - indexOfKey[object] = index - for i in index+1.. T { - assert(index < objects.count, "Index should be smaller than object count") - assert(index >= 0, "Index should be bigger than 0") - - return objects[index] - } - - // O(1) - public func set(_ object: T, at index: Int) { - assert(index < objects.count, "Index should be smaller than object count") - assert(index >= 0, "Index should be bigger than 0") - - guard indexOfKey[object] == nil else { - return - } - - indexOfKey.removeValue(forKey: objects[index]) - indexOfKey[object] = index - objects[index] = object - } - - // O(1) - public func indexOf(_ object: T) -> Int { - return indexOfKey[object] ?? -1 - } - - // O(n) - public func remove(_ object: T) { - guard let index = indexOfKey[object] else { - return - } - - indexOfKey.removeValue(forKey: object) - objects.remove(at: index) - for i in index.. [T] { - return objects - } -} diff --git a/Ordered Set/AppleOrderedSet.playground/contents.xcplayground b/Ordered Set/AppleOrderedSet.playground/contents.xcplayground deleted file mode 100644 index 5da2641c9..000000000 --- a/Ordered Set/AppleOrderedSet.playground/contents.xcplayground +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Ordered Set/AppleOrderedSet.swift b/Ordered Set/AppleOrderedSet.swift deleted file mode 100644 index 6bd8f94a0..000000000 --- a/Ordered Set/AppleOrderedSet.swift +++ /dev/null @@ -1,76 +0,0 @@ -public class AppleOrderedSet { - private var objects: [T] = [] - private var indexOfKey: [T: Int] = [:] - - public init() {} - - // O(1) - public func add(_ object: T) { - guard indexOfKey[object] == nil else { - return - } - - objects.append(object) - indexOfKey[object] = objects.count - 1 - } - - // O(n) - public func insert(_ object: T, at index: Int) { - assert(index < objects.count, "Index should be smaller than object count") - assert(index >= 0, "Index should be bigger than 0") - - guard indexOfKey[object] == nil else { - return - } - - objects.insert(object, at: index) - indexOfKey[object] = index - for i in index+1.. T { - assert(index < objects.count, "Index should be smaller than object count") - assert(index >= 0, "Index should be bigger than 0") - - return objects[index] - } - - // O(1) - public func set(_ object: T, at index: Int) { - assert(index < objects.count, "Index should be smaller than object count") - assert(index >= 0, "Index should be bigger than 0") - - guard indexOfKey[object] == nil else { - return - } - - indexOfKey.removeValue(forKey: objects[index]) - indexOfKey[object] = index - objects[index] = object - } - - // O(1) - public func indexOf(_ object: T) -> Int { - return indexOfKey[object] ?? -1 - } - - // O(n) - public func remove(_ object: T) { - guard let index = indexOfKey[object] else { - return - } - - indexOfKey.removeValue(forKey: object) - objects.remove(at: index) - for i in index.. [T] { - return objects - } -} diff --git a/Ordered Set/AppleOrderedSet.playground/Contents.swift b/Ordered Set/OrderedSet.playground/Contents.swift similarity index 91% rename from Ordered Set/AppleOrderedSet.playground/Contents.swift rename to Ordered Set/OrderedSet.playground/Contents.swift index c5548c2c2..6a2415231 100644 --- a/Ordered Set/AppleOrderedSet.playground/Contents.swift +++ b/Ordered Set/OrderedSet.playground/Contents.swift @@ -1,4 +1,4 @@ -let s = AppleOrderedSet() +let s = OrderedSet() s.add(1) s.add(2) diff --git a/Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/timeline.xctimeline b/Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/timeline.xctimeline deleted file mode 100644 index bf468afec..000000000 --- a/Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/Ordered Set/OrderedSet.playground/Sources/OrderedSet.swift b/Ordered Set/OrderedSet.playground/Sources/OrderedSet.swift index 8490a3320..5508c3637 100644 --- a/Ordered Set/OrderedSet.playground/Sources/OrderedSet.swift +++ b/Ordered Set/OrderedSet.playground/Sources/OrderedSet.swift @@ -1,117 +1,76 @@ -/* - An Ordered Set is a collection where all items in the set follow an ordering, - usually ordered from 'least' to 'most'. The way you value and compare items - can be user-defined. -*/ -public struct OrderedSet { - private var internalSet = [T]() - - public init() { } - - // Returns the number of elements in the OrderedSet. - public var count: Int { - return internalSet.count - } - - // Inserts an item. Performance: O(n) - public mutating func insert(_ item: T) { - if exists(item) { - return // don't add an item if it already exists - } - - // Insert new the item just before the one that is larger. - for i in 0.. item { - internalSet.insert(item, at: i) - return - } +public class OrderedSet { + private var objects: [T] = [] + private var indexOfKey: [T: Int] = [:] + + public init() {} + + // O(1) + public func add(_ object: T) { + guard indexOfKey[object] == nil else { + return } - - // Append to the back if the new item is greater than any other in the set. - internalSet.append(item) + + objects.append(object) + indexOfKey[object] = objects.count - 1 } - - // Removes an item if it exists. Performance: O(n) - public mutating func remove(_ item: T) { - if let index = index(of: item) { - internalSet.remove(at: index) + + // O(n) + public func insert(_ object: T, at index: Int) { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + guard indexOfKey[object] == nil else { + return } - } - - // Returns true if and only if the item exists somewhere in the set. - public func exists(_ item: T) -> Bool { - return index(of: item) != nil - } - - // Returns the index of an item if it exists, or -1 otherwise. - public func index(of item: T) -> Int? { - var leftBound = 0 - var rightBound = count - 1 - - while leftBound <= rightBound { - let mid = leftBound + ((rightBound - leftBound) / 2) - - if internalSet[mid] > item { - rightBound = mid - 1 - } else if internalSet[mid] < item { - leftBound = mid + 1 - } else if internalSet[mid] == item { - return mid - } else { - // When we get here, we've landed on an item whose value is equal to the - // value of the item we're looking for, but the items themselves are not - // equal. We need to check the items with the same value to the right - // and to the left in order to find an exact match. - - // Check to the right. - for j in stride(from: mid, to: count - 1, by: 1) { - if internalSet[j + 1] == item { - return j + 1 - } else if internalSet[j] < internalSet[j + 1] { - break - } - } - - // Check to the left. - for j in stride(from: mid, to: 0, by: -1) { - if internalSet[j - 1] == item { - return j - 1 - } else if internalSet[j] > internalSet[j - 1] { - break - } - } - return nil - } + + objects.insert(object, at: index) + indexOfKey[object] = index + for i in index+1.. T { - assert(index >= 0 && index < count) - return internalSet[index] + + // O(1) + public func object(at index: Int) -> T { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + return objects[index] } - - // Returns the 'maximum' or 'largest' value in the set. - public func max() -> T? { - return count == 0 ? nil : internalSet[count - 1] + + // O(1) + public func set(_ object: T, at index: Int) { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + guard indexOfKey[object] == nil else { + return + } + + indexOfKey.removeValue(forKey: objects[index]) + indexOfKey[object] = index + objects[index] = object } - - // Returns the 'minimum' or 'smallest' value in the set. - public func min() -> T? { - return count == 0 ? nil : internalSet[0] + + // O(1) + public func indexOf(_ object: T) -> Int { + return indexOfKey[object] ?? -1 } - - // Returns the k-th largest element in the set, if k is in the range - // [1, count]. Returns nil otherwise. - public func kLargest(_ k: Int) -> T? { - return k > count || k <= 0 ? nil : internalSet[count - k] + + // O(n) + public func remove(_ object: T) { + guard let index = indexOfKey[object] else { + return + } + + indexOfKey.removeValue(forKey: object) + objects.remove(at: index) + for i in index.. T? { - return k > count || k <= 0 ? nil : internalSet[k - 1] + + public func all() -> [T] { + return objects } } diff --git a/Ordered Set/OrderedSet.playground/contents.xcplayground b/Ordered Set/OrderedSet.playground/contents.xcplayground index 18c02c912..5da2641c9 100644 --- a/Ordered Set/OrderedSet.playground/contents.xcplayground +++ b/Ordered Set/OrderedSet.playground/contents.xcplayground @@ -1,8 +1,4 @@ - - - - - - + + \ No newline at end of file diff --git a/Ordered Set/OrderedSet.swift b/Ordered Set/OrderedSet.swift index a8b3b0966..8b6df7d3e 100644 --- a/Ordered Set/OrderedSet.swift +++ b/Ordered Set/OrderedSet.swift @@ -1,117 +1,77 @@ -/* - An Ordered Set is a collection where all items in the set follow an ordering, - usually ordered from 'least' to 'most'. The way you value and compare items - can be user-defined. -*/ -public struct OrderedSet { - private var internalSet = [T]() - - public init() { } - - // Returns the number of elements in the OrderedSet. - public var count: Int { - return internalSet.count - } - - // Inserts an item. Performance: O(n) - public mutating func insert(item: T) { - if exists(item) { - return // don't add an item if it already exists +public class OrderedSet { + private var objects: [T] = [] + private var indexOfKey: [T: Int] = [:] + + public init() {} + + // O(1) + public func add(_ object: T) { + guard indexOfKey[object] == nil else { + return } - - // Insert new the item just before the one that is larger. - for i in 0.. item { - internalSet.insert(item, atIndex: i) - return - } - } - - // Append to the back if the new item is greater than any other in the set. - internalSet.append(item) + + objects.append(object) + indexOfKey[object] = objects.count - 1 } - - // Removes an item if it exists. Performance: O(n) - public mutating func remove(item: T) { - if let index = indexOf(item) { - internalSet.removeAtIndex(index) + + // O(n) + public func insert(_ object: T, at index: Int) { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + guard indexOfKey[object] == nil else { + return } - } - - // Returns true if and only if the item exists somewhere in the set. - public func exists(item: T) -> Bool { - return indexOf(item) != nil - } - - // Returns the index of an item if it exists, or -1 otherwise. - public func indexOf(item: T) -> Int? { - var leftBound = 0 - var rightBound = count - 1 - - while leftBound <= rightBound { - let mid = leftBound + ((rightBound - leftBound) / 2) - - if internalSet[mid] > item { - rightBound = mid - 1 - } else if internalSet[mid] < item { - leftBound = mid + 1 - } else if internalSet[mid] == item { - return mid - } else { - // When we get here, we've landed on an item whose value is equal to the - // value of the item we're looking for, but the items themselves are not - // equal. We need to check the items with the same value to the right - // and to the left in order to find an exact match. - - // Check to the right. - for j in mid.stride(to: count - 1, by: 1) { - if internalSet[j + 1] == item { - return j + 1 - } else if internalSet[j] < internalSet[j + 1] { - break - } - } - - // Check to the left. - for j in mid.stride(to: 0, by: -1) { - if internalSet[j - 1] == item { - return j - 1 - } else if internalSet[j] > internalSet[j - 1] { - break - } - } - return nil - } + + objects.insert(object, at: index) + indexOfKey[object] = index + for i in index+1.. T { - assert(index >= 0 && index < count) - return internalSet[index] + + // O(1) + public func object(at index: Int) -> T { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + return objects[index] } - - // Returns the 'maximum' or 'largest' value in the set. - public func max() -> T? { - return count == 0 ? nil : internalSet[count - 1] + + // O(1) + public func set(_ object: T, at index: Int) { + assert(index < objects.count, "Index should be smaller than object count") + assert(index >= 0, "Index should be bigger than 0") + + guard indexOfKey[object] == nil else { + return + } + + indexOfKey.removeValue(forKey: objects[index]) + indexOfKey[object] = index + objects[index] = object } - - // Returns the 'minimum' or 'smallest' value in the set. - public func min() -> T? { - return count == 0 ? nil : internalSet[0] + + // O(1) + public func indexOf(_ object: T) -> Int { + return indexOfKey[object] ?? -1 } - - // Returns the k-th largest element in the set, if k is in the range - // [1, count]. Returns nil otherwise. - public func kLargest(k: Int) -> T? { - return k > count || k <= 0 ? nil : internalSet[count - k] + + // O(n) + public func remove(_ object: T) { + guard let index = indexOfKey[object] else { + return + } + + indexOfKey.removeValue(forKey: object) + objects.remove(at: index) + for i in index.. T? { - return k > count || k <= 0 ? nil : internalSet[k - 1] + + public func all() -> [T] { + return objects } } + diff --git a/Ordered Set/README.markdown b/Ordered Set/README.markdown index 11096d5bb..82d736731 100644 --- a/Ordered Set/README.markdown +++ b/Ordered Set/README.markdown @@ -1,338 +1,6 @@ # Ordered Set -## Sorted Array Version - -An Ordered Set is a collection of unique items in sorted order. Items are usually sorted from least to greatest. - -The Ordered Set data type is a hybrid of: - -- a [Set](https://en.wikipedia.org/wiki/Set_%28mathematics%29), a collection of unique items where the order does not matter, and -- a [Sequence](https://en.wikipedia.org/wiki/Sequence), an ordered list of items where each item may appear more than once. - -It's important to keep in mind that two items can have the same *value* but still may not be equal. For example, we could define "a" and "z" to have the same value (their lengths), but clearly "a" != "z". - -## Why use an ordered set? - -Ordered Sets should be considered when you need to keep your collection sorted at all times, and you do lookups on the collection much more frequently than inserting or deleting items. Many of the lookup operations for an Ordered Set are **O(1)**. - -A good example would be keeping track of the rankings of players in a scoreboard (see example 2 below). - -#### These are ordered sets - -A set of integers: - - [1, 2, 3, 6, 8, 10, 1000] - -A set of strings: - - ["a", "is", "set", "this"] - -The "value" of these strings could be their text content, but also for example their length. - -#### These are not ordered sets - -This set violates the property of uniqueness: - - [1, 1, 2, 3, 5, 8] - -This set violates the sorted property: - - [1, 11, 2, 3] - -## The code - -We'll start by creating our internal representation for the Ordered Set. Since the idea of a set is similar to that of an array, we will use an array to represent our set. Furthermore, since we'll need to keep the set sorted, we need to be able to compare the individual elements. Thus, any type must conform to the [Comparable Protocol](https://developer.apple.com/library/watchos/documentation/Swift/Reference/Swift_Comparable_Protocol/index.html). - -```swift -public struct OrderedSet { - private var internalSet = [T]() - - // Returns the number of elements in the OrderedSet. - public var count: Int { - return internalSet.count - } - ... -``` - -Lets take a look at the `insert()` function first. This first checks if the item already exists in the collection. If so, it returns and does not insert the item. Otherwise, it will insert the item through straightforward iteration. - -```swift - public mutating func insert(_ item: T){ - if exists(item) { - return // don't add an item if it already exists - } - - // Insert new the item just before the one that is larger. - for i in 0.. item { - internalSet.insert(item, at: i) - return - } - } - - // Append to the back if the new item is greater than any other in the set. - internalSet.append(item) - } -``` - -As we'll see later on, checking if the item is already in the set has an efficiency of **O(log(n) + k)** where **k** is the number of items with the same value as the item we are inserting. - -To insert the new item, the `for` loop starts from the beginning of the array, and checks to see if each item is larger than the item we want to insert. Once we find such an item, we insert the new one into its place. This shifts the rest of the array over to the right by 1 position. This loop is at worst **O(n)**. - -The total performance of the `insert()` function is therefore **O(n)**. - -Next up is the `remove()` function: - -```swift - public mutating func remove(_ item: T) { - if let index = index(of: item) { - internalSet.remove(at: index) - } - } -``` - -First this checks if the item exists and then removes it from the array. Because of the `removeAtIndex()` function, the efficiency for remove is **O(n)**. - -The next function is `indexOf()`, which takes in an object of type `T` and returns the index of the corresponding item if it is in the set, or `nil` if it is not. Since our set is sorted, we can use a binary search to quickly search for the item. - -```swift - public func index(of item: T) -> Int? { - var leftBound = 0 - var rightBound = count - 1 - - while leftBound <= rightBound { - let mid = leftBound + ((rightBound - leftBound) / 2) - - if internalSet[mid] > item { - rightBound = mid - 1 - } else if internalSet[mid] < item { - leftBound = mid + 1 - } else if internalSet[mid] == item { - return mid - } else { - // see below - } - } - return nil - } -``` - -> **Note:** If you are not familiar with the concept of binary search, we have an [article that explains all about it](../Binary%20Search). - -However, there is an important issue to deal with here. Recall that two objects can be unequal yet still have the same "value" for the purposes of comparing them. Since a set can contain multiple items with the same value, it is important to check that the binary search has landed on the correct item. - -For example, consider this ordered set of `Player` objects. Each `Player` has a name and a number of points: - - [ ("Bill", 50), ("Ada", 50), ("Jony", 50), ("Steve", 200), ("Jean-Louis", 500), ("Woz", 1000) ] - -We want the set to be ordered by points, from low to high. Multiple players can have the same number of points. The name of the player is not important for this ordering. However, the name *is* important for retrieving the correct item. - -Let's say we do `indexOf(bill)` where `bill` is player object `("Bill", 50)`. If we did a traditional binary search we'd land on index 2, which is the object `("Jony", 50)`. The value 50 matches, but it's not the object we're looking for! - -Therefore, we also need to check the items with the same value to the right and left of the midpoint. The code to check the left and right side looks like this: - -```swift - // Check to the right. - for j in mid.stride(to: count - 1, by: 1) { - if internalSet[j + 1] == item { - return j + 1 - } else if internalSet[j] < internalSet[j + 1] { - break - } - } - - // Check to the left. - for j in mid.stride(to: 0, by: -1) { - if internalSet[j - 1] == item { - return j - 1 - } else if internalSet[j] > internalSet[j - 1] { - break - } - } - - return nil -``` - -These loops start at the current `mid` value and then look at the neighboring values until we've found the correct object. - -The combined runtime for `indexOf()` is **O(log(n) + k)** where **n** is the length of the set, and **k** is the number of items with the same *value* as the one that is being searched for. - -Since the set is sorted, the following operations are all **O(1)**: - -```swift - // Returns the 'maximum' or 'largest' value in the set. - public func max() -> T? { - return count == 0 ? nil : internalSet[count - 1] - } - - // Returns the 'minimum' or 'smallest' value in the set. - public func min() -> T? { - return count == 0 ? nil : internalSet[0] - } - - // Returns the k-th largest element in the set, if k is in the range - // [1, count]. Returns nil otherwise. - public func kLargest(_ k: Int) -> T? { - return k > count || k <= 0 ? nil : internalSet[count - k] - } - - // Returns the k-th smallest element in the set, if k is in the range - // [1, count]. Returns nil otherwise. - public func kSmallest(_ k: Int) -> T? { - return k > count || k <= 0 ? nil : internalSet[k - 1] - } -``` - -## Examples - -Below are a few examples that can be found in the playground file. - -### Example 1 - -Here we create a set with random Integers. Printing the largest/smallest 5 numbers in the set is fairly easy. - -```swift -// Example 1 with type Int -var mySet = OrderedSet() - -// Insert random numbers into the set -for _ in 0..<50 { - mySet.insert(randomNum(50, max: 500)) -} - -print(mySet) - -print(mySet.max()) -print(mySet.min()) - -// Print the 5 largest values -for k in 1...5 { - print(mySet.kLargest(k)) -} - -// Print the 5 lowest values -for k in 1...5 { - print(mySet.kSmallest(k)) -} -``` - -### Example 2 - -In this example we take a look at something a bit more interesting. We define a `Player` struct as follows: - -```swift -public struct Player: Comparable { - public var name: String - public var points: Int -} -``` - -The `Player` also gets its own `==` and `<` operators. The `<` operator is used to determine the sort order of the set, while `==` determines whether two objects are really equal. - -Note that `==` compares both the name and the points: - -```swifr -func ==(x: Player, y: Player) -> Bool { - return x.name == y.name && x.points == y.points -} -``` - -But `<` only compares the points: - -```swift -func <(x: Player, y: Player) -> Bool { - return x.points < y.points -} -``` - -Therefore, two `Player`s can each have the same value (the number of points), but are not guaranteed to be equal (they can have different names). - -We create a new set and insert 20 random players. The `Player()` constructor gives each player a random name and score: - -```swift -var playerSet = OrderedSet() - -// Populate the set with random players. -for _ in 0..<20 { - playerSet.insert(Player()) -} -``` - -Insert another player: - -```swift -var anotherPlayer = Player() -playerSet.insert(anotherPlayer) -``` - -Now we use the `indexOf()` function to find out what rank `anotherPlayer` is. - -```swift -let level = playerSet.count - playerSet.indexOf(anotherPlayer)! -print("\(anotherPlayer.name) is ranked at level \(level) with \(anotherPlayer.points) points") -``` - -### Example 3 - -The final example demonstrates the need to look for the right item even after the binary search has completed. - -We insert 9 players into the set: - -```swift -var repeatedSet = OrderedSet() - -repeatedSet.insert(Player(name: "Player 1", points: 100)) -repeatedSet.insert(Player(name: "Player 2", points: 100)) -repeatedSet.insert(Player(name: "Player 3", points: 100)) -repeatedSet.insert(Player(name: "Player 4", points: 100)) -repeatedSet.insert(Player(name: "Player 5", points: 100)) -repeatedSet.insert(Player(name: "Player 6", points: 50)) -repeatedSet.insert(Player(name: "Player 7", points: 200)) -repeatedSet.insert(Player(name: "Player 8", points: 250)) -repeatedSet.insert(Player(name: "Player 9", points: 25)) -``` - -Notice how several of these players have the same value of 100 points. - -The set looks something like this: - - [Player 9, Player 6, Player 1, Player 2, Player 3, Player 4, Player 5, Player 7, Player 8] - -The next line looks for `Player 2`: - -```swift -print(repeatedSet.index(of: Player(name: "Player 2", points: 100))) -``` - -After the binary search finishes, the value of `mid` is at index 5: - - [Player 9, Player 6, Player 1, Player 2, Player 3, Player 4, Player 5, Player 7, Player 8] - mid - -However, this is not `Player 2`. Both `Player 4` and `Player 2` have the same points, but a different name. The binary search only looked at the points, not the name. - -But we do know that `Player 2` must be either to the immediate left or the right of `Player 4`, so we check both sides of `mid`. We only need to look at the objects with the same value as `Player 4`. The others are replaced by `X`: - - [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] - mid - -The code then first checks on the right of `mid` (where the `*` is): - - [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] - mid * - -The right side did not contain the item, so we look at the left side: - - [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] - * mid - - [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] - * mid - -Finally, we've found `Player 2`, and return index 3. - -## Apple's Ordered Set -Below the ordered set is based on sorted array. But [Apple's version](https://developer.apple.com/documentation/foundation/nsorderedset), it's pretty different. Now, let's look into how to implement apple's ordered set. +Let's look into how to implement [Ordered Set](https://developer.apple.com/documentation/foundation/nsorderedset). Here is the example about how it works @@ -450,4 +118,4 @@ public func remove(_ object: T) { } ``` -*Ordered Set is Written By Zain Humayun, Apple Ordered Set is Written By Kai Chen* +*Written By Kai Chen* diff --git a/Sorted Set/README.markdown b/Sorted Set/README.markdown new file mode 100644 index 000000000..a8b5ad1ea --- /dev/null +++ b/Sorted Set/README.markdown @@ -0,0 +1,334 @@ +# Sorted Set + +## Sorted Array Version + +An Sorted Set is a collection of unique items in sorted order. Items are usually sorted from least to greatest. + +The Sorted Set data type is a hybrid of: + +- a [Set](https://en.wikipedia.org/wiki/Set_%28mathematics%29), a collection of unique items where the order does not matter, and +- a [Sequence](https://en.wikipedia.org/wiki/Sequence), an sorted list of items where each item may appear more than once. + +It's important to keep in mind that two items can have the same *value* but still may not be equal. For example, we could define "a" and "z" to have the same value (their lengths), but clearly "a" != "z". + +## Why use an sorted set? + +Sorted Sets should be considered when you need to keep your collection sorted at all times, and you do lookups on the collection much more frequently than inserting or deleting items. Many of the lookup operations for an Sorted Set are **O(1)**. + +A good example would be keeping track of the rankings of players in a scoreboard (see example 2 below). + +#### These are sorted sets + +A set of integers: + + [1, 2, 3, 6, 8, 10, 1000] + +A set of strings: + + ["a", "is", "set", "this"] + +The "value" of these strings could be their text content, but also for example their length. + +#### These are not sorted sets + +This set violates the property of uniqueness: + + [1, 1, 2, 3, 5, 8] + +This set violates the sorted property: + + [1, 11, 2, 3] + +## The code + +We'll start by creating our internal representation for the Sorted Set. Since the idea of a set is similar to that of an array, we will use an array to represent our set. Furthermore, since we'll need to keep the set sorted, we need to be able to compare the individual elements. Thus, any type must conform to the [Comparable Protocol](https://developer.apple.com/library/watchos/documentation/Swift/Reference/Swift_Comparable_Protocol/index.html). + +```swift +public struct SortedSet { + private var internalSet = [T]() + + // Returns the number of elements in the SortedSet. + public var count: Int { + return internalSet.count + } + ... +``` + +Lets take a look at the `insert()` function first. This first checks if the item already exists in the collection. If so, it returns and does not insert the item. Otherwise, it will insert the item through straightforward iteration. + +```swift + public mutating func insert(_ item: T){ + if exists(item) { + return // don't add an item if it already exists + } + + // Insert new the item just before the one that is larger. + for i in 0.. item { + internalSet.insert(item, at: i) + return + } + } + + // Append to the back if the new item is greater than any other in the set. + internalSet.append(item) + } +``` + +As we'll see later on, checking if the item is already in the set has an efficiency of **O(log(n) + k)** where **k** is the number of items with the same value as the item we are inserting. + +To insert the new item, the `for` loop starts from the beginning of the array, and checks to see if each item is larger than the item we want to insert. Once we find such an item, we insert the new one into its place. This shifts the rest of the array over to the right by 1 position. This loop is at worst **O(n)**. + +The total performance of the `insert()` function is therefore **O(n)**. + +Next up is the `remove()` function: + +```swift + public mutating func remove(_ item: T) { + if let index = index(of: item) { + internalSet.remove(at: index) + } + } +``` + +First this checks if the item exists and then removes it from the array. Because of the `removeAtIndex()` function, the efficiency for remove is **O(n)**. + +The next function is `indexOf()`, which takes in an object of type `T` and returns the index of the corresponding item if it is in the set, or `nil` if it is not. Since our set is sorted, we can use a binary search to quickly search for the item. + +```swift + public func index(of item: T) -> Int? { + var leftBound = 0 + var rightBound = count - 1 + + while leftBound <= rightBound { + let mid = leftBound + ((rightBound - leftBound) / 2) + + if internalSet[mid] > item { + rightBound = mid - 1 + } else if internalSet[mid] < item { + leftBound = mid + 1 + } else if internalSet[mid] == item { + return mid + } else { + // see below + } + } + return nil + } +``` + +> **Note:** If you are not familiar with the concept of binary search, we have an [article that explains all about it](../Binary%20Search). + +However, there is an important issue to deal with here. Recall that two objects can be unequal yet still have the same "value" for the purposes of comparing them. Since a set can contain multiple items with the same value, it is important to check that the binary search has landed on the correct item. + +For example, consider this sorted set of `Player` objects. Each `Player` has a name and a number of points: + + [ ("Bill", 50), ("Ada", 50), ("Jony", 50), ("Steve", 200), ("Jean-Louis", 500), ("Woz", 1000) ] + +We want the set to be sorted by points, from low to high. Multiple players can have the same number of points. The name of the player is not important for this ordering. However, the name *is* important for retrieving the correct item. + +Let's say we do `indexOf(bill)` where `bill` is player object `("Bill", 50)`. If we did a traditional binary search we'd land on index 2, which is the object `("Jony", 50)`. The value 50 matches, but it's not the object we're looking for! + +Therefore, we also need to check the items with the same value to the right and left of the midpoint. The code to check the left and right side looks like this: + +```swift + // Check to the right. + for j in mid.stride(to: count - 1, by: 1) { + if internalSet[j + 1] == item { + return j + 1 + } else if internalSet[j] < internalSet[j + 1] { + break + } + } + + // Check to the left. + for j in mid.stride(to: 0, by: -1) { + if internalSet[j - 1] == item { + return j - 1 + } else if internalSet[j] > internalSet[j - 1] { + break + } + } + + return nil +``` + +These loops start at the current `mid` value and then look at the neighboring values until we've found the correct object. + +The combined runtime for `indexOf()` is **O(log(n) + k)** where **n** is the length of the set, and **k** is the number of items with the same *value* as the one that is being searched for. + +Since the set is sorted, the following operations are all **O(1)**: + +```swift + // Returns the 'maximum' or 'largest' value in the set. + public func max() -> T? { + return count == 0 ? nil : internalSet[count - 1] + } + + // Returns the 'minimum' or 'smallest' value in the set. + public func min() -> T? { + return count == 0 ? nil : internalSet[0] + } + + // Returns the k-th largest element in the set, if k is in the range + // [1, count]. Returns nil otherwise. + public func kLargest(_ k: Int) -> T? { + return k > count || k <= 0 ? nil : internalSet[count - k] + } + + // Returns the k-th smallest element in the set, if k is in the range + // [1, count]. Returns nil otherwise. + public func kSmallest(_ k: Int) -> T? { + return k > count || k <= 0 ? nil : internalSet[k - 1] + } +``` + +## Examples + +Below are a few examples that can be found in the playground file. + +### Example 1 + +Here we create a set with random Integers. Printing the largest/smallest 5 numbers in the set is fairly easy. + +```swift +// Example 1 with type Int +var mySet = SortedSet() + +// Insert random numbers into the set +for _ in 0..<50 { + mySet.insert(randomNum(50, max: 500)) +} + +print(mySet) + +print(mySet.max()) +print(mySet.min()) + +// Print the 5 largest values +for k in 1...5 { + print(mySet.kLargest(k)) +} + +// Print the 5 lowest values +for k in 1...5 { + print(mySet.kSmallest(k)) +} +``` + +### Example 2 + +In this example we take a look at something a bit more interesting. We define a `Player` struct as follows: + +```swift +public struct Player: Comparable { + public var name: String + public var points: Int +} +``` + +The `Player` also gets its own `==` and `<` operators. The `<` operator is used to determine the sort order of the set, while `==` determines whether two objects are really equal. + +Note that `==` compares both the name and the points: + +```swifr +func ==(x: Player, y: Player) -> Bool { + return x.name == y.name && x.points == y.points +} +``` + +But `<` only compares the points: + +```swift +func <(x: Player, y: Player) -> Bool { + return x.points < y.points +} +``` + +Therefore, two `Player`s can each have the same value (the number of points), but are not guaranteed to be equal (they can have different names). + +We create a new set and insert 20 random players. The `Player()` constructor gives each player a random name and score: + +```swift +var playerSet = SortedSet() + +// Populate the set with random players. +for _ in 0..<20 { + playerSet.insert(Player()) +} +``` + +Insert another player: + +```swift +var anotherPlayer = Player() +playerSet.insert(anotherPlayer) +``` + +Now we use the `indexOf()` function to find out what rank `anotherPlayer` is. + +```swift +let level = playerSet.count - playerSet.indexOf(anotherPlayer)! +print("\(anotherPlayer.name) is ranked at level \(level) with \(anotherPlayer.points) points") +``` + +### Example 3 + +The final example demonstrates the need to look for the right item even after the binary search has completed. + +We insert 9 players into the set: + +```swift +var repeatedSet = SortedSet() + +repeatedSet.insert(Player(name: "Player 1", points: 100)) +repeatedSet.insert(Player(name: "Player 2", points: 100)) +repeatedSet.insert(Player(name: "Player 3", points: 100)) +repeatedSet.insert(Player(name: "Player 4", points: 100)) +repeatedSet.insert(Player(name: "Player 5", points: 100)) +repeatedSet.insert(Player(name: "Player 6", points: 50)) +repeatedSet.insert(Player(name: "Player 7", points: 200)) +repeatedSet.insert(Player(name: "Player 8", points: 250)) +repeatedSet.insert(Player(name: "Player 9", points: 25)) +``` + +Notice how several of these players have the same value of 100 points. + +The set looks something like this: + + [Player 9, Player 6, Player 1, Player 2, Player 3, Player 4, Player 5, Player 7, Player 8] + +The next line looks for `Player 2`: + +```swift +print(repeatedSet.index(of: Player(name: "Player 2", points: 100))) +``` + +After the binary search finishes, the value of `mid` is at index 5: + + [Player 9, Player 6, Player 1, Player 2, Player 3, Player 4, Player 5, Player 7, Player 8] + mid + +However, this is not `Player 2`. Both `Player 4` and `Player 2` have the same points, but a different name. The binary search only looked at the points, not the name. + +But we do know that `Player 2` must be either to the immediate left or the right of `Player 4`, so we check both sides of `mid`. We only need to look at the objects with the same value as `Player 4`. The others are replaced by `X`: + + [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] + mid + +The code then first checks on the right of `mid` (where the `*` is): + + [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] + mid * + +The right side did not contain the item, so we look at the left side: + + [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] + * mid + + [X, X, Player 1, Player 2, Player 3, Player 4, Player 5, X, X] + * mid + +Finally, we've found `Player 2`, and return index 3. + +*Written By Zain Humayun* diff --git a/Ordered Set/OrderedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift b/Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift similarity index 94% rename from Ordered Set/OrderedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift rename to Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift index c12dadf0f..45af5f99d 100644 --- a/Ordered Set/OrderedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift +++ b/Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/Contents.swift @@ -5,7 +5,7 @@ print("Hello, Swift 4!") //: # Example 1 with type Int -var mySet = OrderedSet() +var mySet = SortedSet() // Insert random numbers into the set for _ in 0..<50 { diff --git a/Ordered Set/OrderedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline b/Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline similarity index 50% rename from Ordered Set/OrderedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline rename to Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline index 53114d22e..dffc42643 100644 --- a/Ordered Set/OrderedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline +++ b/Sorted Set/SortedSet.playground/Pages/Example 1.xcplaygroundpage/timeline.xctimeline @@ -3,17 +3,17 @@ version = "3.0"> diff --git a/Ordered Set/OrderedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift b/Sorted Set/SortedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift similarity index 95% rename from Ordered Set/OrderedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift rename to Sorted Set/SortedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift index c30260fff..2408d35d2 100644 --- a/Ordered Set/OrderedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift +++ b/Sorted Set/SortedSet.playground/Pages/Example 2.xcplaygroundpage/Contents.swift @@ -2,7 +2,7 @@ //: # Example 2 with Player objects -var playerSet = OrderedSet() +var playerSet = SortedSet() // Populate the set with random players. for _ in 0..<20 { diff --git a/Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift b/Sorted Set/SortedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift similarity index 95% rename from Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift rename to Sorted Set/SortedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift index 52f154c05..63edd11d2 100644 --- a/Ordered Set/OrderedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift +++ b/Sorted Set/SortedSet.playground/Pages/Example 3.xcplaygroundpage/Contents.swift @@ -2,7 +2,7 @@ //: # Example 3: multiple entries with the same value -var repeatedSet = OrderedSet() +var repeatedSet = SortedSet() repeatedSet.insert(Player(name: "Player 1", points: 100)) repeatedSet.insert(Player(name: "Player 2", points: 100)) diff --git a/Ordered Set/OrderedSet.playground/Sources/Player.swift b/Sorted Set/SortedSet.playground/Sources/Player.swift similarity index 95% rename from Ordered Set/OrderedSet.playground/Sources/Player.swift rename to Sorted Set/SortedSet.playground/Sources/Player.swift index 26835b0a8..0960b2400 100644 --- a/Ordered Set/OrderedSet.playground/Sources/Player.swift +++ b/Sorted Set/SortedSet.playground/Sources/Player.swift @@ -3,12 +3,12 @@ public struct Player: Comparable { public var name: String public var points: Int - + public init() { self.name = String.random() self.points = random(min: 0, max: 5000) } - + public init(name: String, points: Int) { self.name = name self.points = points @@ -31,7 +31,7 @@ public func print(player: Player) { print("Player: \(player.name) | Points: \(player.points)") } -public func print(set: OrderedSet) { +public func print(set: SortedSet) { for i in 0.. String { let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" var randomString: String = "" - + for _ in 0.. { + private var internalSet = [T]() + + public init() { } + + // Returns the number of elements in the SortedSet. + public var count: Int { + return internalSet.count + } + + // Inserts an item. Performance: O(n) + public mutating func insert(_ item: T) { + if exists(item) { + return // don't add an item if it already exists + } + + // Insert new the item just before the one that is larger. + for i in 0.. item { + internalSet.insert(item, at: i) + return + } + } + + // Append to the back if the new item is greater than any other in the set. + internalSet.append(item) + } + + // Removes an item if it exists. Performance: O(n) + public mutating func remove(_ item: T) { + if let index = index(of: item) { + internalSet.remove(at: index) + } + } + + // Returns true if and only if the item exists somewhere in the set. + public func exists(_ item: T) -> Bool { + return index(of: item) != nil + } + + // Returns the index of an item if it exists, or -1 otherwise. + public func index(of item: T) -> Int? { + var leftBound = 0 + var rightBound = count - 1 + + while leftBound <= rightBound { + let mid = leftBound + ((rightBound - leftBound) / 2) + + if internalSet[mid] > item { + rightBound = mid - 1 + } else if internalSet[mid] < item { + leftBound = mid + 1 + } else if internalSet[mid] == item { + return mid + } else { + // When we get here, we've landed on an item whose value is equal to the + // value of the item we're looking for, but the items themselves are not + // equal. We need to check the items with the same value to the right + // and to the left in order to find an exact match. + + // Check to the right. + for j in stride(from: mid, to: count - 1, by: 1) { + if internalSet[j + 1] == item { + return j + 1 + } else if internalSet[j] < internalSet[j + 1] { + break + } + } + + // Check to the left. + for j in stride(from: mid, to: 0, by: -1) { + if internalSet[j - 1] == item { + return j - 1 + } else if internalSet[j] > internalSet[j - 1] { + break + } + } + return nil + } + } + return nil + } + + // Returns the item at the given index. + // Assertion fails if the index is out of the range of [0, count). + public subscript(index: Int) -> T { + assert(index >= 0 && index < count) + return internalSet[index] + } + + // Returns the 'maximum' or 'largest' value in the set. + public func max() -> T? { + return count == 0 ? nil : internalSet[count - 1] + } + + // Returns the 'minimum' or 'smallest' value in the set. + public func min() -> T? { + return count == 0 ? nil : internalSet[0] + } + + // Returns the k-th largest element in the set, if k is in the range + // [1, count]. Returns nil otherwise. + public func kLargest(_ k: Int) -> T? { + return k > count || k <= 0 ? nil : internalSet[count - k] + } + + // Returns the k-th smallest element in the set, if k is in the range + // [1, count]. Returns nil otherwise. + public func kSmallest(_ k: Int) -> T? { + return k > count || k <= 0 ? nil : internalSet[k - 1] + } +} + diff --git a/Sorted Set/SortedSet.playground/contents.xcplayground b/Sorted Set/SortedSet.playground/contents.xcplayground new file mode 100644 index 000000000..18c02c912 --- /dev/null +++ b/Sorted Set/SortedSet.playground/contents.xcplayground @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/Ordered Set/OrderedSet.playground/playground.xcworkspace/contents.xcworkspacedata b/Sorted Set/SortedSet.playground/playground.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Ordered Set/OrderedSet.playground/playground.xcworkspace/contents.xcworkspacedata rename to Sorted Set/SortedSet.playground/playground.xcworkspace/contents.xcworkspacedata diff --git a/Sorted Set/SortedSet.swift b/Sorted Set/SortedSet.swift new file mode 100644 index 000000000..69546da0d --- /dev/null +++ b/Sorted Set/SortedSet.swift @@ -0,0 +1,118 @@ +/* + An Sorted Set is a collection where all items in the set follow an ordering, + usually sorted from 'least' to 'most'. The way you value and compare items + can be user-defined. + */ +public struct SortedSet { + private var internalSet = [T]() + + public init() { } + + // Returns the number of elements in the SortedSet. + public var count: Int { + return internalSet.count + } + + // Inserts an item. Performance: O(n) + public mutating func insert(_ item: T) { + if exists(item) { + return // don't add an item if it already exists + } + + // Insert new the item just before the one that is larger. + for i in 0.. item { + internalSet.insert(item, at: i) + return + } + } + + // Append to the back if the new item is greater than any other in the set. + internalSet.append(item) + } + + // Removes an item if it exists. Performance: O(n) + public mutating func remove(_ item: T) { + if let index = index(of: item) { + internalSet.remove(at: index) + } + } + + // Returns true if and only if the item exists somewhere in the set. + public func exists(_ item: T) -> Bool { + return index(of: item) != nil + } + + // Returns the index of an item if it exists, or -1 otherwise. + public func index(of item: T) -> Int? { + var leftBound = 0 + var rightBound = count - 1 + + while leftBound <= rightBound { + let mid = leftBound + ((rightBound - leftBound) / 2) + + if internalSet[mid] > item { + rightBound = mid - 1 + } else if internalSet[mid] < item { + leftBound = mid + 1 + } else if internalSet[mid] == item { + return mid + } else { + // When we get here, we've landed on an item whose value is equal to the + // value of the item we're looking for, but the items themselves are not + // equal. We need to check the items with the same value to the right + // and to the left in order to find an exact match. + + // Check to the right. + for j in stride(from: mid, to: count - 1, by: 1) { + if internalSet[j + 1] == item { + return j + 1 + } else if internalSet[j] < internalSet[j + 1] { + break + } + } + + // Check to the left. + for j in stride(from: mid, to: 0, by: -1) { + if internalSet[j - 1] == item { + return j - 1 + } else if internalSet[j] > internalSet[j - 1] { + break + } + } + return nil + } + } + return nil + } + + // Returns the item at the given index. + // Assertion fails if the index is out of the range of [0, count). + public subscript(index: Int) -> T { + assert(index >= 0 && index < count) + return internalSet[index] + } + + // Returns the 'maximum' or 'largest' value in the set. + public func max() -> T? { + return count == 0 ? nil : internalSet[count - 1] + } + + // Returns the 'minimum' or 'smallest' value in the set. + public func min() -> T? { + return count == 0 ? nil : internalSet[0] + } + + // Returns the k-th largest element in the set, if k is in the range + // [1, count]. Returns nil otherwise. + public func kLargest(_ k: Int) -> T? { + return k > count || k <= 0 ? nil : internalSet[count - k] + } + + // Returns the k-th smallest element in the set, if k is in the range + // [1, count]. Returns nil otherwise. + public func kSmallest(_ k: Int) -> T? { + return k > count || k <= 0 ? nil : internalSet[k - 1] + } +} + diff --git a/swift-algorithm-club.xcworkspace/contents.xcworkspacedata b/swift-algorithm-club.xcworkspace/contents.xcworkspacedata index fbaa4cd54..3c7134d72 100644 --- a/swift-algorithm-club.xcworkspace/contents.xcworkspacedata +++ b/swift-algorithm-club.xcworkspace/contents.xcworkspacedata @@ -1,6 +1,19 @@ + + + + + + + + @@ -1807,12 +1820,6 @@ - - - - From 677e3cefa18c9a815d7d2509e1198553c7a63468 Mon Sep 17 00:00:00 2001 From: Giuseppe Lanza Date: Thu, 4 Jan 2018 14:48:07 +0000 Subject: [PATCH 06/39] IntroSort playground implementation --- Introsort/Introsort.playground/Contents.swift | 41 +++++++++++++++ .../Sources/HeapSort.swift | 50 +++++++++++++++++++ .../Sources/InsertionSort.swift | 28 +++++++++++ .../Sources/Partition.swift | 43 ++++++++++++++++ .../Sources/Randomize.swift | 9 ++++ .../Introsort.playground/Sources/Sort3.swift | 21 ++++++++ .../contents.xcplayground | 4 ++ 7 files changed, 196 insertions(+) create mode 100644 Introsort/Introsort.playground/Contents.swift create mode 100644 Introsort/Introsort.playground/Sources/HeapSort.swift create mode 100644 Introsort/Introsort.playground/Sources/InsertionSort.swift create mode 100644 Introsort/Introsort.playground/Sources/Partition.swift create mode 100644 Introsort/Introsort.playground/Sources/Randomize.swift create mode 100644 Introsort/Introsort.playground/Sources/Sort3.swift create mode 100644 Introsort/Introsort.playground/contents.xcplayground diff --git a/Introsort/Introsort.playground/Contents.swift b/Introsort/Introsort.playground/Contents.swift new file mode 100644 index 000000000..43ee02e3f --- /dev/null +++ b/Introsort/Introsort.playground/Contents.swift @@ -0,0 +1,41 @@ +//: Playground - noun: a place where people can play + +import Foundation + +func introsort(_ array: inout [T], by areInIncreasingOrder: (T, T) -> Bool) { + //The depth limit is as best practice 2 * log( n ) + let depthLimit = 2 * floor(log2(Double(array.count))) + + introSortImplementation(for: &array, range: 0..(for array: inout [T], range: Range, depthLimit: Int, by areInIncreasingOrder: (T, T) -> Bool) { + if array.distance(from: range.lowerBound, to: range.upperBound) < 20 { + //if the partition count is less than 20 we can sort it using insertion sort. This algorithm in fact performs well on collections + //of this size, plus, at this point is quite probable that the quisksort part of the algorithm produced a partition which is + //nearly sorted. As we knoe insertion sort tends to O( n ) if this is the case. + insertionSort(for: &array, range: range, by: areInIncreasingOrder) + } else if depthLimit == 0 { + //If we reached the depth limit for this recursion branch, it's possible that we are hitting quick sort's worst case. + //Since quicksort degrades to O( n^2 ) in its worst case we stop using quicksort for this recursion branch and we switch to heapsort. + //Our preference remains quicksort, and we hope to be rare to see this condition to be true + heapsort(for: &array, range: range, by: areInIncreasingOrder) + } else { + //By default we use quicksort to sort our collection. The partition index method chose a pivot, and puts all the + //elements less than pivot on the left, and the ones bigger than pivot on the right. At the end of the operation the + //position of the pivot in the array is returned so that we can form the two partitions. + let partIdx = partitionIndex(for: &array, subRange: range, by: areInIncreasingOrder) + + //We can recursively call introsort implementation, decreasing the depthLimit for the left partition and the right partition. + introSortImplementation(for: &array, range: range.lowerBound..(_ elements: inout [T], _ index: Int, _ range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + let countToIndex = elements.distance(from: range.lowerBound, to: index) + let countFromIndex = elements.distance(from: index, to: range.upperBound) + + guard countToIndex + 1 < countFromIndex else { return } + + let left = elements.index(index, offsetBy: countToIndex + 1) + var largest = index + if areInIncreasingOrder(elements[largest], elements[left]) { + largest = left + } + + if countToIndex + 2 < countFromIndex { + let right = elements.index(after: left) + if areInIncreasingOrder(elements[largest], elements[right]) { + largest = right + } + } + + if largest != index { + elements.swapAt(index, largest) + shiftDown(&elements, largest, range, by: areInIncreasingOrder) + } + +} + +private func heapify(_ list: inout [T], _ range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + let root = range.lowerBound + var node = list.index(root, offsetBy: list.distance(from: range.lowerBound, to: range.upperBound)/2) + + while node != root { + list.formIndex(before: &node) + shiftDown(&list, node, range, by: areInIncreasingOrder) + } +} + +public func heapsort(for array: inout [T], range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + var hi = range.upperBound + let lo = range.lowerBound + heapify(&array, range, by: areInIncreasingOrder) + array.formIndex(before: &hi) + + while hi != lo { + array.swapAt(lo, hi) + shiftDown(&array, lo, lo..(for array: inout [T], range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + guard !range.isEmpty else { return } + + let start = range.lowerBound + var sortedEnd = start + + array.formIndex(after: &sortedEnd) + while sortedEnd != range.upperBound { + let x = array[sortedEnd] + + var i = sortedEnd + repeat { + let predecessor = array[array.index(before: i)] + + guard areInIncreasingOrder(x, predecessor) else { break } + array[i] = predecessor + array.formIndex(before: &i) + } while i != start + + if i != sortedEnd { + array[i] = x + } + array.formIndex(after: &sortedEnd) + } + +} diff --git a/Introsort/Introsort.playground/Sources/Partition.swift b/Introsort/Introsort.playground/Sources/Partition.swift new file mode 100644 index 000000000..e24636da7 --- /dev/null +++ b/Introsort/Introsort.playground/Sources/Partition.swift @@ -0,0 +1,43 @@ +import Foundation + +public func partitionIndex(for elements: inout [T], subRange range: Range, by areInIncreasingOrder: (T, T) -> Bool) -> Int { + var lo = range.lowerBound + var hi = elements.index(before: range.upperBound) + + // Sort the first, middle, and last elements, then use the middle value + // as the pivot for the partition. + let half = elements.distance(from: lo, to: hi) / 2 + let mid = elements.index(lo, offsetBy: half) + + sort3(in: &elements, a: lo, b: mid, c: hi, by: areInIncreasingOrder) + let pivot = elements[mid] + + while true { + elements.formIndex(after: &lo) + guard findLo(in: elements, pivot: pivot, from: &lo, to: hi, by: areInIncreasingOrder) else { break } + elements.formIndex(before: &hi) + guard findHi(in: elements, pivot: pivot, from: lo, to: &hi, by: areInIncreasingOrder) else { break } + elements.swapAt(lo, hi) + } + + + return lo +} + +private func findLo(in array: [T], pivot: T, from lo: inout Int, to hi: Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool { + while lo != hi { + if !areInIncreasingOrder(array[lo], pivot) { + return true + } + array.formIndex(after: &lo) + } + return false +} + +private func findHi(in array: [T], pivot: T, from lo: Int, to hi: inout Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool { + while hi != lo { + if areInIncreasingOrder(array[hi], pivot) { return true } + array.formIndex(before: &hi) + } + return false +} diff --git a/Introsort/Introsort.playground/Sources/Randomize.swift b/Introsort/Introsort.playground/Sources/Randomize.swift new file mode 100644 index 000000000..6d1d57132 --- /dev/null +++ b/Introsort/Introsort.playground/Sources/Randomize.swift @@ -0,0 +1,9 @@ +import Foundation + +public func randomize(n: Int) -> [Int] { + var unsorted = [Int]() + for _ in 0..(in array: inout [T], a: Int, b: Int, c: Int, by areInIncreasingOrder: (T, T) -> Bool) { + switch (areInIncreasingOrder(array[b], array[a]), + areInIncreasingOrder(array[c], array[b])) { + case (false, false): break + case (true, true): array.swapAt(a, c) + case (true, false): + array.swapAt(a, b) + + if areInIncreasingOrder(array[c], array[b]) { + array.swapAt(b, c) + } + case (false, true): + array.swapAt(b, c) + + if areInIncreasingOrder(array[b], array[a]) { + array.swapAt(a, b) + } + } +} diff --git a/Introsort/Introsort.playground/contents.xcplayground b/Introsort/Introsort.playground/contents.xcplayground new file mode 100644 index 000000000..5da2641c9 --- /dev/null +++ b/Introsort/Introsort.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 717ba94933686ea00068b5fc4ea0bc223c93cf38 Mon Sep 17 00:00:00 2001 From: Giuseppe Lanza Date: Thu, 4 Jan 2018 15:49:29 +0000 Subject: [PATCH 07/39] Added readme file --- Introsort/HeapSort.swift | 50 ++++++++++++++++ Introsort/InsertionSort.swift | 28 +++++++++ Introsort/IntroSort.swift | 32 ++++++++++ Introsort/Partition.swift | 43 +++++++++++++ Introsort/README.markdown | 110 ++++++++++++++++++++++++++++++++++ Introsort/Randomize.swift | 9 +++ Introsort/Sort3.swift | 21 +++++++ README.markdown | 4 ++ 8 files changed, 297 insertions(+) create mode 100644 Introsort/HeapSort.swift create mode 100644 Introsort/InsertionSort.swift create mode 100644 Introsort/IntroSort.swift create mode 100644 Introsort/Partition.swift create mode 100644 Introsort/README.markdown create mode 100644 Introsort/Randomize.swift create mode 100644 Introsort/Sort3.swift diff --git a/Introsort/HeapSort.swift b/Introsort/HeapSort.swift new file mode 100644 index 000000000..f5bc466da --- /dev/null +++ b/Introsort/HeapSort.swift @@ -0,0 +1,50 @@ +import Foundation + +private func shiftDown(_ elements: inout [T], _ index: Int, _ range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + let countToIndex = elements.distance(from: range.lowerBound, to: index) + let countFromIndex = elements.distance(from: index, to: range.upperBound) + + guard countToIndex + 1 < countFromIndex else { return } + + let left = elements.index(index, offsetBy: countToIndex + 1) + var largest = index + if areInIncreasingOrder(elements[largest], elements[left]) { + largest = left + } + + if countToIndex + 2 < countFromIndex { + let right = elements.index(after: left) + if areInIncreasingOrder(elements[largest], elements[right]) { + largest = right + } + } + + if largest != index { + elements.swapAt(index, largest) + shiftDown(&elements, largest, range, by: areInIncreasingOrder) + } + +} + +private func heapify(_ list: inout [T], _ range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + let root = range.lowerBound + var node = list.index(root, offsetBy: list.distance(from: range.lowerBound, to: range.upperBound)/2) + + while node != root { + list.formIndex(before: &node) + shiftDown(&list, node, range, by: areInIncreasingOrder) + } +} + +public func heapsort(for array: inout [T], range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + var hi = range.upperBound + let lo = range.lowerBound + heapify(&array, range, by: areInIncreasingOrder) + array.formIndex(before: &hi) + + while hi != lo { + array.swapAt(lo, hi) + shiftDown(&array, lo, lo..(for array: inout [T], range: Range, by areInIncreasingOrder: (T, T) -> Bool) { + guard !range.isEmpty else { return } + + let start = range.lowerBound + var sortedEnd = start + + array.formIndex(after: &sortedEnd) + while sortedEnd != range.upperBound { + let x = array[sortedEnd] + + var i = sortedEnd + repeat { + let predecessor = array[array.index(before: i)] + + guard areInIncreasingOrder(x, predecessor) else { break } + array[i] = predecessor + array.formIndex(before: &i) + } while i != start + + if i != sortedEnd { + array[i] = x + } + array.formIndex(after: &sortedEnd) + } + +} diff --git a/Introsort/IntroSort.swift b/Introsort/IntroSort.swift new file mode 100644 index 000000000..866b2603f --- /dev/null +++ b/Introsort/IntroSort.swift @@ -0,0 +1,32 @@ +import Foundation + +public func introsort(_ array: inout [T], by areInIncreasingOrder: (T, T) -> Bool) { + //The depth limit is as best practice 2 * log( n ) + let depthLimit = 2 * floor(log2(Double(array.count))) + + introSortImplementation(for: &array, range: 0..(for array: inout [T], range: Range, depthLimit: Int, by areInIncreasingOrder: (T, T) -> Bool) { + if array.distance(from: range.lowerBound, to: range.upperBound) < 20 { + //if the partition count is less than 20 we can sort it using insertion sort. This algorithm in fact performs well on collections + //of this size, plus, at this point is quite probable that the quisksort part of the algorithm produced a partition which is + //nearly sorted. As we knoe insertion sort tends to O( n ) if this is the case. + insertionSort(for: &array, range: range, by: areInIncreasingOrder) + } else if depthLimit == 0 { + //If we reached the depth limit for this recursion branch, it's possible that we are hitting quick sort's worst case. + //Since quicksort degrades to O( n^2 ) in its worst case we stop using quicksort for this recursion branch and we switch to heapsort. + //Our preference remains quicksort, and we hope to be rare to see this condition to be true + heapsort(for: &array, range: range, by: areInIncreasingOrder) + } else { + //By default we use quicksort to sort our collection. The partition index method chose a pivot, and puts all the + //elements less than pivot on the left, and the ones bigger than pivot on the right. At the end of the operation the + //position of the pivot in the array is returned so that we can form the two partitions. + let partIdx = partitionIndex(for: &array, subRange: range, by: areInIncreasingOrder) + + //We can recursively call introsort implementation, decreasing the depthLimit for the left partition and the right partition. + introSortImplementation(for: &array, range: range.lowerBound..(for elements: inout [T], subRange range: Range, by areInIncreasingOrder: (T, T) -> Bool) -> Int { + var lo = range.lowerBound + var hi = elements.index(before: range.upperBound) + + // Sort the first, middle, and last elements, then use the middle value + // as the pivot for the partition. + let half = elements.distance(from: lo, to: hi) / 2 + let mid = elements.index(lo, offsetBy: half) + + sort3(in: &elements, a: lo, b: mid, c: hi, by: areInIncreasingOrder) + let pivot = elements[mid] + + while true { + elements.formIndex(after: &lo) + guard findLo(in: elements, pivot: pivot, from: &lo, to: hi, by: areInIncreasingOrder) else { break } + elements.formIndex(before: &hi) + guard findHi(in: elements, pivot: pivot, from: lo, to: &hi, by: areInIncreasingOrder) else { break } + elements.swapAt(lo, hi) + } + + + return lo +} + +private func findLo(in array: [T], pivot: T, from lo: inout Int, to hi: Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool { + while lo != hi { + if !areInIncreasingOrder(array[lo], pivot) { + return true + } + array.formIndex(after: &lo) + } + return false +} + +private func findHi(in array: [T], pivot: T, from lo: Int, to hi: inout Int, by areInIncreasingOrder: (T, T)->Bool) -> Bool { + while hi != lo { + if areInIncreasingOrder(array[hi], pivot) { return true } + array.formIndex(before: &hi) + } + return false +} diff --git a/Introsort/README.markdown b/Introsort/README.markdown new file mode 100644 index 000000000..c4ee6f804 --- /dev/null +++ b/Introsort/README.markdown @@ -0,0 +1,110 @@ +# IntroSort + +Goal: Sort an array from low to high (or high to low). + +IntroSort is the algorithm used by swift to sort a collection. Introsort is an hybrid algorithm invented by David Musser in 1993 with the purpose of giving a generic sorting algorithm for the C++ standard library. The classic implementation of introsort expect a recursive Quicksort with fallback to Heapsort in case the recursion depth level reached a certain max. The maximum depends on the number of elements in the collection and it is usually 2 * log(n). The reason behind this “fallback” is that if Quicksort was not able to get the solution after 2 * log(n) recursions for a branch, probably it hit its worst case and it is degrading to complexity O( n^2 ). To optimise even further this algorithm, the swift implementation introduce an extra step in each recursion where the partition is sorted using InsertionSort if the count of the partition is less than 20. + +The number 20 is an empiric number obtained observing the behaviour of InsertionSort with lists of this size. + +Here's an implementation in Pseudocode: + +``` +procedure sort(A : array): + let maxdepth = ⌊log(length(A))⌋ × 2 + introSort(A, maxdepth) + +procedure introsort(A, maxdepth): + n ← length(A) + if n < 20: + insertionsort(A) + else if maxdepth = 0: + heapsort(A) + else: + p ← partition(A) // the pivot is selected using median of 3 + introsort(A[0:p], maxdepth - 1) + introsort(A[p+1:n], maxdepth - 1) +``` + +## An example + +Let's walk through the example. The array is initially: + + [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ] + + +for this example let's assume that `maxDepth` is **2** and that the size of the partition for the insertionSort to kick in is **5** + +At the first iteration we run introSort on the full collection that counts 13 elements. the maxDepth is 2, therefore we fall in the else case where quicksort acts. + +The `partition` method picks the first element, the median and the last, it sorts them and uses the new median as pivot. + + [ 10, 8, 26 ] -> [ 8, 10, 26 ] + +Our array is now + + [ 8, 0, 3, 9, 2, 14, 10, 27, 1, 5, 8, -1, 26 ] + +**10** is the pivot. After the choice of the pivot, the `partition` method swaps elements to get all the elements less than pivot on the left, and all the elements more or equal than pivot on the right. + + [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10, 27, 14, 26 ] + +Because of the swaps, the index of of pivot is now changed and returned. The next step of introsort is to call recursively itself for the two sub arrays: + + less: [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10 ] + greater: [ 27, 14, 26 ] + +## maxDepth: 1, branch: less + + [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10 ] + +The count of the array is still more than 5 so we don't meet yet the conditions for insertion sort to kick in. At this iteration maxDepth is decreased by one but it is still more than zero, so heapsort will not act. + +Just like in the previous iteration quicksort wins and the `partition` method choses a pivot and sorts the elemets less than pivot on the left and the elements more or equeal than pivot on the right. + + array: [ 8, 0, 3, 9, 2, 1, 5, 8, -1, 10 ] + pivot candidates: [ 8, 1, 10] -> [ 1, 8, 10] + pivot: 8 + before partition: [ 1, 0, 3, 9, 2, 8, 5, 8, -1, 10 ] + after partition: [ 1, 0, 3, -1, 2, 5, 8, 8, 9, 10 ] + + less: [ 1, 0, 3, -1, 2, 5, 8 ] + greater: [ 8, 9, 10 ] + +## maxDepth: 0, branch: less + + [ 1, 0, 3, -1, 2, 5, 8 ] + +Just like before, introsort is recursively executed for `less` and greater. This time `less`has a count more than **5** so it will not be sorted with insertion sort, but the maxDepth decreased again by 1 is now 0 and heapsort takes over sorting the array. + + heapsort -> [ -1, 0, 1, 2, 3, 5, 8 ] + +## maxDepth: 0, branch: greater + + [ 8, 9, 10 ] + +following greater in this recursion, the count of elements is 3, which is less than 5, so this partition is sorted using insertionSort. + + insertionSort -> [ 8, 9 , 10] + + +## back to maxDepth = 1, branch: greater + + [ 27, 14, 26 ] + +At this point the original array has mutated to be + + [ -1, 0, 1, 2, 3, 5, 8, 8, 9, 10, 27, 14, 26 ] + +now the `less` partition is sorted and since the count of the `greater` partition is 3 it will be sorted with insertion sort `[ 14, 26, 27 ]` + +The array is now successfully sorted + + [ -1, 0, 1, 2, 3, 5, 8, 8, 9, 10, 14, 26, 27 ] + + +## See also + +[Introsort on Wikipedia](https://en.wikipedia.org/wiki/Introsort) +[Introsort comparison with other sorting algorithms](http://agostini.tech/2017/12/18/swift-sorting-algorithm/) + +*Written for Swift Algorithm Club by Giuseppe Lanza* diff --git a/Introsort/Randomize.swift b/Introsort/Randomize.swift new file mode 100644 index 000000000..6d1d57132 --- /dev/null +++ b/Introsort/Randomize.swift @@ -0,0 +1,9 @@ +import Foundation + +public func randomize(n: Int) -> [Int] { + var unsorted = [Int]() + for _ in 0..(in array: inout [T], a: Int, b: Int, c: Int, by areInIncreasingOrder: (T, T) -> Bool) { + switch (areInIncreasingOrder(array[b], array[a]), + areInIncreasingOrder(array[c], array[b])) { + case (false, false): break + case (true, true): array.swapAt(a, c) + case (true, false): + array.swapAt(a, b) + + if areInIncreasingOrder(array[c], array[b]) { + array.swapAt(b, c) + } + case (false, true): + array.swapAt(b, c) + + if areInIncreasingOrder(array[b], array[a]) { + array.swapAt(a, b) + } + } +} diff --git a/README.markdown b/README.markdown index 46544682e..beac173d6 100644 --- a/README.markdown +++ b/README.markdown @@ -73,6 +73,10 @@ Fast sorts: - [Merge Sort](Merge%20Sort/) - [Heap Sort](Heap%20Sort/) +Hybrid sorts: + +- [Introsort](Introsort/) + Special-purpose sorts: - [Counting Sort](Counting%20Sort/) From e30467bcc9a9681780cee9d7206f4e2bda776ac6 Mon Sep 17 00:00:00 2001 From: Davis Riedel Date: Sat, 6 Jan 2018 22:47:22 +0100 Subject: [PATCH 08/39] Improvements to Heap - renamed "elements" to "nodes" to clarify the difference between array and heap. This also unifies code and comments, which were sometimes referring to the array as "nodes". - made nodes publicly readable but only settable within the heap itself. To change the nodes/operate on the heap, the provided functions should be used, to guarantee the heaps structure. - renamed isOrderedBefore to orderCriteria. The variable name isOrderedBefore did not clearly explain what the variable is for/what the closure stored within does - added method to get node at a specific index - replace method should not force the replaced value to be higher/lower than its parent. Instead replace should remove the node to be replaced and insert the given value as a new one in order to preserve the heap's structure. Asserting crashes the whole program. - added @discardableResult to removeAt. If remove is @discardableResult removeAt should be as well in for consistency. - replaced while true in shiftDown with a recursive call. while true is bad programming style. - simplified indexOf method - added a removeNode method for heaps with equatable data type - improved, adjusted and added descriptions - made functions private where fileprivate was not needed - added tests for new functions and tested everything - updated README where necessary (to conform to new code, only a few changes) --- Heap/Heap.swift | 187 +++++++++--------- Heap/README.markdown | 12 +- Heap/Tests/HeapTests.swift | 97 +++++---- Heap/Tests/Tests.xcodeproj/project.pbxproj | 14 +- .../contents.xcworkspacedata | 0 .../xcshareddata/xcschemes/Tests.xcscheme | 2 +- 6 files changed, 172 insertions(+), 140 deletions(-) mode change 100644 => 100755 Heap/Heap.swift mode change 100644 => 100755 Heap/README.markdown mode change 100644 => 100755 Heap/Tests/HeapTests.swift mode change 100644 => 100755 Heap/Tests/Tests.xcodeproj/project.pbxproj mode change 100644 => 100755 Heap/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata mode change 100644 => 100755 Heap/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme diff --git a/Heap/Heap.swift b/Heap/Heap.swift old mode 100644 new mode 100755 index b0355da5d..a33fc0b94 --- a/Heap/Heap.swift +++ b/Heap/Heap.swift @@ -4,58 +4,55 @@ // public struct Heap { + /** The array that stores the heap's nodes. */ - var elements = [T]() + private(set) var nodes = [T]() - /** Determines whether this is a max-heap (>) or min-heap (<). */ - fileprivate var isOrderedBefore: (T, T) -> Bool + /** + * Determines how to compare two nodes in the heap. + * Use '>' for a max-heap or '<' for a min-heap, + * or provide a comparing method if the heap is made + * of custom elements, for example tuples. + */ + private var orderCriteria: (T, T) -> Bool /** * Creates an empty heap. * The sort function determines whether this is a min-heap or max-heap. - * For integers, > makes a max-heap, < makes a min-heap. + * For comparable data types, > makes a max-heap, < makes a min-heap. */ public init(sort: @escaping (T, T) -> Bool) { - self.isOrderedBefore = sort + self.orderCriteria = sort } /** * Creates a heap from an array. The order of the array does not matter; * the elements are inserted into the heap in the order determined by the - * sort function. + * sort function. For comparable data types, '>' makes a max-heap, + * '<' makes a min-heap. */ public init(array: [T], sort: @escaping (T, T) -> Bool) { - self.isOrderedBefore = sort + self.orderCriteria = sort buildHeap(fromArray: array) } - /* - // This version has O(n log n) performance. - private mutating func buildHeap(array: [T]) { - elements.reserveCapacity(array.count) - for value in array { - insert(value) - } - } - */ - /** - * Converts an array to a max-heap or min-heap in a bottom-up manner. + * Creates the max-heap or min-heap from an array, in a bottom-up manner. * Performance: This runs pretty much in O(n). */ - fileprivate mutating func buildHeap(fromArray array: [T]) { - elements = array - for i in stride(from: (elements.count/2 - 1), through: 0, by: -1) { - shiftDown(i, heapSize: elements.count) + private mutating func buildHeap(fromArray array: [T]) { + nodes = array + for i in stride(from: (nodes.count/2-1), through: 0, by: -1) { + shiftDown(i) } } public var isEmpty: Bool { - return elements.isEmpty + return nodes.isEmpty } public var count: Int { - return elements.count + return nodes.count } /** @@ -89,7 +86,13 @@ public struct Heap { * value (for a min-heap). */ public func peek() -> T? { - return elements.first + return nodes.first + } + + /** Returns the node at given index */ + public func node(at i: Int) -> T? { + guard i < nodes.count else { return nil } + return nodes[i] } /** @@ -97,10 +100,14 @@ public struct Heap { * or min-heap property still holds. Performance: O(log n). */ public mutating func insert(_ value: T) { - elements.append(value) - shiftUp(elements.count - 1) + nodes.append(value) + shiftUp(nodes.count - 1) } + /** + * Adds a sequence of values to the heap. This reorders the heap so that + * the max-heap or min-heap property still holds. Performance: O(log n). + */ public mutating func insert(_ sequence: S) where S.Iterator.Element == T { for value in sequence { insert(value) @@ -108,15 +115,14 @@ public struct Heap { } /** - * Allows you to change an element. In a max-heap, the new element should be - * larger than the old one; in a min-heap it should be smaller. + * Allows you to change an element. This reorders the heap so that + * the max-heap or min-heap property still holds. */ public mutating func replace(index i: Int, value: T) { - guard i < elements.count else { return } + guard i < nodes.count else { return } - assert(isOrderedBefore(value, elements[i])) - elements[i] = value - shiftUp(i) + removeAt(i) + insert(value) } /** @@ -124,34 +130,35 @@ public struct Heap { * value; for a min-heap it is the minimum value. Performance: O(log n). */ @discardableResult public mutating func remove() -> T? { - if elements.isEmpty { - return nil - } else if elements.count == 1 { - return elements.removeLast() - } else { - // Use the last node to replace the first one, then fix the heap by - // shifting this new first node into its proper position. - let value = elements[0] - elements[0] = elements.removeLast() - shiftDown() - return value + if !nodes.isEmpty { + if nodes.count == 1 { + return nodes.removeLast() + } else { + // Use the last node to replace the first one, then fix the heap by + // shifting this new first node into its proper position. + let value = nodes[0] + nodes[0] = nodes.removeLast() + shiftDown(0) + return value + } } + return nil } /** - * Removes an arbitrary node from the heap. Performance: O(log n). You need - * to know the node's index, which may actually take O(n) steps to find. + * Removes an arbitrary node from the heap. Performance: O(log n). + * Note that you need to know the node's index. */ - public mutating func removeAt(_ index: Int) -> T? { - guard index < elements.count else { return nil } + @discardableResult public mutating func removeAt(_ index: Int) -> T? { + guard index < nodes.count else { return nil } - let size = elements.count - 1 + let size = nodes.count - 1 if index != size { - elements.swapAt(index, size) - shiftDown(index, heapSize: size) + nodes.swapAt(index, size) + shiftDown(from: index, until: size) shiftUp(index) } - return elements.removeLast() + return nodes.removeLast() } /** @@ -160,68 +167,64 @@ public struct Heap { */ mutating func shiftUp(_ index: Int) { var childIndex = index - let child = elements[childIndex] + let child = nodes[childIndex] var parentIndex = self.parentIndex(ofIndex: childIndex) - while childIndex > 0 && isOrderedBefore(child, elements[parentIndex]) { - elements[childIndex] = elements[parentIndex] + while childIndex > 0 && orderCriteria(child, nodes[parentIndex]) { + nodes[childIndex] = nodes[parentIndex] childIndex = parentIndex parentIndex = self.parentIndex(ofIndex: childIndex) } - elements[childIndex] = child - } - - mutating func shiftDown() { - shiftDown(0, heapSize: elements.count) + nodes[childIndex] = child } /** * Looks at a parent node and makes sure it is still larger (max-heap) or * smaller (min-heap) than its childeren. */ - mutating func shiftDown(_ index: Int, heapSize: Int) { - var parentIndex = index + private mutating func shiftDown(from index: Int, until endIndex: Int) { + let leftChildIndex = self.leftChildIndex(ofIndex: index) + let rightChildIndex = leftChildIndex + 1 - while true { - let leftChildIndex = self.leftChildIndex(ofIndex: parentIndex) - let rightChildIndex = leftChildIndex + 1 - - // Figure out which comes first if we order them by the sort function: - // the parent, the left child, or the right child. If the parent comes - // first, we're done. If not, that element is out-of-place and we make - // it "float down" the tree until the heap property is restored. - var first = parentIndex - if leftChildIndex < heapSize && isOrderedBefore(elements[leftChildIndex], elements[first]) { - first = leftChildIndex - } - if rightChildIndex < heapSize && isOrderedBefore(elements[rightChildIndex], elements[first]) { - first = rightChildIndex - } - if first == parentIndex { return } - - elements.swapAt(parentIndex, first) - parentIndex = first + // Figure out which comes first if we order them by the sort function: + // the parent, the left child, or the right child. If the parent comes + // first, we're done. If not, that element is out-of-place and we make + // it "float down" the tree until the heap property is restored. + var first = index + if leftChildIndex < endIndex && orderCriteria(nodes[leftChildIndex], nodes[first]) { + first = leftChildIndex + } + if rightChildIndex < endIndex && orderCriteria(nodes[rightChildIndex], nodes[first]) { + first = rightChildIndex } + if first == index { return } + + nodes.swapAt(index, first) + shiftDown(from: first, until: endIndex) + } + + private mutating func shiftDown(_ index: Int) { + shiftDown(from: index, until: nodes.count) } + } // MARK: - Searching extension Heap where T: Equatable { - /** - * Searches the heap for the given element. Performance: O(n). - */ - public func index(of element: T) -> Int? { - return index(of: element, 0) + + /** Get the index of a node in the heap. Performance: O(n). */ + public func index(of node: T) -> Int? { + return nodes.index(where: { $0 == node }) } - fileprivate func index(of element: T, _ i: Int) -> Int? { - if i >= count { return nil } - if isOrderedBefore(element, elements[i]) { return nil } - if element == elements[i] { return i } - if let j = index(of: element, self.leftChildIndex(ofIndex: i)) { return j } - if let j = index(of: element, self.rightChildIndex(ofIndex: i)) { return j } + /** Removes the first occurrence of a node from the heap. Performance: O(n log n). */ + @discardableResult public mutating func remove(node: T) -> T? { + if let index = index(of: node) { + return removeAt(index) + } return nil } + } diff --git a/Heap/README.markdown b/Heap/README.markdown old mode 100644 new mode 100755 index 4344d9e7c..76d2bee39 --- a/Heap/README.markdown +++ b/Heap/README.markdown @@ -38,7 +38,7 @@ A heap is not a replacement for a binary search tree, and there are similarities **Balancing.** A binary search tree must be "balanced" so that most operations have **O(log n)** performance. You can either insert and delete your data in a random order or use something like an [AVL tree](../AVL%20Tree/) or [red-black tree](../Red-Black%20Tree/), but with heaps we don't actually need the entire tree to be sorted. We just want the heap property to be fulfilled, so balancing isn't an issue. Because of the way the heap is structured, heaps can guarantee **O(log n)** performance. -**Searching.** Whereas searching is fast in a binary tree, it is slow in a heap. Searching isn't a top priority in a heap since the purpose of a heap is to put the largest (or smallest) node at the front and to allow relatively fast inserts and deletes. +**Searching.** Whereas searching is fast in a binary tree, it is slow in a heap. Searching isn't a top priority in a heap since the purpose of a heap is to put the largest (or smallest) node at the front and to allow relatively fast inserts and deletes. ## The tree inside an array @@ -148,7 +148,7 @@ There are two primitive operations necessary to make sure the heap is a valid ma Shifting up or down is a recursive procedure that takes **O(log n)** time. -Here are other operations that are built on primitive operations: +Here are other operations that are built on primitive operations: - `insert(value)`: Adds the new element to the end of the heap and then uses `shiftUp()` to fix the heap. @@ -190,7 +190,7 @@ The `(16)` was added to the first available space on the last row. Unfortunately, the heap property is no longer satisfied because `(2)` is above `(16)`, and we want higher numbers above lower numbers. (This is a max-heap.) -To restore the heap property, we swap `(16)` and `(2)`. +To restore the heap property, we swap `(16)` and `(2)`. ![The heap before insertion](Images/Insert2.png) @@ -214,7 +214,7 @@ What happens to the empty spot at the top? ![The root is gone](Images/Remove1.png) -When inserting, we put the new value at the end of the array. Here, we do the opposite: we take the last object we have, stick it up on top of the tree, and restore the heap property. +When inserting, we put the new value at the end of the array. Here, we do the opposite: we take the last object we have, stick it up on top of the tree, and restore the heap property. ![The last node goes to the root](Images/Remove2.png) @@ -226,7 +226,7 @@ Keep shifting down until the node does not have any children or it is larger tha ![The last node goes to the root](Images/Remove4.png) -The time required for shifting all the way down is proportional to the height of the tree which takes **O(log n)** time. +The time required for shifting all the way down is proportional to the height of the tree which takes **O(log n)** time. > **Note:** `shiftUp()` and `shiftDown()` can only fix one out-of-place element at a time. If there are multiple elements in the wrong place, you need to call these functions once for each of those elements. @@ -279,7 +279,7 @@ In code: ```swift private mutating func buildHeap(fromArray array: [T]) { elements = array - for i in (elements.count/2 - 1).stride(through: 0, by: -1) { + for i in stride(from: (nodes.count/2-1), through: 0, by: -1) { shiftDown(index: i, heapSize: elements.count) } } diff --git a/Heap/Tests/HeapTests.swift b/Heap/Tests/HeapTests.swift old mode 100644 new mode 100755 index 66be0931c..36035fe93 --- a/Heap/Tests/HeapTests.swift +++ b/Heap/Tests/HeapTests.swift @@ -19,9 +19,9 @@ class HeapTests: XCTestCase { let left = h.leftChildIndex(ofIndex: i) let right = h.rightChildIndex(ofIndex: i) let parent = h.parentIndex(ofIndex: i) - if left < h.count && h.elements[i] < h.elements[left] { return false } - if right < h.count && h.elements[i] < h.elements[right] { return false } - if i > 0 && h.elements[parent] < h.elements[i] { return false } + if left < h.count && h.nodes[i] < h.nodes[left] { return false } + if right < h.count && h.nodes[i] < h.nodes[right] { return false } + if i > 0 && h.nodes[parent] < h.nodes[i] { return false } } return true } @@ -31,9 +31,9 @@ class HeapTests: XCTestCase { let left = h.leftChildIndex(ofIndex: i) let right = h.rightChildIndex(ofIndex: i) let parent = h.parentIndex(ofIndex: i) - if left < h.count && h.elements[i] > h.elements[left] { return false } - if right < h.count && h.elements[i] > h.elements[right] { return false } - if i > 0 && h.elements[parent] > h.elements[i] { return false } + if left < h.count && h.nodes[i] > h.nodes[left] { return false } + if right < h.count && h.nodes[i] > h.nodes[right] { return false } + if i > 0 && h.nodes[parent] > h.nodes[i] { return false } } return true } @@ -90,7 +90,7 @@ class HeapTests: XCTestCase { let h1 = Heap(array: [1, 2, 3, 4, 5, 6, 7], sort: >) XCTAssertTrue(verifyMaxHeap(h1)) XCTAssertFalse(verifyMinHeap(h1)) - XCTAssertEqual(h1.elements, [7, 5, 6, 4, 2, 1, 3]) + XCTAssertEqual(h1.nodes, [7, 5, 6, 4, 2, 1, 3]) XCTAssertFalse(h1.isEmpty) XCTAssertEqual(h1.count, 7) XCTAssertEqual(h1.peek()!, 7) @@ -98,7 +98,7 @@ class HeapTests: XCTestCase { let h2 = Heap(array: [7, 6, 5, 4, 3, 2, 1], sort: >) XCTAssertTrue(verifyMaxHeap(h2)) XCTAssertFalse(verifyMinHeap(h2)) - XCTAssertEqual(h2.elements, [7, 6, 5, 4, 3, 2, 1]) + XCTAssertEqual(h2.nodes, [7, 6, 5, 4, 3, 2, 1]) XCTAssertFalse(h2.isEmpty) XCTAssertEqual(h2.count, 7) XCTAssertEqual(h2.peek()!, 7) @@ -106,7 +106,7 @@ class HeapTests: XCTestCase { let h3 = Heap(array: [4, 1, 3, 2, 16, 9, 10, 14, 8, 7], sort: >) XCTAssertTrue(verifyMaxHeap(h3)) XCTAssertFalse(verifyMinHeap(h3)) - XCTAssertEqual(h3.elements, [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]) + XCTAssertEqual(h3.nodes, [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]) XCTAssertFalse(h3.isEmpty) XCTAssertEqual(h3.count, 10) XCTAssertEqual(h3.peek()!, 16) @@ -114,7 +114,7 @@ class HeapTests: XCTestCase { let h4 = Heap(array: [27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0], sort: >) XCTAssertTrue(verifyMaxHeap(h4)) XCTAssertFalse(verifyMinHeap(h4)) - XCTAssertEqual(h4.elements, [27, 17, 10, 16, 13, 9, 1, 5, 7, 12, 4, 8, 3, 0]) + XCTAssertEqual(h4.nodes, [27, 17, 10, 16, 13, 9, 1, 5, 7, 12, 4, 8, 3, 0]) XCTAssertFalse(h4.isEmpty) XCTAssertEqual(h4.count, 14) XCTAssertEqual(h4.peek()!, 27) @@ -124,7 +124,7 @@ class HeapTests: XCTestCase { let h1 = Heap(array: [1, 2, 3, 4, 5, 6, 7], sort: <) XCTAssertTrue(verifyMinHeap(h1)) XCTAssertFalse(verifyMaxHeap(h1)) - XCTAssertEqual(h1.elements, [1, 2, 3, 4, 5, 6, 7]) + XCTAssertEqual(h1.nodes, [1, 2, 3, 4, 5, 6, 7]) XCTAssertFalse(h1.isEmpty) XCTAssertEqual(h1.count, 7) XCTAssertEqual(h1.peek()!, 1) @@ -132,7 +132,7 @@ class HeapTests: XCTestCase { let h2 = Heap(array: [7, 6, 5, 4, 3, 2, 1], sort: <) XCTAssertTrue(verifyMinHeap(h2)) XCTAssertFalse(verifyMaxHeap(h2)) - XCTAssertEqual(h2.elements, [1, 3, 2, 4, 6, 7, 5]) + XCTAssertEqual(h2.nodes, [1, 3, 2, 4, 6, 7, 5]) XCTAssertFalse(h2.isEmpty) XCTAssertEqual(h2.count, 7) XCTAssertEqual(h2.peek()!, 1) @@ -140,7 +140,7 @@ class HeapTests: XCTestCase { let h3 = Heap(array: [4, 1, 3, 2, 16, 9, 10, 14, 8, 7], sort: <) XCTAssertTrue(verifyMinHeap(h3)) XCTAssertFalse(verifyMaxHeap(h3)) - XCTAssertEqual(h3.elements, [1, 2, 3, 4, 7, 9, 10, 14, 8, 16]) + XCTAssertEqual(h3.nodes, [1, 2, 3, 4, 7, 9, 10, 14, 8, 16]) XCTAssertFalse(h3.isEmpty) XCTAssertEqual(h3.count, 10) XCTAssertEqual(h3.peek()!, 1) @@ -148,7 +148,7 @@ class HeapTests: XCTestCase { let h4 = Heap(array: [27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0], sort: <) XCTAssertTrue(verifyMinHeap(h4)) XCTAssertFalse(verifyMaxHeap(h4)) - XCTAssertEqual(h4.elements, [0, 4, 1, 5, 12, 8, 3, 16, 7, 17, 13, 10, 9, 27]) + XCTAssertEqual(h4.nodes, [0, 4, 1, 5, 12, 8, 3, 16, 7, 17, 13, 10, 9, 27]) XCTAssertFalse(h4.isEmpty) XCTAssertEqual(h4.count, 14) XCTAssertEqual(h4.peek()!, 0) @@ -158,14 +158,14 @@ class HeapTests: XCTestCase { let heap = Heap(array: [1, 1, 1, 1, 1], sort: >) XCTAssertTrue(verifyMaxHeap(heap)) XCTAssertTrue(verifyMinHeap(heap)) - XCTAssertEqual(heap.elements, [1, 1, 1, 1, 1]) + XCTAssertEqual(heap.nodes, [1, 1, 1, 1, 1]) } func testCreateMinHeapEqualElements() { let heap = Heap(array: [1, 1, 1, 1, 1], sort: <) XCTAssertTrue(verifyMinHeap(heap)) XCTAssertTrue(verifyMaxHeap(heap)) - XCTAssertEqual(heap.elements, [1, 1, 1, 1, 1]) + XCTAssertEqual(heap.nodes, [1, 1, 1, 1, 1]) } fileprivate func randomArray(_ n: Int) -> [Int] { @@ -183,7 +183,7 @@ class HeapTests: XCTestCase { XCTAssertTrue(verifyMaxHeap(h)) XCTAssertFalse(h.isEmpty) XCTAssertEqual(h.count, n) - XCTAssertTrue(isPermutation(a, h.elements)) + XCTAssertTrue(isPermutation(a, h.nodes)) } } @@ -194,58 +194,58 @@ class HeapTests: XCTestCase { XCTAssertTrue(verifyMinHeap(h)) XCTAssertFalse(h.isEmpty) XCTAssertEqual(h.count, n) - XCTAssertTrue(isPermutation(a, h.elements)) + XCTAssertTrue(isPermutation(a, h.nodes)) } } - func testRemoving() { + func testRemovingAtIndex() { var h = Heap(array: [100, 50, 70, 10, 20, 60, 65], sort: >) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [100, 50, 70, 10, 20, 60, 65]) + XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 60, 65]) //test index out of bounds let v = h.removeAt(10) XCTAssertEqual(v, nil) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [100, 50, 70, 10, 20, 60, 65]) + XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 60, 65]) let v1 = h.removeAt(5) XCTAssertEqual(v1, 60) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [100, 50, 70, 10, 20, 65]) + XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 65]) let v2 = h.removeAt(4) XCTAssertEqual(v2, 20) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [100, 65, 70, 10, 50]) + XCTAssertEqual(h.nodes, [100, 65, 70, 10, 50]) let v3 = h.removeAt(4) XCTAssertEqual(v3, 50) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [100, 65, 70, 10]) + XCTAssertEqual(h.nodes, [100, 65, 70, 10]) let v4 = h.removeAt(0) XCTAssertEqual(v4, 100) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [70, 65, 10]) + XCTAssertEqual(h.nodes, [70, 65, 10]) XCTAssertEqual(h.peek()!, 70) let v5 = h.remove() XCTAssertEqual(v5, 70) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [65, 10]) + XCTAssertEqual(h.nodes, [65, 10]) XCTAssertEqual(h.peek()!, 65) let v6 = h.remove() XCTAssertEqual(v6, 65) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [10]) + XCTAssertEqual(h.nodes, [10]) XCTAssertEqual(h.peek()!, 10) let v7 = h.remove() XCTAssertEqual(v7, 10) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, []) + XCTAssertEqual(h.nodes, []) XCTAssertNil(h.peek()) } @@ -259,12 +259,23 @@ class HeapTests: XCTestCase { func testRemoveRoot() { var h = Heap(array: [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1], sort: >) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1]) + XCTAssertEqual(h.nodes, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1]) XCTAssertEqual(h.peek()!, 15) let v = h.remove() XCTAssertEqual(v, 15) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [13, 12, 9, 5, 6, 8, 7, 4, 0, 1, 2]) + XCTAssertEqual(h.nodes, [13, 12, 9, 5, 6, 8, 7, 4, 0, 1, 2]) + } + + func testRemoveNode() { + var h = Heap(array: [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1], sort: >) + XCTAssertTrue(verifyMaxHeap(h)) + XCTAssertEqual(h.nodes, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1]) + XCTAssertEqual(h.node(at: 3)!, 5) + let v = h.remove(node: 5) + XCTAssertEqual(v, 5) + XCTAssertTrue(verifyMaxHeap(h)) + XCTAssertFalse(h.nodes.contains(5)) } func testRemoveRandomItems() { @@ -272,19 +283,27 @@ class HeapTests: XCTestCase { var a = randomArray(n) var h = Heap(array: a, sort: >) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertTrue(isPermutation(a, h.elements)) + XCTAssertTrue(isPermutation(a, h.nodes)) let m = (n + 1)/2 for k in 1...m { let i = Int(arc4random_uniform(UInt32(n - k + 1))) - let v = h.removeAt(i)! - let j = a.index(of: v)! + + var v: Int? = nil + if k == 2 || k == m { + v = h.remove(node: h.node(at: i)!) + } else { + v = h.removeAt(i) + } + XCTAssertNotNil(v) + + let j = a.index(of: v!)! a.remove(at: j) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.count, a.count) XCTAssertEqual(h.count, n - k) - XCTAssertTrue(isPermutation(a, h.elements)) + XCTAssertTrue(isPermutation(a, h.nodes)) } } } @@ -292,17 +311,17 @@ class HeapTests: XCTestCase { func testInsert() { var h = Heap(array: [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1], sort: >) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1]) + XCTAssertEqual(h.nodes, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1]) h.insert(10) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [15, 13, 10, 5, 12, 9, 7, 4, 0, 6, 2, 1, 8]) + XCTAssertEqual(h.nodes, [15, 13, 10, 5, 12, 9, 7, 4, 0, 6, 2, 1, 8]) } func testInsertArrayAndRemove() { var heap = Heap(sort: >) heap.insert([1, 3, 2, 7, 5, 9]) - XCTAssertEqual(heap.elements, [9, 5, 7, 1, 3, 2]) + XCTAssertEqual(heap.nodes, [9, 5, 7, 1, 3, 2]) XCTAssertEqual(9, heap.remove()) XCTAssertEqual(7, heap.remove()) @@ -316,15 +335,13 @@ class HeapTests: XCTestCase { func testReplace() { var h = Heap(array: [16, 14, 10, 8, 7, 9, 3, 2, 4, 1], sort: >) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [16, 14, 10, 8, 7, 9, 3, 2, 4, 1]) h.replace(index: 5, value: 13) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [16, 14, 13, 8, 7, 10, 3, 2, 4, 1]) //test index out of bounds h.replace(index: 20, value: 2) XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.elements, [16, 14, 13, 8, 7, 10, 3, 2, 4, 1]) } + } diff --git a/Heap/Tests/Tests.xcodeproj/project.pbxproj b/Heap/Tests/Tests.xcodeproj/project.pbxproj old mode 100644 new mode 100755 index 617e29f27..51433ee64 --- a/Heap/Tests/Tests.xcodeproj/project.pbxproj +++ b/Heap/Tests/Tests.xcodeproj/project.pbxproj @@ -83,7 +83,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0920; ORGANIZATIONNAME = "Swift Algorithm Club"; TargetAttributes = { 7B2BBC7F1C779D720067B71D = { @@ -141,14 +141,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -187,14 +193,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; diff --git a/Heap/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Heap/Tests/Tests.xcodeproj/project.xcworkspace/contents.xcworkspacedata old mode 100644 new mode 100755 diff --git a/Heap/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme b/Heap/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme old mode 100644 new mode 100755 index 80ed35600..77d01bebc --- a/Heap/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme +++ b/Heap/Tests/Tests.xcodeproj/xcshareddata/xcschemes/Tests.xcscheme @@ -1,6 +1,6 @@ Date: Mon, 8 Jan 2018 10:47:59 +0100 Subject: [PATCH 09/39] - Adopted discussed improvements - Made nodes and some other methods internal, so that extensions like HeapSort can use them. This fixes the HeapSort algorithm as well as the tests for both. --- Heap Sort/HeapSort.swift | 8 +++--- Heap/Heap.swift | 55 +++++++++++++++++--------------------- Heap/Tests/HeapTests.swift | 39 +++++++-------------------- 3 files changed, 38 insertions(+), 64 deletions(-) diff --git a/Heap Sort/HeapSort.swift b/Heap Sort/HeapSort.swift index 6b5e91dc5..0354817a6 100644 --- a/Heap Sort/HeapSort.swift +++ b/Heap Sort/HeapSort.swift @@ -1,10 +1,10 @@ extension Heap { public mutating func sort() -> [T] { - for i in stride(from: (elements.count - 1), through: 1, by: -1) { - elements.swapAt(0, i) - shiftDown(0, heapSize: i) + for i in stride(from: (nodes.count - 1), through: 1, by: -1) { + nodes.swapAt(0, i) + shiftDown(from: 0, until: i) } - return elements + return nodes } } diff --git a/Heap/Heap.swift b/Heap/Heap.swift index a33fc0b94..ae392d448 100755 --- a/Heap/Heap.swift +++ b/Heap/Heap.swift @@ -6,7 +6,7 @@ public struct Heap { /** The array that stores the heap's nodes. */ - private(set) var nodes = [T]() + internal var nodes = [T]() /** * Determines how to compare two nodes in the heap. @@ -33,14 +33,14 @@ public struct Heap { */ public init(array: [T], sort: @escaping (T, T) -> Bool) { self.orderCriteria = sort - buildHeap(fromArray: array) + configureHeap(from: array) } /** - * Creates the max-heap or min-heap from an array, in a bottom-up manner. + * Configures the max-heap or min-heap from an array, in a bottom-up manner. * Performance: This runs pretty much in O(n). */ - private mutating func buildHeap(fromArray array: [T]) { + private mutating func configureHeap(from array: [T]) { nodes = array for i in stride(from: (nodes.count/2-1), through: 0, by: -1) { shiftDown(i) @@ -59,7 +59,7 @@ public struct Heap { * Returns the index of the parent of the element at index i. * The element at index 0 is the root of the tree and has no parent. */ - @inline(__always) func parentIndex(ofIndex i: Int) -> Int { + @inline(__always) internal func parentIndex(ofIndex i: Int) -> Int { return (i - 1) / 2 } @@ -68,7 +68,7 @@ public struct Heap { * Note that this index can be greater than the heap size, in which case * there is no left child. */ - @inline(__always) func leftChildIndex(ofIndex i: Int) -> Int { + @inline(__always) internal func leftChildIndex(ofIndex i: Int) -> Int { return 2*i + 1 } @@ -77,7 +77,7 @@ public struct Heap { * Note that this index can be greater than the heap size, in which case * there is no right child. */ - @inline(__always) func rightChildIndex(ofIndex i: Int) -> Int { + @inline(__always) internal func rightChildIndex(ofIndex i: Int) -> Int { return 2*i + 2 } @@ -89,12 +89,6 @@ public struct Heap { return nodes.first } - /** Returns the node at given index */ - public func node(at i: Int) -> T? { - guard i < nodes.count else { return nil } - return nodes[i] - } - /** * Adds a new value to the heap. This reorders the heap so that the max-heap * or min-heap property still holds. Performance: O(log n). @@ -121,7 +115,7 @@ public struct Heap { public mutating func replace(index i: Int, value: T) { guard i < nodes.count else { return } - removeAt(i) + remove(at: i) insert(value) } @@ -130,26 +124,25 @@ public struct Heap { * value; for a min-heap it is the minimum value. Performance: O(log n). */ @discardableResult public mutating func remove() -> T? { - if !nodes.isEmpty { - if nodes.count == 1 { - return nodes.removeLast() - } else { - // Use the last node to replace the first one, then fix the heap by - // shifting this new first node into its proper position. - let value = nodes[0] - nodes[0] = nodes.removeLast() - shiftDown(0) - return value - } + guard !nodes.isEmpty else { return nil } + + if nodes.count == 1 { + return nodes.removeLast() + } else { + // Use the last node to replace the first one, then fix the heap by + // shifting this new first node into its proper position. + let value = nodes[0] + nodes[0] = nodes.removeLast() + shiftDown(0) + return value } - return nil } /** * Removes an arbitrary node from the heap. Performance: O(log n). * Note that you need to know the node's index. */ - @discardableResult public mutating func removeAt(_ index: Int) -> T? { + @discardableResult public mutating func remove(at index: Int) -> T? { guard index < nodes.count else { return nil } let size = nodes.count - 1 @@ -165,7 +158,7 @@ public struct Heap { * Takes a child node and looks at its parents; if a parent is not larger * (max-heap) or not smaller (min-heap) than the child, we exchange them. */ - mutating func shiftUp(_ index: Int) { + internal mutating func shiftUp(_ index: Int) { var childIndex = index let child = nodes[childIndex] var parentIndex = self.parentIndex(ofIndex: childIndex) @@ -183,7 +176,7 @@ public struct Heap { * Looks at a parent node and makes sure it is still larger (max-heap) or * smaller (min-heap) than its childeren. */ - private mutating func shiftDown(from index: Int, until endIndex: Int) { + internal mutating func shiftDown(from index: Int, until endIndex: Int) { let leftChildIndex = self.leftChildIndex(ofIndex: index) let rightChildIndex = leftChildIndex + 1 @@ -204,7 +197,7 @@ public struct Heap { shiftDown(from: first, until: endIndex) } - private mutating func shiftDown(_ index: Int) { + internal mutating func shiftDown(_ index: Int) { shiftDown(from: index, until: nodes.count) } @@ -222,7 +215,7 @@ extension Heap where T: Equatable { /** Removes the first occurrence of a node from the heap. Performance: O(n log n). */ @discardableResult public mutating func remove(node: T) -> T? { if let index = index(of: node) { - return removeAt(index) + return remove(at: index) } return nil } diff --git a/Heap/Tests/HeapTests.swift b/Heap/Tests/HeapTests.swift index 36035fe93..1ed15c726 100755 --- a/Heap/Tests/HeapTests.swift +++ b/Heap/Tests/HeapTests.swift @@ -154,14 +154,14 @@ class HeapTests: XCTestCase { XCTAssertEqual(h4.peek()!, 0) } - func testCreateMaxHeapEqualElements() { + func testCreateMaxHeapEqualnodes() { let heap = Heap(array: [1, 1, 1, 1, 1], sort: >) XCTAssertTrue(verifyMaxHeap(heap)) XCTAssertTrue(verifyMinHeap(heap)) XCTAssertEqual(heap.nodes, [1, 1, 1, 1, 1]) } - func testCreateMinHeapEqualElements() { + func testCreateMinHeapEqualnodes() { let heap = Heap(array: [1, 1, 1, 1, 1], sort: <) XCTAssertTrue(verifyMinHeap(heap)) XCTAssertTrue(verifyMaxHeap(heap)) @@ -198,33 +198,33 @@ class HeapTests: XCTestCase { } } - func testRemovingAtIndex() { + func testRemoving() { var h = Heap(array: [100, 50, 70, 10, 20, 60, 65], sort: >) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 60, 65]) //test index out of bounds - let v = h.removeAt(10) + let v = h.remove(at: 10) XCTAssertEqual(v, nil) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 60, 65]) - let v1 = h.removeAt(5) + let v1 = h.remove(at: 5) XCTAssertEqual(v1, 60) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.nodes, [100, 50, 70, 10, 20, 65]) - let v2 = h.removeAt(4) + let v2 = h.remove(at: 4) XCTAssertEqual(v2, 20) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.nodes, [100, 65, 70, 10, 50]) - let v3 = h.removeAt(4) + let v3 = h.remove(at: 4) XCTAssertEqual(v3, 50) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.nodes, [100, 65, 70, 10]) - let v4 = h.removeAt(0) + let v4 = h.remove(at: 0) XCTAssertEqual(v4, 100) XCTAssertTrue(verifyMaxHeap(h)) XCTAssertEqual(h.nodes, [70, 65, 10]) @@ -267,17 +267,6 @@ class HeapTests: XCTestCase { XCTAssertEqual(h.nodes, [13, 12, 9, 5, 6, 8, 7, 4, 0, 1, 2]) } - func testRemoveNode() { - var h = Heap(array: [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1], sort: >) - XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertEqual(h.nodes, [15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1]) - XCTAssertEqual(h.node(at: 3)!, 5) - let v = h.remove(node: 5) - XCTAssertEqual(v, 5) - XCTAssertTrue(verifyMaxHeap(h)) - XCTAssertFalse(h.nodes.contains(5)) - } - func testRemoveRandomItems() { for n in 1...40 { var a = randomArray(n) @@ -288,16 +277,8 @@ class HeapTests: XCTestCase { let m = (n + 1)/2 for k in 1...m { let i = Int(arc4random_uniform(UInt32(n - k + 1))) - - var v: Int? = nil - if k == 2 || k == m { - v = h.remove(node: h.node(at: i)!) - } else { - v = h.removeAt(i) - } - XCTAssertNotNil(v) - - let j = a.index(of: v!)! + let v = h.remove(at: i)! + let j = a.index(of: v)! a.remove(at: j) XCTAssertTrue(verifyMaxHeap(h)) From 39b7311ec6fe68af0fb83b6322d7121a6d9c8f62 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Mon, 8 Jan 2018 17:47:10 -0800 Subject: [PATCH 10/39] Removes redundant `internal` modifier. --- Heap/Heap.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Heap/Heap.swift b/Heap/Heap.swift index ae392d448..cf39fb8a5 100755 --- a/Heap/Heap.swift +++ b/Heap/Heap.swift @@ -6,7 +6,7 @@ public struct Heap { /** The array that stores the heap's nodes. */ - internal var nodes = [T]() + var nodes = [T]() /** * Determines how to compare two nodes in the heap. From adf606599050c8eaf4b63a0c8e18a5b52a4892b7 Mon Sep 17 00:00:00 2001 From: ck Date: Wed, 19 Jul 2017 15:47:40 -0700 Subject: [PATCH 11/39] Encode and Decode A Binary Tree Encode and Decode A Binary Tree --- .../Contents.swift | 49 +++++++++ .../Sources/EncodeAndDecodeTree.swift | 104 ++++++++++++++++++ .../contents.xcplayground | 4 + .../EncodeAndDecodeTree.swift | 104 ++++++++++++++++++ Encode and Decode Tree/readme.md | 27 +++++ .../contents.xcworkspacedata | 10 ++ 6 files changed, 298 insertions(+) create mode 100644 Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift create mode 100644 Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift create mode 100644 Encode and Decode Tree/EncodeAndDecodeTree.playground/contents.xcplayground create mode 100644 Encode and Decode Tree/EncodeAndDecodeTree.swift create mode 100644 Encode and Decode Tree/readme.md diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift new file mode 100644 index 000000000..dbd2fd180 --- /dev/null +++ b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift @@ -0,0 +1,49 @@ +//: Playground - noun: a place where people can play + + +func printTree(_ root: TreeNode?) { + guard let root = root else { + return + } + + var pointer = root + + let leftVal = root.left == nil ? "nil" : root.left!.val + let rightVal = root.right == nil ? "nil" : root.right!.val + + print("val: \(root.val) left: \(leftVal) right: \(rightVal)") + + printTree(root.left) + printTree(root.right) +} + +let s = EncodeAndDecodeTree() + +let node1 = TreeNode("a") +let node2 = TreeNode("b") +let node3 = TreeNode("c") +let node4 = TreeNode("d") +let node5 = TreeNode("e") + +node1.left = node2 +node1.right = node3 +node3.left = node4 +node3.right = node5 + +let encodeStr = s.encode(node1) +print(encodeStr) +// "a b # # c d # # e # #" + + +let root = s.decode(encodeStr) +print("Tree:") +printTree(root) +/* + Tree: + val: a left: b right: c + val: b left: nil right: nil + val: c left: d right: e + val: d left: nil right: nil + val: e left: nil right: nil + */ + diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift new file mode 100644 index 000000000..e9d22f8a9 --- /dev/null +++ b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift @@ -0,0 +1,104 @@ +// +// EncodeAndDecodeTree.swift +// +// +// Created by Kai Chen on 19/07/2017. +// +// + +import Foundation + +public class TreeNode { + public var val: String + public var left: TreeNode? + public var right: TreeNode? + + public init(_ val: String, left: TreeNode? = nil, right: TreeNode? = nil) { + self.val = val + self.left = left + self.right = right + } +} + +public class EncodeAndDecodeTree { + private var encodeStr = "" + private var ret: [String] = [] + + public init() {} + + public func encode(_ root: TreeNode?) -> String { + encodeIt(root) + + return encodeStr + } + + public func decode(_ data: String) -> TreeNode? { + var s = data + while (s.contains(" ")) { + let index = s.index(of: " ") + let endIndex = s.index(before: index) + let element = s[s.startIndex...endIndex] + ret.append(element) + let range = ClosedRange(uncheckedBounds: (lower: s.startIndex, upper: index)) + s.removeSubrange(range) + } + + if ret.count == 0 { + return nil + } + + var dep = 0 + let root = decodeIt(&dep) + + return root + } + + private func getNode(_ element: String) -> TreeNode? { + if element == "#" { + return nil + } + + return TreeNode(element) + } + + private func decodeIt(_ dep: inout Int) -> TreeNode? { + guard let currentNode = getNode(ret[dep]) else { + return nil + } + + dep += 1 + let left = decodeIt(&dep) + dep += 1 + let right = decodeIt(&dep) + + currentNode.left = left + currentNode.right = right + + return currentNode + } + + private func encodeIt(_ root: TreeNode?) { + guard let root = root else { + encodeStr += "# " + return + } + + encodeStr += root.val + " " + encodeIt(root.left) + encodeIt(root.right) + } +} + +extension String { + func index(of target: Character) -> String.Index { + var i = 0 + for c in self.characters { + if c == target { + return self.index(self.startIndex, offsetBy: i) + } + i += 1 + } + + return self.endIndex + } +} diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.playground/contents.xcplayground b/Encode and Decode Tree/EncodeAndDecodeTree.playground/contents.xcplayground new file mode 100644 index 000000000..5da2641c9 --- /dev/null +++ b/Encode and Decode Tree/EncodeAndDecodeTree.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.swift b/Encode and Decode Tree/EncodeAndDecodeTree.swift new file mode 100644 index 000000000..daa3c3ea2 --- /dev/null +++ b/Encode and Decode Tree/EncodeAndDecodeTree.swift @@ -0,0 +1,104 @@ +// +// EncodeAndDecodeTree.swift +// +// +// Created by Kai Chen on 19/07/2017. +// +// + +import Foundation + +public class TreeNode { + public var val: String + public var left: TreeNode? + public var right: TreeNode? + + public init(_ val: String, left: TreeNode? = nil, right: TreeNode? = nil) { + self.val = val + self.left = left + self.right = right + } +} + +public class EncodeAndDecodeTree { + private var encodeStr = "" + private var ret: [String] = [] + + public init() {} + + public func encode(_ root: TreeNode?) -> String { + encodeIt(root) + + return encodeStr + } + + public func decode(_ data: String) -> TreeNode? { + var s = data + while (s.contains(" ")) { + let index = s.index(of: " ") + let endIndex = s.index(before: index) + let element = s[s.startIndex...endIndex] + ret.append(element) + let range = ClosedRange(uncheckedBounds: (lower: s.startIndex, upper: index)) + s.removeSubrange(range) + } + + if ret.count == 0 { + return nil + } + + var dep = 0 + let root = decodeIt(&dep) + + return root + } + + private func getNode(_ element: String) -> TreeNode? { + if element == "#" { + return nil + } + + return TreeNode(element) + } + + private func decodeIt(_ dep: inout Int) -> TreeNode? { + guard let currentNode = getNode(ret[dep]) else { + return nil + } + + dep += 1 + let left = decodeIt(&dep) + dep += 1 + let right = decodeIt(&dep) + + currentNode.left = left + currentNode.right = right + + return currentNode + } + + private func encodeIt(_ root: TreeNode?) { + guard let root = root else { + encodeStr += "# " + return + } + + encodeStr += root.val + " " + encodeIt(root.left) + encodeIt(root.right) + } +} + +extension String { + func index(of target: Character) -> String.Index { + var i = 0 + for c in self.characters { + if c == target { + return self.index(self.startIndex, offsetBy: i) + } + i += 1 + } + + return self.endIndex + } +} diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md new file mode 100644 index 000000000..c986d9147 --- /dev/null +++ b/Encode and Decode Tree/readme.md @@ -0,0 +1,27 @@ +# Encode and Decode Binary Tree + +We need to design an algorithm to encode and decode a binary tree. +* **Encode**: Convert a tree into a string that can be stored in the disk. +* **Decode**: Given the encoded string, you need to convert it into a Tree. + +For example, you may serialize the following tree + + +as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself. +Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless. + +## Solution +For example, given a tree like this +> a +> / \\ +> +> b c +> +> ​ / \\ +> ​ d e + +We can use inorder traversal to convert the tree into the string like this `a b # # c d # # e # #` + +So, the idea is for the empty node, we use `#` to represent. + +For the decode process, we can still use inorder to convert the string back to a tree. \ No newline at end of file diff --git a/swift-algorithm-club.xcworkspace/contents.xcworkspacedata b/swift-algorithm-club.xcworkspace/contents.xcworkspacedata index 4cab8e2d4..77f124fc3 100644 --- a/swift-algorithm-club.xcworkspace/contents.xcworkspacedata +++ b/swift-algorithm-club.xcworkspace/contents.xcworkspacedata @@ -117,6 +117,16 @@ location = "group:LRU Cache/Readme.md"> + + + + + + From f5c74b9aa9f34e7e57fc16059ee3076642abcdc9 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Thu, 16 Nov 2017 09:13:20 -0800 Subject: [PATCH 12/39] Refactor in progress --- Encode and Decode Tree/readme.md | 58 ++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index c986d9147..7f3e5538d 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -1,27 +1,49 @@ # Encode and Decode Binary Tree -We need to design an algorithm to encode and decode a binary tree. -* **Encode**: Convert a tree into a string that can be stored in the disk. -* **Decode**: Given the encoded string, you need to convert it into a Tree. +> **Note**: The prerequisite for this article is an understanding of how [binary trees](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Binary%20Tree) work. -For example, you may serialize the following tree +Trees are complex structures. Unlike linear collections such as arrays or linked lists, trees are *non-linear* and each element in a tree has positional information such as the *parent-child* relationship between nodes. When you want to send a tree structure to your backend, you need to send the data of each node, and a way to represent the parent-child relationship for each node. +Your strategy in how you choose to represent this information is called your **encoding** strategy. The opposite of that - changing your encoded data back to its original form - is your **decoding** strategy. -as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself. -Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless. +There are many ways to encode a tree and decode a tree. The important thing to keep in mind is that encoding and decoding strategies are closely related. The way you choose to encode a tree directly affects how you might decode a tree. -## Solution -For example, given a tree like this -> a -> / \\ -> -> b c -> -> ​ / \\ -> ​ d e +Encoding and decoding are synonyms to *serializing* and *deserializing* trees. -We can use inorder traversal to convert the tree into the string like this `a b # # c d # # e # #` +As a reference, the following code represents the typical `Node` type of a binary tree: -So, the idea is for the empty node, we use `#` to represent. +```swift +class BinaryNode { + var data: Element + var leftChild: BinaryNode? + var rightChild: BinaryNode? + + // ... (rest of the implementation) +} +``` + +## Encoding + +As mentioned before, there are different ways to do encoding. For no particular reason, you'll opt for the following rules: + +1. The result of the encoding will be a `String` object. +2. You'll encode using *pre-order* traversal. + +Here's an example of this operation in code: + +```swift +extension BinaryNode { + var encodedString: String { + var str = "" + preOrderTraversal { str.append($0) } + return str + } + + func preOrderTraversal(visit: (T) -> ()) { + visit(data) + leftChild?.preOrderTraversal(visit: visit) + rightChild?.preOrderTraversal(visit: visit) + } +} +``` -For the decode process, we can still use inorder to convert the string back to a tree. \ No newline at end of file From b772141951fe32729c6976d9a082b5c2f3eef203 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Thu, 16 Nov 2017 10:06:14 -0800 Subject: [PATCH 13/39] More progress --- Encode and Decode Tree/readme.md | 77 ++++++++++++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index 7f3e5538d..3b2281224 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -33,17 +33,86 @@ Here's an example of this operation in code: ```swift extension BinaryNode { + // 1 + private var splitter: String { return "," } + private var nilNode: String { return "nil" } + + // 2 var encodedString: String { var str = "" - preOrderTraversal { str.append($0) } + preOrderTraversal { data in + if let data = data { + let string = String(describing: data) + str.append(string) + } else { + str.append(nilNode) + } + str.append(splitter) + } return str } - func preOrderTraversal(visit: (T) -> ()) { + // 3 + func preOrderTraversal(visit: (T?) -> ()) { visit(data) - leftChild?.preOrderTraversal(visit: visit) - rightChild?.preOrderTraversal(visit: visit) + + if let leftChild = leftChild { + leftChild.preOrderTraversal(visit: visit) + } else { + visit(nil) + } + + if let rightChild = rightChild { + rightChild.preOrderTraversal(visit: visit) + } else { + visit(nil) + } } } ``` +Here's a high level overview of the above code: + +1. `splitter` is a way to distinguish the nodes in a string. To illustrate its importance, consider the following encoded string "banana". How did the tree structure look like before encoding? Without the `splitter`, you can't tell. + +2. `encodedString` is the result of the encoding process. Returns a string representation of the tree. For example: "ba,nana,nil" represents a tree with two nodes - "ba" and "nana" - in pre-order format. + +3. It is interesting to note that this pre-order traversal implementation also emits `nil` values in place of absent children. + +## Decoding + +Your decoding strategy is the exact opposite of your encoding strategy. You'll take an encoded string, and turn it back into your binary tree. + +Your encoding strategy followed the following rules: + +1. The result of the encoding will be a `String` object. +2. You'll encode using *pre-order* traversal. + +The implementation also added a few important details: + +* node values are separated by `,` +* `nil` children are denoted by the `nil` string + +These details will shape your `decode` operation. Here's a possible implementation: + +```swift +extension BinaryTree { + + static func decode(from string: String) -> BinaryNode? { +    let array = string.split(separator: ",") + let deque: Deque = array + return decode(from: deque) + } + + static func decode(from deque: RangeReplaceableCollection) + -> BinaryNode? { + + } +} +``` + + + + + + From 959aaafe2d16b9e82f830381c6856c396590c51f Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Thu, 16 Nov 2017 10:22:28 -0800 Subject: [PATCH 14/39] More progress. --- Encode and Decode Tree/readme.md | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index 3b2281224..506bfbe05 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -34,8 +34,8 @@ Here's an example of this operation in code: ```swift extension BinaryNode { // 1 - private var splitter: String { return "," } - private var nilNode: String { return "nil" } + fileprivate var splitter: String { return "," } + fileprivate var nilNode: String { return "nil" } // 2 var encodedString: String { @@ -98,19 +98,32 @@ These details will shape your `decode` operation. Here's a possible implementati ```swift extension BinaryTree { + // 1 static func decode(from string: String) -> BinaryNode? {    let array = string.split(separator: ",") - let deque: Deque = array - return decode(from: deque) + return decode(from: array) } - static func decode(from deque: RangeReplaceableCollection) + // 2 + static func decode(from sequence: Sequence) -> BinaryNode? { + guard let value = sequence.first else { return nil } + if value == nilNode { + return nil + } else { + let node = BinaryNode(value: value) + node.leftChild = decode(from: AnySequence(sequence.dropFirst())) + node.rightChild = decode(from: AnySequence(sequence.dropFirst())) + } } } ``` +Here's a high level overview of the above code: + +1. Takes a `String`, and uses `split` to partition the contents of `string` into an array based on the `","` character. +2. Takes any `Sequence` type and recursively creates a binary tree based on the rules declared in the encoding operation. From e1599029f885de746bb8b7626246d57f7bdbd664 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Sat, 18 Nov 2017 01:45:12 -0800 Subject: [PATCH 15/39] More progress --- Encode and Decode Tree/readme.md | 60 +++++++++++++++++--------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index 506bfbe05..e0c38531c 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -34,8 +34,8 @@ Here's an example of this operation in code: ```swift extension BinaryNode { // 1 - fileprivate var splitter: String { return "," } - fileprivate var nilNode: String { return "nil" } + fileprivate var separator: String { return "," } + fileprivate var nilNode: String { return "X" } // 2 var encodedString: String { @@ -47,25 +47,25 @@ extension BinaryNode { } else { str.append(nilNode) } - str.append(splitter) + str.append(separator) } return str } // 3 - func preOrderTraversal(visit: (T?) -> ()) { - visit(data) + func preOrderTraversal(visit: (Element?) throws -> ()) rethrows { + try visit(data) if let leftChild = leftChild { - leftChild.preOrderTraversal(visit: visit) + try leftChild.preOrderTraversal(visit: visit) } else { - visit(nil) + try visit(nil) } if let rightChild = rightChild { - rightChild.preOrderTraversal(visit: visit) + try rightChild.preOrderTraversal(visit: visit) } else { - visit(nil) + try visit(nil) } } } @@ -73,7 +73,7 @@ extension BinaryNode { Here's a high level overview of the above code: -1. `splitter` is a way to distinguish the nodes in a string. To illustrate its importance, consider the following encoded string "banana". How did the tree structure look like before encoding? Without the `splitter`, you can't tell. +1. `separator` is a way to distinguish the nodes in a string. To illustrate its importance, consider the following encoded string "banana". How did the tree structure look like before encoding? Without the `separator`, you can't tell. 2. `encodedString` is the result of the encoding process. Returns a string representation of the tree. For example: "ba,nana,nil" represents a tree with two nodes - "ba" and "nana" - in pre-order format. @@ -96,34 +96,36 @@ The implementation also added a few important details: These details will shape your `decode` operation. Here's a possible implementation: ```swift -extension BinaryTree { - +extension BinaryNode { + // 1 - static func decode(from string: String) -> BinaryNode? { -    let array = string.split(separator: ",") - return decode(from: array) + public static func decode(from str: String) -> AVLNode? { + let components = encoded.lazy.split(separator: separator).reversed().map(String.init) + return decode(from: components) } - - // 2 - static func decode(from sequence: Sequence) - -> BinaryNode? { + + public static func decode(from array: inout [String]) + -> AVLNode? { - guard let value = sequence.first else { return nil } - if value == nilNode { - return nil - } else { - let node = BinaryNode(value: value) - node.leftChild = decode(from: AnySequence(sequence.dropFirst())) - node.rightChild = decode(from: AnySequence(sequence.dropFirst())) - } + guard !array.isEmpty else { return nil } + let value = array.removeLast() + guard value != "\(nilNode)" else { return nil } + + let node = AVLNode(value: value) + node.leftChild = decode(from: &array) + node.rightChild = decode(from: &array) + return node } } ``` Here's a high level overview of the above code: -1. Takes a `String`, and uses `split` to partition the contents of `string` into an array based on the `","` character. -2. Takes any `Sequence` type and recursively creates a binary tree based on the rules declared in the encoding operation. +1. Takes a `String`, and uses `split` to partition the contents of `string` into an array based on the `separator` defined in the encoding step. The result is first `reversed`, and then mapped to a `String`. The `reverse` step is an optimization for the next function, allowing us to use `array.removeLast()` instead of `array.removeFirst()`. + +2. Using an array as a stack, you recursively decode each node. The array keeps track of sequence of nodes and progress. + + From 8bc6ab70c45d36d55466046d613509f64ca8ee59 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Sat, 18 Nov 2017 01:51:20 -0800 Subject: [PATCH 16/39] Added example case. --- Encode and Decode Tree/readme.md | 42 ++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index e0c38531c..d7dd89424 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -125,9 +125,47 @@ Here's a high level overview of the above code: 2. Using an array as a stack, you recursively decode each node. The array keeps track of sequence of nodes and progress. +Here's an example output of a tree undergoing the encoding and decoding process: - - +``` +Original Tree + + ┌──8423 + ┌──8391 + │ └──nil +┌──7838 +│ │ ┌──4936 +│ └──3924 +│ └──2506 +830 +│ ┌──701 +└──202 + └──169 + +Encoded tree: 830,202,169,X,X,701,X,X,7838,3924,2506,X,X,4936,X,X,8391,X,8423,X,X, + +Decoded tree + + ┌──8423 + ┌──8391 + │ └──nil +┌──7838 +│ │ ┌──4936 +│ └──3924 +│ └──2506 +830 +│ ┌──701 +└──202 + └──169 + ``` + +Notice the original tree and decoded tree are identical. + +## Further Reading & References + +- [LeetCode](https://leetcode.com/problems/serialize-and-deserialize-binary-tree/description/) + +*Written for the Swift Algorithm Club by Kai Chen & Kelvin Lau* From eeea2027fe024dcf7a553f6c3c3479e39942045f Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Tue, 21 Nov 2017 22:32:03 -0800 Subject: [PATCH 17/39] Updates readme to reference new class to handle encoding and decoding operations --- Encode and Decode Tree/readme.md | 103 +++++++++++++++++++------------ 1 file changed, 65 insertions(+), 38 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index d7dd89424..d60075e63 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -13,7 +13,7 @@ Encoding and decoding are synonyms to *serializing* and *deserializing* trees. As a reference, the following code represents the typical `Node` type of a binary tree: ```swift -class BinaryNode { +class BinaryNode { var data: Element var leftChild: BinaryNode? var rightChild: BinaryNode? @@ -22,6 +22,24 @@ class BinaryNode { } ``` +Your encoding and decoding methods will reside in the `BinaryNodeEncoder` and `BinaryNodeDecoder` classes: + +```swift +class BinaryNodeCoder { + + // transforms nodes into string representation + func encode(_ node: BinaryNode) throws -> String where T: Encodable { + + } + + // transforms string into `BinaryNode` representation + func decode(_ node: BinaryNodeType, from string: String) + throws -> BinaryNode where T: Decodable { + + } +} +``` + ## Encoding As mentioned before, there are different ways to do encoding. For no particular reason, you'll opt for the following rules: @@ -32,27 +50,9 @@ As mentioned before, there are different ways to do encoding. For no particular Here's an example of this operation in code: ```swift -extension BinaryNode { - // 1 - fileprivate var separator: String { return "," } - fileprivate var nilNode: String { return "X" } - - // 2 - var encodedString: String { - var str = "" - preOrderTraversal { data in - if let data = data { - let string = String(describing: data) - str.append(string) - } else { - str.append(nilNode) - } - str.append(separator) - } - return str - } +fileprivate extension BinaryNode { - // 3 + // 1 func preOrderTraversal(visit: (Element?) throws -> ()) rethrows { try visit(data) @@ -69,15 +69,41 @@ extension BinaryNode { } } } + +class BinaryNodeCoder { + + // 2 + private var separator: String { return "," } + + // 3 + private var nilNode: String { return "X" } + + // 4 + func encode(_ node: BinaryNode) -> String { + var str = "" + node.preOrderTraversal { data in + if let data = data { + let string = String(describing: data) + str.append(string) + } else { + str.append(nilNode) + } + str.append(separator) + } + return str + } + + // ... +} ``` Here's a high level overview of the above code: -1. `separator` is a way to distinguish the nodes in a string. To illustrate its importance, consider the following encoded string "banana". How did the tree structure look like before encoding? Without the `separator`, you can't tell. +2. `separator` is a way to distinguish the nodes in a string. To illustrate its importance, consider the following encoded string "banana". How did the tree structure look like before encoding? Without the `separator`, you can't tell. -2. `encodedString` is the result of the encoding process. Returns a string representation of the tree. For example: "ba,nana,nil" represents a tree with two nodes - "ba" and "nana" - in pre-order format. +3. `nilNode` is used to identify empty children. This a necesssary piece of information to retain in order to rebuild the tree later. -3. It is interesting to note that this pre-order traversal implementation also emits `nil` values in place of absent children. +4. `encode` returns a `String` representation of the `BinaryNode`. For example: "ba,nana,nil" represents a tree with two nodes - "ba" and "nana" - in pre-order format. ## Decoding @@ -96,28 +122,29 @@ The implementation also added a few important details: These details will shape your `decode` operation. Here's a possible implementation: ```swift -extension BinaryNode { +class BinaryNodeCoder { + + // ... + // 1 - public static func decode(from str: String) -> AVLNode? { + func decode(_ string: String) -> BinaryNode? { let components = encoded.lazy.split(separator: separator).reversed().map(String.init) return decode(from: components) } - - public static func decode(from array: inout [String]) - -> AVLNode? { + + // 2 + private func decode(from array: inout [String]) -> AVLNode? { + guard !array.isEmpty else { return nil } + let value = array.removeLast() + guard value != "\(nilNode)" else { return nil } - guard !array.isEmpty else { return nil } - let value = array.removeLast() - guard value != "\(nilNode)" else { return nil } - - let node = AVLNode(value: value) - node.leftChild = decode(from: &array) - node.rightChild = decode(from: &array) - return node + let node = AVLNode(value: value) + node.leftChild = decode(from: &array) + node.rightChild = decode(from: &array) + return node } } -``` Here's a high level overview of the above code: From 4187a9af9f6b316479562589fd78c7685b633f22 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Thu, 23 Nov 2017 01:54:56 -0800 Subject: [PATCH 18/39] Fixed some formatting. --- Encode and Decode Tree/readme.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index d60075e63..ce5b45aaf 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -33,7 +33,7 @@ class BinaryNodeCoder { } // transforms string into `BinaryNode` representation - func decode(_ node: BinaryNodeType, from string: String) + func decode(from string: String) throws -> BinaryNode where T: Decodable { } @@ -145,6 +145,7 @@ class BinaryNodeCoder { return node } } +``` Here's a high level overview of the above code: From 25e6a190af8d13ee4e72bd41087fe593d49eba0f Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Thu, 23 Nov 2017 23:34:24 -0800 Subject: [PATCH 19/39] Removed mentions of Encodable and Decodable protocol. Fixed a typo. --- Encode and Decode Tree/readme.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Encode and Decode Tree/readme.md b/Encode and Decode Tree/readme.md index ce5b45aaf..b60e0a504 100644 --- a/Encode and Decode Tree/readme.md +++ b/Encode and Decode Tree/readme.md @@ -13,7 +13,7 @@ Encoding and decoding are synonyms to *serializing* and *deserializing* trees. As a reference, the following code represents the typical `Node` type of a binary tree: ```swift -class BinaryNode { +class BinaryNode { var data: Element var leftChild: BinaryNode? var rightChild: BinaryNode? @@ -79,7 +79,7 @@ class BinaryNodeCoder { private var nilNode: String { return "X" } // 4 - func encode(_ node: BinaryNode) -> String { + func encode(_ node: BinaryNode) -> String { var str = "" node.preOrderTraversal { data in if let data = data { @@ -128,13 +128,13 @@ class BinaryNodeCoder { // ... // 1 - func decode(_ string: String) -> BinaryNode? { + func decode(_ string: String) -> BinaryNode? { let components = encoded.lazy.split(separator: separator).reversed().map(String.init) return decode(from: components) } // 2 - private func decode(from array: inout [String]) -> AVLNode? { + private func decode(from array: inout [String]) -> BinaryNode? { guard !array.isEmpty else { return nil } let value = array.removeLast() guard value != "\(nilNode)" else { return nil } From 074dac29084d235f93edb68e58d2deb92ffc0bbf Mon Sep 17 00:00:00 2001 From: ck Date: Sun, 14 Jan 2018 18:16:35 -0800 Subject: [PATCH 20/39] Address comments and update the code to sync up with readme --- .../Contents.swift | 21 ++- .../Sources/EncodeAndDecodeTree.swift | 137 ++++++++---------- .../EncodeAndDecodeTree.swift | 137 ++++++++---------- 3 files changed, 137 insertions(+), 158 deletions(-) diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift index dbd2fd180..44c2440d5 100644 --- a/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift +++ b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Contents.swift @@ -1,13 +1,10 @@ //: Playground - noun: a place where people can play - -func printTree(_ root: TreeNode?) { +func printTree(_ root: BinaryNode?) { guard let root = root else { return } - var pointer = root - let leftVal = root.left == nil ? "nil" : root.left!.val let rightVal = root.right == nil ? "nil" : root.right!.val @@ -17,25 +14,25 @@ func printTree(_ root: TreeNode?) { printTree(root.right) } -let s = EncodeAndDecodeTree() +let coder = BinaryNodeCoder() -let node1 = TreeNode("a") -let node2 = TreeNode("b") -let node3 = TreeNode("c") -let node4 = TreeNode("d") -let node5 = TreeNode("e") +let node1 = BinaryNode("a") +let node2 = BinaryNode("b") +let node3 = BinaryNode("c") +let node4 = BinaryNode("d") +let node5 = BinaryNode("e") node1.left = node2 node1.right = node3 node3.left = node4 node3.right = node5 -let encodeStr = s.encode(node1) +let encodeStr = try coder.encode(node1) print(encodeStr) // "a b # # c d # # e # #" -let root = s.decode(encodeStr) +let root: BinaryNode = coder.decode(from: encodeStr)! print("Tree:") printTree(root) /* diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift index e9d22f8a9..10bb277f5 100644 --- a/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift +++ b/Encode and Decode Tree/EncodeAndDecodeTree.playground/Sources/EncodeAndDecodeTree.swift @@ -8,97 +8,88 @@ import Foundation -public class TreeNode { - public var val: String - public var left: TreeNode? - public var right: TreeNode? - - public init(_ val: String, left: TreeNode? = nil, right: TreeNode? = nil) { - self.val = val - self.left = left - self.right = right - } +protocol BinaryNodeEncoder { + func encode(_ node: BinaryNode?) throws -> String } -public class EncodeAndDecodeTree { - private var encodeStr = "" - private var ret: [String] = [] +protocol BinaryNodeDecoder { + func decode(from string: String) -> BinaryNode? +} - public init() {} +public class BinaryNodeCoder: BinaryNodeEncoder, BinaryNodeDecoder { - public func encode(_ root: TreeNode?) -> String { - encodeIt(root) + // MARK: Private - return encodeStr - } + private let separator: Character = "," + private let nilNode = "X" - public func decode(_ data: String) -> TreeNode? { - var s = data - while (s.contains(" ")) { - let index = s.index(of: " ") - let endIndex = s.index(before: index) - let element = s[s.startIndex...endIndex] - ret.append(element) - let range = ClosedRange(uncheckedBounds: (lower: s.startIndex, upper: index)) - s.removeSubrange(range) - } - - if ret.count == 0 { - return nil - } - - var dep = 0 - let root = decodeIt(&dep) - - return root + private func decode(from array: inout [String]) -> BinaryNode? { + guard !array.isEmpty else { + return nil } - private func getNode(_ element: String) -> TreeNode? { - if element == "#" { - return nil - } + let value = array.removeLast() - return TreeNode(element) + guard value != nilNode, let val = value as? T else { + return nil } - private func decodeIt(_ dep: inout Int) -> TreeNode? { - guard let currentNode = getNode(ret[dep]) else { - return nil - } + let node = BinaryNode(val) + node.left = decode(from: &array) + node.right = decode(from: &array) - dep += 1 - let left = decodeIt(&dep) - dep += 1 - let right = decodeIt(&dep) + return node + } - currentNode.left = left - currentNode.right = right + // MARK: Public - return currentNode + public init() {} + + public func encode(_ node: BinaryNode?) throws -> String { + var str = "" + node?.preOrderTraversal { data in + if let data = data { + let string = String(describing: data) + str.append(string) + } else { + str.append(nilNode) + } + str.append(separator) } - private func encodeIt(_ root: TreeNode?) { - guard let root = root else { - encodeStr += "# " - return - } + return str + } - encodeStr += root.val + " " - encodeIt(root.left) - encodeIt(root.right) - } + public func decode(from string: String) -> BinaryNode? { + var components = string.split(separator: separator).reversed().map(String.init) + return decode(from: &components) + } } -extension String { - func index(of target: Character) -> String.Index { - var i = 0 - for c in self.characters { - if c == target { - return self.index(self.startIndex, offsetBy: i) - } - i += 1 - } - - return self.endIndex +public class BinaryNode { + public var val: Element + public var left: BinaryNode? + public var right: BinaryNode? + + public init(_ val: Element, left: BinaryNode? = nil, right: BinaryNode? = nil) { + self.val = val + self.left = left + self.right = right + } + + public func preOrderTraversal(visit: (Element?) throws -> ()) rethrows { + try visit(val) + + if let left = left { + try left.preOrderTraversal(visit: visit) + } else { + try visit(nil) + } + + if let right = right { + try right.preOrderTraversal(visit: visit) + } else { + try visit(nil) } + } } diff --git a/Encode and Decode Tree/EncodeAndDecodeTree.swift b/Encode and Decode Tree/EncodeAndDecodeTree.swift index daa3c3ea2..6ec8a3046 100644 --- a/Encode and Decode Tree/EncodeAndDecodeTree.swift +++ b/Encode and Decode Tree/EncodeAndDecodeTree.swift @@ -8,97 +8,88 @@ import Foundation -public class TreeNode { - public var val: String - public var left: TreeNode? - public var right: TreeNode? - - public init(_ val: String, left: TreeNode? = nil, right: TreeNode? = nil) { - self.val = val - self.left = left - self.right = right - } +protocol BinaryNodeEncoder { + func encode(_ node: BinaryNode?) throws -> String } -public class EncodeAndDecodeTree { - private var encodeStr = "" - private var ret: [String] = [] +protocol BinaryNodeDecoder { + func decode(from string: String) -> BinaryNode? +} - public init() {} +public class BinaryNodeCoder: BinaryNodeEncoder, BinaryNodeDecoder { - public func encode(_ root: TreeNode?) -> String { - encodeIt(root) + // MARK: Private - return encodeStr - } + private let separator: Character = "," + private let nilNode = "X" - public func decode(_ data: String) -> TreeNode? { - var s = data - while (s.contains(" ")) { - let index = s.index(of: " ") - let endIndex = s.index(before: index) - let element = s[s.startIndex...endIndex] - ret.append(element) - let range = ClosedRange(uncheckedBounds: (lower: s.startIndex, upper: index)) - s.removeSubrange(range) - } - - if ret.count == 0 { - return nil - } - - var dep = 0 - let root = decodeIt(&dep) - - return root + private func decode(from array: inout [String]) -> BinaryNode? { + guard !array.isEmpty else { + return nil } - private func getNode(_ element: String) -> TreeNode? { - if element == "#" { - return nil - } + let value = array.removeLast() - return TreeNode(element) + guard value != nilNode, let val = value as? T else { + return nil } - private func decodeIt(_ dep: inout Int) -> TreeNode? { - guard let currentNode = getNode(ret[dep]) else { - return nil - } + let node = BinaryNode(val) + node.left = decode(from: &array) + node.right = decode(from: &array) - dep += 1 - let left = decodeIt(&dep) - dep += 1 - let right = decodeIt(&dep) + return node + } - currentNode.left = left - currentNode.right = right + // MARK: Public - return currentNode + public init() {} + + public func encode(_ node: BinaryNode?) throws -> String { + var str = "" + node?.preOrderTraversal { data in + if let data = data { + let string = String(describing: data) + str.append(string) + } else { + str.append(nilNode) + } + str.append(separator) } - private func encodeIt(_ root: TreeNode?) { - guard let root = root else { - encodeStr += "# " - return - } + return str + } - encodeStr += root.val + " " - encodeIt(root.left) - encodeIt(root.right) - } + public func decode(from string: String) -> BinaryNode? { + var components = string.split(separator: separator).reversed().map(String.init) + return decode(from: &components) + } } -extension String { - func index(of target: Character) -> String.Index { - var i = 0 - for c in self.characters { - if c == target { - return self.index(self.startIndex, offsetBy: i) - } - i += 1 - } - - return self.endIndex +public class BinaryNode { + public var val: Element + public var left: BinaryNode? + public var right: BinaryNode? + + public init(_ val: Element, left: BinaryNode? = nil, right: BinaryNode? = nil) { + self.val = val + self.left = left + self.right = right + } + + public func preOrderTraversal(visit: (Element?) throws -> ()) rethrows { + try visit(val) + + if let left = left { + try left.preOrderTraversal(visit: visit) + } else { + try visit(nil) + } + + if let right = right { + try right.preOrderTraversal(visit: visit) + } else { + try visit(nil) } + } } From 90ac6b3b8cc3b341bc3e691998dc02a2cfd9de18 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Mon, 22 Jan 2018 08:09:08 -0800 Subject: [PATCH 21/39] Updates link to new contribution --- README.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/README.markdown b/README.markdown index 7c9482d0c..6169b07b1 100644 --- a/README.markdown +++ b/README.markdown @@ -200,6 +200,7 @@ A lot of software developer interview questions consist of algorithmic puzzles. - [Finding Palindromes](Palindromes/) - [Dining Philosophers](DiningPhilosophers/) - [Egg Drop Problem](Egg%20Drop%20Problem/) +- [Encoding and Decoding Binary Tree](Encode%20and%20Decode%20Tree/) ## Learn more! For more information, check out these great books: From 5ff583027979d8826d2a9328f84534a1e5712323 Mon Sep 17 00:00:00 2001 From: Chris Date: Fri, 26 Jan 2018 10:54:10 -0800 Subject: [PATCH 22/39] Fix typo: bottom-left -> bottom-right --- Longest Common Subsequence/README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Longest Common Subsequence/README.markdown b/Longest Common Subsequence/README.markdown index 4cd2c2fcb..a62c562a6 100644 --- a/Longest Common Subsequence/README.markdown +++ b/Longest Common Subsequence/README.markdown @@ -99,7 +99,7 @@ And so on... this is how `lcsLength(_:)` fills in the entire matrix. ## Backtracking to find the actual subsequence -So far we've calculated the length of every possible subsequence. The length of the longest subsequence is found in the bottom-left corner of matrix, at `matrix[n+1][m+1]`. In the above example it is 4, so the LCS consists of 4 characters. +So far we've calculated the length of every possible subsequence. The length of the longest subsequence is found in the bottom-right corner of matrix, at `matrix[n+1][m+1]`. In the above example it is 4, so the LCS consists of 4 characters. Having the length of every combination of substrings makes it possible to determine *which* characters are part of the LCS itself by using a backtracking strategy. From 2924b2dced521f2ccf3a0f276f3f58f57822f914 Mon Sep 17 00:00:00 2001 From: i303071 Date: Mon, 29 Jan 2018 11:04:29 +0100 Subject: [PATCH 23/39] HashTable CustomStringConvertible conformance in protocol --- .../Sources/HashTable.swift | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/Hash Table/HashTable.playground/Sources/HashTable.swift b/Hash Table/HashTable.playground/Sources/HashTable.swift index 2383b8192..476a51174 100644 --- a/Hash Table/HashTable.playground/Sources/HashTable.swift +++ b/Hash Table/HashTable.playground/Sources/HashTable.swift @@ -30,7 +30,7 @@ Insert: O(1) O(n) Delete: O(1) O(n) */ -public struct HashTable: CustomStringConvertible { +public struct HashTable { private typealias Element = (key: Key, value: Value) private typealias Bucket = [Element] private var buckets: [Bucket] @@ -41,23 +41,6 @@ public struct HashTable: CustomStringConvertible { /// A Boolean value that indicates whether the hash table is empty. public var isEmpty: Bool { return count == 0 } - /// A string that represents the contents of the hash table. - public var description: String { - let pairs = buckets.flatMap { b in b.map { e in "\(e.key) = \(e.value)" } } - return pairs.joined(separator: ", ") - } - - /// A string that represents the contents of - /// the hash table, suitable for debugging. - public var debugDescription: String { - var str = "" - for (i, bucket) in buckets.enumerated() { - let pairs = bucket.map { e in "\(e.key) = \(e.value)" } - str += "bucket \(i): " + pairs.joined(separator: ", ") + "\n" - } - return str - } - /** Create a hash table with the given capacity. */ @@ -151,3 +134,22 @@ public struct HashTable: CustomStringConvertible { return abs(key.hashValue) % buckets.count } } + +extension HashTable: CustomStringConvertible { + /// A string that represents the contents of the hash table. + public var description: String { + let pairs = buckets.flatMap { b in b.map { e in "\(e.key) = \(e.value)" } } + return pairs.joined(separator: ", ") + } + + /// A string that represents the contents of + /// the hash table, suitable for debugging. + public var debugDescription: String { + var str = "" + for (i, bucket) in buckets.enumerated() { + let pairs = bucket.map { e in "\(e.key) = \(e.value)" } + str += "bucket \(i): " + pairs.joined(separator: ", ") + "\n" + } + return str + } +} From f34ccf2f6fb873bbf1b21fa39841534dbb5a04c4 Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Wed, 7 Feb 2018 02:11:29 -0800 Subject: [PATCH 24/39] English Edit --- Introsort/README.markdown | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Introsort/README.markdown b/Introsort/README.markdown index c4ee6f804..376703cf7 100644 --- a/Introsort/README.markdown +++ b/Introsort/README.markdown @@ -6,7 +6,7 @@ IntroSort is the algorithm used by swift to sort a collection. Introsort is an h The number 20 is an empiric number obtained observing the behaviour of InsertionSort with lists of this size. -Here's an implementation in Pseudocode: +Here's an implementation in pseudocode: ``` procedure sort(A : array): @@ -32,9 +32,9 @@ Let's walk through the example. The array is initially: [ 10, 0, 3, 9, 2, 14, 8, 27, 1, 5, 8, -1, 26 ] -for this example let's assume that `maxDepth` is **2** and that the size of the partition for the insertionSort to kick in is **5** +For this example let's assume that `maxDepth` is **2** and that the size of the partition for the insertionSort to kick in is **5** -At the first iteration we run introSort on the full collection that counts 13 elements. the maxDepth is 2, therefore we fall in the else case where quicksort acts. +The first iteration of introsort begins by attempting to use insertionSort. The collection has 13 elements, so it tries to do heapsort instead. The condition for heapsort to occur is if `maxdepth == 0` evaluates true. Since `maxdepth` is currently **2** for the first iteration, introsort will default to quicksort. The `partition` method picks the first element, the median and the last, it sorts them and uses the new median as pivot. @@ -106,5 +106,6 @@ The array is now successfully sorted [Introsort on Wikipedia](https://en.wikipedia.org/wiki/Introsort) [Introsort comparison with other sorting algorithms](http://agostini.tech/2017/12/18/swift-sorting-algorithm/) +[Introsort implementation from the Swift standard library](https://github.com/apple/swift/blob/09f77ff58d250f5d62855ea359fc304f40b531df/stdlib/public/core/Sort.swift.gyb) *Written for Swift Algorithm Club by Giuseppe Lanza* From 1bc39d21853c4fe869a6861354c54d213cd624bf Mon Sep 17 00:00:00 2001 From: Philip Ridgeway Date: Sat, 10 Mar 2018 10:57:39 -0800 Subject: [PATCH 25/39] Replaces references to indexOf(_:) with index(of:). The global function `indexOf(_:)` was replaced with `Collection.index(of:)` in Swift 2. --- Binary Search/README.markdown | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Binary Search/README.markdown b/Binary Search/README.markdown index 09b141e04..0cecce6cf 100644 --- a/Binary Search/README.markdown +++ b/Binary Search/README.markdown @@ -4,15 +4,15 @@ Goal: Quickly find an element in an array. Let's say you have an array of numbers and you want to determine whether a specific number is in that array, and if so, at which index. -In most cases, Swift's `indexOf()` function is good enough for that: +In most cases, Swift's `Collection.index(of:)` function is good enough for that: ```swift let numbers = [11, 59, 3, 2, 53, 17, 31, 7, 19, 67, 47, 13, 37, 61, 29, 43, 5, 41, 23] -numbers.indexOf(43) // returns 15 +numbers.index(of: 43) // returns 15 ``` -The built-in `indexOf()` function performs a [linear search](../Linear%20Search/). In code that looks something like this: +The built-in `Collection.index(of:)` function performs a [linear search](../Linear%20Search/). In code that looks something like this: ```swift func linearSearch(_ a: [T], _ key: T) -> Int? { From 81534d54a2f890ab1a5032941e77838b5e585d4b Mon Sep 17 00:00:00 2001 From: Kelvin Lau Date: Wed, 14 Mar 2018 09:46:07 -0700 Subject: [PATCH 26/39] Update README.markdown --- Brute-Force String Search/README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Brute-Force String Search/README.markdown b/Brute-Force String Search/README.markdown index 4e967bcfb..599fe75ea 100644 --- a/Brute-Force String Search/README.markdown +++ b/Brute-Force String Search/README.markdown @@ -51,6 +51,6 @@ extension String { This looks at each character in the source string in turn. If the character equals the first character of the search pattern, then the inner loop checks whether the rest of the pattern matches. If no match is found, the outer loop continues where it left off. This repeats until a complete match is found or the end of the source string is reached. -The brute-force approach works OK, but it's not very efficient (or pretty). It should work fine on small strings, though. For a smarter algorithm that works better with large chunks of text, check out [Boyer-Moore](../Boyer-Moore/) string search. +The brute-force approach works OK, but it's not very efficient (or pretty). It should work fine on small strings, though. For a smarter algorithm that works better with large chunks of text, check out [Boyer-Moore](../Boyer-Moore-Horspool) string search. *Written for Swift Algorithm Club by Matthijs Hollemans* From 2d5d8d0f552044b54b61409a46bd5b007f2fd2a2 Mon Sep 17 00:00:00 2001 From: James Lawson Date: Sun, 18 Mar 2018 10:00:41 +0000 Subject: [PATCH 27/39] Add Sparse Table link to README --- README.markdown | 1 + 1 file changed, 1 insertion(+) diff --git a/README.markdown b/README.markdown index 5706fc8e5..dc0fc1f57 100644 --- a/README.markdown +++ b/README.markdown @@ -162,6 +162,7 @@ Most of the time using just the built-in `Array`, `Dictionary`, and `Set` types - [Segment Tree](Segment%20Tree/). Can quickly compute a function over a portion of an array. - [Lazy Propagation](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree/LazyPropagation) - kd-Tree +- [Sparse Table](Sparse%20Table/). Another take on quickly computing a function over a portion of an array, but this time we'll make it even quicker!. - [Heap](Heap/). A binary tree stored in an array, so it doesn't use pointers. Makes a great priority queue. - Fibonacci Heap - [Trie](Trie/). A special type of tree used to store associative data structures. From 39da67cf7f5124fd3e5d270ea59361d86c512d78 Mon Sep 17 00:00:00 2001 From: Mike R Date: Sun, 25 Mar 2018 12:41:35 +0300 Subject: [PATCH 28/39] change function name for future code explanations --- Binary Search Tree/README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Binary Search Tree/README.markdown b/Binary Search Tree/README.markdown index 84e278f5c..30dc8d922 100644 --- a/Binary Search Tree/README.markdown +++ b/Binary Search Tree/README.markdown @@ -375,7 +375,7 @@ As an exercise, see if you can implement filter and reduce. We can make the code more readable by defining some helper functions. ```swift - private func reconnectParentToNode(node: BinarySearchTree?) { + private func reconnectParentTo(node: BinarySearchTree?) { if let parent = parent { if isLeftChild { parent.left = node From 8baf3549e597edbef432218eb3b52469a75c9df9 Mon Sep 17 00:00:00 2001 From: Daniel Strobusch <1847260+dastrobu@users.noreply.github.com> Date: Sun, 25 Mar 2018 18:23:11 +0200 Subject: [PATCH 29/39] fixed typo --- DiningPhilosophers/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DiningPhilosophers/README.md b/DiningPhilosophers/README.md index ae84cb63b..cd9d86154 100755 --- a/DiningPhilosophers/README.md +++ b/DiningPhilosophers/README.md @@ -44,7 +44,7 @@ Based on the Chandy and Misra's analysis, a system of preference levels is deriv # Swift implementation -This Swift 3.0 implementation of the Chandy/Misra solution is based on the GCD and Semaphore tecnique that can be built on both macOS and Linux. +This Swift 3.0 implementation of the Chandy/Misra solution is based on the GCD and Semaphore technique that can be built on both macOS and Linux. The code is based on a ForkPair struct used for holding an array of DispatchSemaphore and a Philosopher struct for associate a couple of forks to each Philosopher. From e4ce8d3f2894745ec4bd62d6fed82311bbe685ea Mon Sep 17 00:00:00 2001 From: James Lawson Date: Wed, 28 Mar 2018 19:21:44 +0100 Subject: [PATCH 30/39] Add Sparse Table --- Sparse Table/Images/idempotency.png | Bin 0 -> 33715 bytes Sparse Table/Images/query.png | Bin 0 -> 25405 bytes Sparse Table/Images/query_example.png | Bin 0 -> 29984 bytes Sparse Table/Images/recursion.png | Bin 0 -> 78302 bytes Sparse Table/Images/recursion_examples.png | Bin 0 -> 120693 bytes Sparse Table/Images/structure.png | Bin 0 -> 100125 bytes Sparse Table/Images/structure_examples.png | Bin 0 -> 157486 bytes Sparse Table/README.markdown | 310 ++++++++++++++++++ .../Sparse Table.playground/Contents.swift | 144 ++++++++ .../contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + 11 files changed, 465 insertions(+) create mode 100644 Sparse Table/Images/idempotency.png create mode 100644 Sparse Table/Images/query.png create mode 100644 Sparse Table/Images/query_example.png create mode 100644 Sparse Table/Images/recursion.png create mode 100644 Sparse Table/Images/recursion_examples.png create mode 100644 Sparse Table/Images/structure.png create mode 100644 Sparse Table/Images/structure_examples.png create mode 100644 Sparse Table/README.markdown create mode 100644 Sparse Table/Sparse Table.playground/Contents.swift create mode 100644 Sparse Table/Sparse Table.playground/contents.xcplayground create mode 100644 Sparse Table/Sparse Table.playground/playground.xcworkspace/contents.xcworkspacedata diff --git a/Sparse Table/Images/idempotency.png b/Sparse Table/Images/idempotency.png new file mode 100644 index 0000000000000000000000000000000000000000..88c8e7a8dd139bdea915c3f64c47493479cd6ea5 GIT binary patch literal 33715 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 {Su)c6b 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
#kdl?Pj>dEBovu3p&qqx3XIy)t;_0 zI+g|t7A{j>|8w?G0CwYhnj;RhyMy8w9Ml~#0W|3g8};*ZZRug0&!XPMj7A|~LP zk|{PAf1bNuXBTh9pN0K?d4fd%a*`+(Y(4$isc}5O$f5DX6T;>}R7&5eQGq|XS@Y1@ zf&kb<#ih?&!9_6{S2cca(@Ii5WZHh>^#{o^E(-KFG`<`7(@UqvGHDEEFV>S79l1a!!bSu8HVVZ@##_#20^8bW7B{N6#;0P;_n=d>>3lG z6-;wP!jGl)xyLO)#*mJSUsQzILy%)u7n7eHtmo~zIaE-qcrKV64;E4wNw~xxf_nKq zo;sW#{>dl&5N4PS02=8ReZO9>6>#uL8xax2M%X+V@`?NID(~qCy9SYzdytXH_k$5D zej1=NWG}IutC5_nH9Ls-9ao5fh1Ul;e&GC>j#UfbMyWEsT1`BDbok8M>P5m_OuoQ^ z4qwo5u77D?UjtwJr2toN{?@HK&CxrOm=K-5AiDrlW zd?@#~7JfG5m;fYnukWS&O9v;wbFzp*Hv!e3FZdYtKX?7K)~_kg$3bEJvH!To??C|$ zQ}Cp6c@nw#=I6zKDDk9gcS<0mzNDx5uN_}I2k1hu`K`w_g#VrI9>Jtr%F@(Zc=?I^X&cXr}u}X|UXNiQQ9QsZVQ(vc>G~G}eONBiUOBuTf zd${1x1T8x#A{q^gMed$fS)u~^IPVAjArb=E6C?w!5BmCOn@53fdV1>hTVM915`R0Y z+DY3g)OYx$m_nUoy@;Q}mtp1I}wW-4EULq$XxexRj%VA>T1az24W;&lXEF$^NASG*eMbI)=k+bt?aI!n39K1E-heQ2~hhTcHL zuWObp-YOyZ10qrwa3d3zaL0=zxJ1=nej>;q%vQXAukhBMrHtMSzRxFuUq3rJU-(6K z;TKapMLDgjv%BGcQ^jBvRRxdrp_R~1Q*S6 z;JuGGpxk%TMRF-Fm0IgD=;?Q%LALYhwUV^AGiFOC=Xq;4KGLb$xadAZ8pK^=)P}uYfR{zjl%oT2a z3YX8%1NS$zTLy271{TsdnNFkbhfF)M7NZw}F_S{^x6vVxS5rF_VV$+UhP`x%xYBDG zy1I0SyYBH7$}|@sKXYAK#k~uMh}u&8iy=b8K$^BEr3Vuvo5Z^K`V$6)$hPeos=N9u zQtx!XtlAA}I~efa_W$0IJC-}Ra)1x1SUyl4Q+?E$YD|Adap`=pf_1h=fzC}=OLd^n zfD(CxmXH=vgo6~@WL)jqX!+p8?v>|JD(?+7QZb8G^0j)W2pW7z5Q$uV&L!CKX&7u874rFbW7`{|7+H7=)tYHE9RKc0LfhpWP0NJFZH9*tXfG1k;J19xcTw9 zG1}h~7ow-O>Xs61B9Fr9#cr*C<^a5f}!%duplA;)Z4WYVHhU?Ddg3ofG3gt3fSEVgFO9+X(pC zDT)tCGf7Fu#;(;R#%u&W+!R~rrO4-4xFQw*DLu>xPsOR`(8aSw?O>FR&4=#HsA8#CO4%Nuj-m7$zI$T6I0tIOk$PXEA4? z%b|Fn@WApxXM8c&5f>MGD*FXT#XB-~J@$-8%~?_(zi5>`4t>=9&>*MWbUCaC=W%R) z=!*bOJ=f%Q+EJW*Y20wLu3d95xhjP>1sO%ti~GVlRRmRPRoYcSFYI5SuII1cUf)}< z80Gq|S>P@pkc%z&D!JdNO{%A{|58Z98agO8Tl;SDcEkqtiHUh*a1DlL*8RoO4xR|j z6z+bce(rwPl%tfWN-z&j5yz8?O1J06-`D9%L}q=ZtbMvqvle%3v!+O=hNd7@C(mnM z;IFT)qpdBi*$vgbA1Uemel*tqedeRLVvS~0CgM})IP9al?hbx}L~qEueokxQ3XH?5 zqoAYq^M)hXVF;cY-U4m{Ikkv~g|dK)fSTa+^9c*Fr`gs*lh4y177h8Dqnnd0;x6`g z@O12`tEm&JC8T~&ZR8*2#}nWI6$$%3R}?$|^@aoy;+{No-yyFrYZW@o)Rk)%ae{#NJ{wJ=5{m#d$`u_2P9TwKT35y)!-1 zy}m6MZ&h;RJmQWu*7x{#pL%Z|ukKrT=6Y=JZ|)DDJoA3+CA}wdxZ<^Q;J0nQ9k&K) zMZ7DCDEW5sYR6kvwB^hXaVc;^e?xdvjWili8&HHCg^GtVf@+J3`I0(l1tSfI6)gn4 z1gDwk1JM`kPuLV#uD8?Zrl=M1-eSWjkC~?#jmT%kDAK4UJlmE+?sVLF`Q}`ifP%1& zVgF&g%_G0>jyi92KIA@9^CY#WlIE*t3BDsJXyxChRp_{xGJ)x2<+MydM6vnRZ_ zLv%?r#^%DJp$5(H;8EcU&G;Uz_8?MoHc?7U`00A?r=}6=JQB?Y=^2;v%{4u%=lxyj zPF}ggYR7%%9IxVE#b0q`OvY?JIDYypg$NNXM_8)h6c z&M^7Pdzl97DHh9*C zlx}I_WTMw>c%6HRY?cJhz`CPOCQSVCv$;mWgxY0XZNs;U(hs|Bg{KCcRt0^eeGX~n z0@lk=ghHS~OJ6&}c}1juB%{W|$KA+>nvr5aYgh4~W>e>9=BC$qwZ&;80P7S2SeS3G->3QD3z;IfI z+n)Q(3{7Q2@o;vz9ln$1e7d#w;z{-8!oF(1Op$NSMe`%<{QCT?f>c|m?TcgE9aEjR zV_~)zx78%S`F*>2+Qv{I-+(WOpGb?W^i}ElRCswDrqmWGLIV+ZTdm#Ovu7h`d$1l| zFYbzZL~&${r-DbrCa)d?A|>4ZF_2VLg3S)TAm)_jOtpHcLul4b4&MYQ6$W%W@k3pEpLPOWc#i63;T+}eCBn|nQU0oqvx`|o9N`a5`A9xCfIX(BAg-j zi;44LN;k7%)5XEk#6%y-$h?t zO~TyKp4ZI6@tGyBhdmg08wp9uLjt(8w{$V1_prBffJk^qGye951aST1F&`uSZ?Cx6 zN;B%KYthR)I$P2U^9u3uGs@her>B>4wy=`WzOVR4bKp*z@wtl&Sb~qw-QAtnU69w& z*_uy4TwI)wAH)X&@c?h|Ks+5>%shA;AWXk^^0S}&mJoAi8?cLwqXYeqe$Aday1Ga+ zGX5Co*XMUQEj?`h9LWLl2U-Avd_QXV1bF%Re)SDBmHP2iLd(X((oX-rjlHD<1QbC~}Q}ySN|IyUo&!&PP(0{i4kD5PPO7Z=`;6E_>eY$>o3e1=e~+&A{XUUpEab+TRx>uad*m!lT=1+#yq@V~y1>NR?WgMvjLfb_RtLBw55VA^bYO(i5`Gy=K5`NF~>5QEVFQ+uph zMmhNAEhdG(ZTq7?ET}lfKUNyup$EIYj$!;q_|OKZQU9^B7>hux;fwN}zXu!`9K|~F zAFu){^#IU}&9brnc3ysr87SEK_mc)x25_OE4HWZhqy1C=0j0oE&u}XV0Gb{- z$IE}}Uk=_U@DD47MGp@{3asD?C%*en{nLY2$bTQ`Z{7ea1hh_)D2DyxiUP}x`;V2i zjPFUsTK0Rm_AlmcX5U3*D{BVg@Yc%BdLq)&@xf7CD6e0?CcO39=#xUs5(*;SySVY@ z`l6d|Y4$FTk;nY&{bQITe*JCqSRC+ejqQc8rnV6L#N%VPnx2Pjp{+_X`*+TE+wkM0 zz8E`Tfg{240s{CYX5CdqmBK=9d^m%BHP!T7y-kLH;pEQ?=ljtZROI>%$Zs=>gLuTDz z_I?xD(5YYmtV$!L3b&{oh>w~_(meijNP}VDQ-hcY8P(REyb#WnpDJVu6-|# zLub5)Zc7!nT%SX2O>?O%LR@)xc;;s_1+54A4p)|@&rSWWTs_a06WanSt|+bPdX1)u zO6MduCo9;f#bAh#DBn%yWcoAGYa;U0q$xOzmcBau|PZA9w;l zm4>mjV+`Q2c2@A%5erbN3W&ruD1mZL_(z!<#fG{@0LAxH~Qc7uA1P^xvlP$I>XtL_J?R_5?c7iy7BBk`LLdmx7;FiYm=cPwC9sHx*1D|lP|`EHc8 z4t(10Jo|FK$h|Fs)@@tKa`>y$aFos=ybME&VFMMRRY2|NV?0}9IuVQ)7iHp7Rx;2z zNi0^AvUqZIy64?&BxH84W!4-QzDsqeg9XJ@pRh%iMIQ)~RD>-b?h)-L_?GkU%<$HG zdm)7GoojbuH5L&zoZeX z>AhBuQZDL73}5$;&+;NPn~lQ|Xg*}KmWFU2pBtk6xG6#ByH9q%#*8{_vduN?ub_3X zY#*NL>Y@$wUC#Djruv>-Ghl3ow0eR&pEpoXmup=6&7zj`jeT5oRXMXd)0i{{ zF$87c5{kLQI4QS`_b~l&z*~h?^wYm!>Vv zl`pOI`IaV5BuhJ5TEeHjv=SmxSf#U8inj_tB{6TkJR>&GaZmjBz2Vb7PlLjf{Y?4r z_!6daJC_t&np%^K1_oN|CL50`z#}y$ywE= ztaIk&)=R39lkfelj^T5t2z7{3_rmjQ3M`D}ERJwM&xsFL&Ztjs@HdTqCBvH%7Hj zw{6RJLaUrldM21wcCjCIeL7!WsF4?=LPf+$HnWh;(MpO=w4^9#kC%_SmpGQiDJr5O z?$T!Eos`7v3DUk1VWEEqE3h=%)y&x%wO(#mN!8hN|7;0chOdiLoRN|QLN=8bDSuiM zyJZ16E@x3Ur}!Iy<1s?}=+IJgleY%9?o9S6Nn(OQJMx9wl0T7Hp6`C>mgSyhPHoSN zwQ3h%SCxgm*rKsXhbZs8#rd|7qN|G&LrM4T!)LBnrb;?RkBN_}XSk|Gk6RQmGWI%U zuZO0}%tMZLZmxH9RaH-z=!2+8OSIpjpiN`$p#-w#d)$!(J+@AefFGeLzaad|fW_V#W zv!+C2olvvd(D^yDs)zeHpxRqq?I*V2X0XYe!clj0r$dBkTpKa6Z|_q!k-~gtj=Vu(9Dn zKwMy@1BYHO5-DWgjUT9Pt>aTKGRzR`OqzE)-zOfm^q~?H9o7HrkrcCV>3LlGn9?-& zs{}L-zp1pcZdxa#aZxUBtH-N96E#}#p zvENNA6>T2~S&&xv#>o@mORoTjUTRTH3rsDyeHva$-pc9(X0N+?=cQEU)#wAE zU+GkIlOy3)eHIAb4lN3QPBpb zzI^}X+rZ$9jx!faEirVf6SCtse>_V@p(ijyK9IR+XtAE{Ij^$)lBBBK{Vc+G{j1+| z=~@j%bwkSQvh4FxJ0q~`CWB`2l~nLS8QXSD?@na+E}5W|r$x)=RF$TQX9dsZLD|Oj zgJv=Rgzy8u(+!!ej6#Yw@wP>@6Kuimdy^tIPh(ldwk0?USWUUP+T=SftozJbBIf}f zotA9JD>4=>?@3hDM|A7N*Rm6>P&(^?vTH=h;#_N=Wh5=N zJoZtlm3)A+kXYfTGr@=iaN2;YX{VpQT_1nxF>7(H6fD20Kjf zkNcdGCGUaK#+?N3PGqm5nXM(Lj{0p~RPcZkR!~9ieJ-J0i4Tn9lGQ3zqrY<-Cd@D% zd_b)COtBg`n(2Uc*E!~UiVB6J+Bt3i*9n7??r zF5qyP-@=XUwN>LQP1Wh+ne+N~DIm^s+1WsmHE}qsN~P(6 z;G08UQKIz+o}(ws9+S_-FJ=YKT6)QPnTB-SN}tt8HTfi1?BlRc(u&c|m8-G#d$T)} zlQ(=Rmf|wo9@b#8D6IjQJ^*(#gTt?St zYx>r6OO;aX#NH62oH+16?z_kBUj}tqD_m(=*@R&v4nv|Qzr-Bifvi@EnvxD5&7li& zJxF9=EESl8<{CMNQt$mbeJ7PK)gJ4M9OC?fkZx7IQJSfimrK@#Tq(s>o2K5%qzD z{Hv)GYZ&=}KvY7NzPtla<*uD4whesQBl zvZupxA)e2k<(OP6yI>4h!upBzW=#MI;C{iRm<_P~rJZPrPUc8$qco7qzOHatb>S^2 zYL2eD`R3pk5nFeKXZKWNp7n+t6fG;lr&p4mJ_;**1mR+d2PtL_Owqo!jB+-Lzyu+PG@8#c4BTOrR@ zf*j}g_|l{WbKu=xdLOc_ca%n7USXI%K8vK>gDU)mqN8g?-b1j%^b=B9J!OpM;P z1ADlgj7dJP8(Mn%5!S6wb+9eAxc$Q@vjP{qyR*-{lnH52OV zGM9sg2Htx60^qbb9IIzO4}YWJn?d%JZzkL75?t>g!4UrlU)voY|EPI8*7vf$+OyKO zA}$kWATy)EKqAc)>~Y>mjapWP$HV2WF^5Jy4mMW2&E#!$O$Lz}FH}&q*caI}lm)h5 zj4w)UdF+Kl!+$(!!E~7?C9tSo$ zIXJbKDb?sui;A41W{=Cl)a$i0#<02Fo&LC{XLI#cN#OpBcFVH_^VhSpeH{W&e7jnu z+&MA|C;c$aoV~e(uCKfuvy{1psTrN%ZP3G~PE`~)UUw4@c4O3WmQ&iJQddY+uO>U0 z;W~?X8GcU`!^s)UJHlfCHBMw^dv~*JHtHe5*6pu87}6JP z`*Ti_0+WyeA!=WY+>^iM536C+GM`xl_!|8Pyyj)|;4Tu0h zKTX2fO=dx7@TKOiXPp5M!|ng7O)tz3G)N5+H;UxqfheIPuFCu+u4 z^Zt5DN{uBgr0|5Kk+@KDl74`rhJJ zKqwcU@qsP^?ak`sCapZJj*OdAaYY-QhWsz7#8T-YE9`=MU^`pY?DBn(jbqfc)FtZK z=s!zZuW$)egiDFNaUv7gZQIk~ zmxC1RD|%)9L+i!tK%S$GMbi*G-Rx^hcOBzr3kC1ZK~y}w+pfNn*}+$?XR%+$mv!(} z7obM`Pwiz=EZ!rwBaU~i{qa8yNxnJ|6AApd6U@EW7ENg!LD*R+E}%Gw{AuP1b<53g z?|7v5oS}s3sk?H-eQ$inqSBX6j*GNdPnI7yw8;~1@v7n$%y+7cgQT++ZzAW2bQOHa zX$6bDdq#>58mTMYGMsUtsT20;(>>`7!cPkOBh9O7%R3IlX)wy=FD0`T-&VT%@YIEJM3RS0WvL zt{(gyoEHD`mwLN_atMx8+F1#%Ks+nePC4dPnNnSY*VlpUZL&pm6#6*~{3>d$l&)ZH z2H9q9_mX`~v!jg8wu#E0jiKd%507mOL?MmbGuAg<(UcE~$BUuz%}Lnf+O(a;MWq?9 zFTb@-&MqB$)YL8Eu~W+!#rhgvw5BA3t^$4M+1@2(x{KtJd$D;wcHBPl#z(xmr+jZ~ z#h*#q$Kz4M)%!jg0iLP1Lr}UWv&KM zwgMG%Qr(fX14ZSQlj@+IOl8f>*nEk}TK2P=53zI#$qnO!($JcsbMMK^`mPDcpgPK7 z^W}D?l7;DEjGR+wpUB&$n?1uNZ!Xf)^;D_r)%ocg^UB@}!vp&_%PK8+^QQ@#tv+w_ zXD=Kdj*gDL4&mPG1+%E!*4@7MQwa=i1oma3JUqKF*{4j3;QB&<9;W%d7fS27rea{3 zU_fEQ%HE*4_0C{+rGEj~O5)SX?_CRsj+iM7(eUpDLbQt1L?KNpd9V;Yc)PNCBZ>XCCbeL;3tba*g`L zP*C2dYDSsO;5F$NIhP$~QP%bDA^suXOJNhw--$P~n)=ovPHJp92`f@Dd%P(d*n~?T zT+?W0^-n#aJgc{TY#hc^k~6^RcADs5Pfh-Eq2iK1yQ4J~LG312I6J_GYB~r{PsWpf z!E8G}*|8OACW10{tka#)bLpE*tDV(?BE0gA5)<7#{J=(#=4O? z`4>qHw;q_wH=`Byq^Lc>v-AJ4g=eQ0rEaXO*h6Nk`HwxULcWuK6_|QtOVU0kj~0hp zFl6xVk*UC)==(wjFI&{PK8ek#zpYWsRFSqP?}N_f@vo@RiSIMwUPOmL0$A#kPHYxSCDpEhazi zN1<&l*Du;8%`Ma>Ek*0+Y~>x83-j|o0ats6&N1@Mos|}HHXA(4n~THDh;GQ6p}DE| zae9}`4UTDH#R*Tg*2A}s`PMD%ywP4kRQ(QSIpd$kl-0)P%OGBjP;y3W<`DWO3zgXC z^?{XX{ax9DZHoa0BhD<@Ed1EPpP$uo7W2^~Wf;s+)zC0C3q3S-r{#vNywJJMh(=nI zjkbHbXme|Rllr*51!3wvXyu?B@tH0Qv#-=?B&)4MrPOHM{|Rg0ZubWRw?YHv8YQ+a zVnJvJwjflIb=Le_n>Yl4KNkLTc@7`{@ZXIE*;;(B#5}jqa_IPIIAkAQZ*G{-y?pR2 z^CJflmU8PQ$87W|)yUGv(cx;RK#K)OWk9krT7|FF0i}z7T;zRxysyS=iLVyzT;c@J zJFCkL7TPHPG=1-N!)82aKdY#y6oWbI+>GU7kQH@rREr^3lp}=p{oTpg)5^Z&)l>eQ z-U`r(d^P4k=-%rqDvwifuuQXkvRVq2WD7=itwnto*UITkqL^P0NyGBmaz$)pW?CJS zXxWM#4s?r0)~1=$-|4VmKPCZd*g@m~KRk3m z_GwFbvM0_nsEGG&f-#-esIh}Qn)-ef^i8X-3-6&3^ zhw}qG>88IetCuPt&665{U9E200T$O#hy730q%{LYoI8{GR-cY@g5H z!!fS_ZYN)EJz50vUT)rY`Q(2)Ue)~SR&tUT_8?t1p!@&s76>-I999ol6Ss*XvEl{0 zA;|I4Wav)@GkEd0Him>CN?Q3Z3M_{rl2>8Wle8!Zi;LG6zhd+L*h?1hO;V?iXSLtA z=a{OLG`cbA-WY+qbM_M}ta`tPCadq4Gl3&FU&rBjTa3@n_1Nx^%ZV%T*7?=@99Mtk zCve!}65TkJ21iy3Gk4;TbyXadbS3NTg!OxWu8r!&`)s(}QE)}E)Oq|+7jq!@PJd@q z*TzngfTu;$<(jZwXUMBJRfG8BfPTm%v*o-Ahm_w;&h>CWcKx0X;4K!P#ZL=(2djmL zAHXp?;$hK6fspLGMb1mD73Di;UY_ICvIy$B&GogFDtoW-`5f(PlN;n4jDd6elV^C7 zRASzlivtoMfKV!~VmMcP73GUICk?6m@ZAT*$+~hfQaCEC(LS{8)z%eXk1~R{Gsskb zDPze5^x%P4=k(*r>VXIJsVOme)=F^b9ZEgjlr12o1FJ^?pb;)q_Qb*MRs)L8*ZXJ# zy!5#oci~Ws&YTcuK()h`&%_O^K;dM$^E0xOhz_K&U>tp*24dZy|BZM5Z(!T?7Xjk| zStz2!(#3b-g*ZUm`?r|)pYiS=@%z8V@U>}v3Oukp;M2fUh_WRR+j#jiy#Hqq_T zx{e#O0eNKZS=_=OP-tjqoL9dwh@VVDEH6*@KyI7*c1ENgd+lUx&1Yw4`=OdXUzXS7 zD+cj1wUjsEyaZTC3*`YOSk~JRpwfVo5amP#T7Q^M4;9 z7|2XK(3%{nB>IW|e?g!{N)Oh>$d&r#Ec~gJ{+@8i{|MmlAwB82Y5z6u&)a}PDh3(UiKt3A&J85;ve}E9#5|Fu;PkVl;1V1tR10Z=IJJa*yrp;97 zKS0P1q~mg->inXw|C(TOPGE)PEj33p{sF>&N#I`+`2Us*1YX~I#XVWkADbKXCh6u& zB7T2MO<#AS)9WG0^40aFOpVEt3uQxxdL~m=+`$hK);fRLI)U5(Pa24&X}9{FC&BCF zZ1eh3hB*dZ4fpcbQR;4j8y!y0Z#s_`)0{gupL-W~#p$JUMu%R{*;Nz#+L%AsK^G^m zxeKR^?YMv6+_bkU4a@nzF{EY{G`@g#_2wyX`s=cv7$sUrPAO=lmoLqT#F*t`9-fgc zch|>Jl?|n16ZU!E)-d{3p)}hx?*WWtMnJ1$u zcS#=2!aQ!g*teV!J+O2MBcZ*p3Avm^jj_L4nL;tRs$1H6u;;R^_*Z79%p?aG3?U%| za&nq*CE2xjL3KtQRL}jo7RJq?xLgoQ5W%WEeER%Z-er5*5N(@{?$IjWEz8f3ZAe!U z@-W?Ci|dwL&*6Bfvq3f-i+jTg+y?GSA>96>e*Bv0k`^dVTj>)jH9-K2qfeGo3h5e4 zO9;RC*wvr0B7G0Uv@QP=noEFJZX%l6su`l&P)1f>EiIcf`it^u(wZ1YxAElIU|E#O z@d44p2#q>>#b@CNg!DZm!ez&ZZq*Q+B@h`a)$~nJ^mM(9 zuHMo^!Q4Y1Z#A2d5wB%y$t6sy3H%G^(FGsRdBd|9y80`a*GKt|fv7|0=5D(a+7YG{ z;0VO2JUsD&=j<|3l6mg(iJzlqGxyo8mW=BOK|A!H-2R&=KqAfJWyC00wLhQ-u`d&R zBUohtJDfTxU;C(Av`1YR%8?q4H?e(SnXCVT);eTwcwmvqoeb*26J|I$VqLl&_1W%$ z{fsethSR|1_%ugGOQw$7eZ7OjgV)ZG;WFXXWvMRd&m(uVh&)Doo*yPcPh#LrNXq2JfSgsW&G@KRx*s$yqwi0QdyPpR`}dLeb1^n0k|o>2qMyO)!Q^?uG#$l1b|H*`Zq@LK>xTu%p& zz}`+F)PAG4@Jq^;V^He0NM*<=3%Le==^vHAyi~pZ1c-AL;3}>h%!YDJ2oN{aEvNy{ zfA2fwHOSUz%KC8sX^j~_WuJwATbxw8-3bDfX2?uuUMOukg|f5?tgynZlNN{@o&!CbmQq1wDV8o4{QiH)XrgDP+9 zaewf|Ppu{p8CVkhHxXwz#*eSqxM#;)5+wqG5yJ0>-f<{g{(d) zatYeXJD0BGri5^*!OPhcM^&hMv7W7!^q(_v1>}Qlmyq`|{l}>oNBkP)9w`mnlO9S+KDY>_e!UGcqXdgRs|p@b=4zH1E!r(Ux1QJTiXGnRIxkpd zFC_vYgb%mx(J!JjWK>yfFDUaN*!q|=6x8;U_k6!#{Nk~n0F6QDmpVk}PLTcxXOsyYmJyQO0zH7w5c-z0zB<+&cA+)y@kxmH8?cDE;QOCZy=sU2&MGQqs zQj5;qg8HAwv!sf!Rri+Na$pPyP(^9+{T%CVc)z)x-jw#7H?TsrF#Z>mMr44a<+sq+ zH?lx|xSc`5(lX1J56x1EmIQL|{ZU%36#_3OAETa1Z&<^p%?s`&TtXg(6nY5ncRhZ4 zu>9H)PlkEQqQj|KR4NjZy)CM@)JvAP(%n1g@}P`DQo@hI+96p5XCz{Nb1a(D)_ z#rooG@&4l^b68iiGe@_Wu`>}wqf3rHB_TT+CI z{bRe~dxCZElS{!b!mx2*>YAH42wXp0M217n65AnIqfDum3ZMnQ14%Ej1}2q11TY{J z^#CL2w}T+j_vlH*Ze|*#JUv|RhUEaSqk%a2Cuj$bJ5syRWF1+FrtjD**JEFvkB(W5 zc%Qc<&yEO(TF(eEXd2KG^oaE#9p)9AM0PC`~bp{T@&zBL5mFx4*&0j9tJWKB`# zfB$8OxB!IeYV;`#38e|p2u@JGwqc##ZH;K1eAwnN9GpSY^I>D!)`*??*^OfqmHmyQ zDW%^ugMTwCsIsGx1mNR|+Wv1}wu(RNXu&!)etJ@o&}Te-XSR=xmN)tXO#8;^QbP`jLtnnUqf9IRdZaV z2vxZpj>y|IItp-1b;{al%9R&Uz>%_N#cdRCe-(JlSQH{*v3aR1<{M|TnC@U7o-hya zXb?Aed|bk!Q$|%Woz1zhT5EtRW*+a^(Vx7517J!z!@Gbn^BmZow(Htd$cbpf7z0+y zZzUOtP-M<4Pz=DvaT1S2H;fTp4Co>U`Kc017kNwtMwL>gx;%Y} zPLba{2HR+yJLO|$+m5y8W-U-=T2?7n9U7UKRZSzldpNsi603(#Yn(V99MBM6vc=Fj zbS0*;DQ+a&&y?58hnde;XJ>Hp>&{WUk*&|tA~hoQegz~q>;|>kvMD&6rA9*~n4E{i zV(PbEJI|y0O@OMAf9b6B?|=|1C&e}Z>l((4SSbcFauK`7`RWNYG zF?8Bwnn5Y@NvxxU@C_^qXGs?lIsfMoMz|vYr2h_G_3c0?Kyw3=#;R@3D(`Dr#iw;u z-DIXYAT-j+4MaW-ALM$PqsN)-suN+y5z&2f6rPGerf8Zh|At}4s`!khFKd8balKq_ zE=7%avkxS%uRc?dFkG`cQBZTGx9c=$S`H~t?UqnFLES+w&3=!+qTl$Inb79E(0^#& z|DZeRz^QFqE^J1!JX=^?mAGwcc0kgv`5Hi)FF*SvN3*u$(QL%WKqT4}(#0RKXJ}N| zS*XYOFK%1}8DtpDgAYh9Y($rPaYy9qz4=}s4xlwrHy`ASjYzR8NQ*e5@%&W>Rr2s_ z?sUbsrdoYWZ-G(~UQ9K|`!bm}H^rBVfB4+;b7KVD0Q=&qC2HaxnzMF5t2moGS459+ zpdZ=*s{MJlF^%)uxccfvvXAFQ$eEkQ)=;}RG+5dHi$j!1^e8>Q1-hS&Oyhau+Ke53 zR@ph-{xX%7GA-}V&XG_ie^>z07hyaKz@b7BsWA@gl>50xiEJ5Z>Lp*GQ*}bD?r2h2 zQ2#4HpMHj6alOKXUhb9aj(9mHPXluE%XU9dKUwZgcO-niJP@d=T5kM4s|~lNqBnNW zT;Y0Qut}27qJawb%ZYOO<47r=_sgx{oe`~$D70t;hTHhv`HB14J!<4)RZ(p=xar-o z5$-Ns!>bk{gHn#c`>VZ4gF&VOBtLbT-{?LN3P`PiGh;Q>->pFM_W^=n6BBybnhsK1H6;-7=HP0e#n_(fYCJcs0jRFa47=@SFc!%=lGIJ zFBRj#IBD0*g7V6=q6BW}FhlBAe+#3giFbah10~sic}x-khHd;Z8~1mfD$e%w%j94x z*iES>xG0}D`ogj6i^=C);K;;A^iD=KRXp3ElxeFL<;*dU>@S7+w-pHjHUn)T{U1sz zy&k$6K0;k~J>Gp#MQAt3{eCV9Syy3b=tcRm?nZA~`SBb#g^ZEK@jXE+A>-5v%ki?m zIK!e90M2euSuyeGzrg)@+d2rm;5RF2NA*(}{AG5q=>OmJa6^ZLbaP`Fqt*x)OFg(MPF3LS^qTCM&ab(E9U-CD8Pr>hq9 zl^n#BNd^;1a(Pvmizu_Q^edJU?OXR>fUGv>+e<|TtjwrB30e`w5w}N^6WWw6fg|2I zl@z1J%IOU^)f1jPptG{umOha}h$A5Bmj_4PJ9TSu-!pbYfMeZgSOoNP0e`(X)Pb`G zLS)g6HU6vOk5_Gw11m5C|JvqfFZ+xD(cxs>{hMxqR{&Fo;(vzwt!ZE*78dm2%X5Oi zg@^#KmN5RlOL{&O6htFG<*UDk2W=qz?~x?vdJAw1zHkhN|3?3JR01ok{~mj^e^LB* z75^pFzuU(D?#2J#*iGO9$#ZeC5WiDhp=me6=>(JZA;`ieJC#GtsWI=kNvv3kr-ze2|>(7;a~4Mg_G}nB0osR76AS#hvv0Lx*rQ|5{Pg8 ziFJ#IztPm*eX&)aE8Q1=Vb+0PhzZ2VR+^Il%L5JTP~p7}+^B5%{v$rFjpO`;4xKWD ztS?{s>;$R0`}U(|57kRV%eCmkgb+&Vqt4@Y{Ky;L?N#%8P&L*pm+g_g=g*7~9PMj* zx?kfx`LbcUdKsYzPAFs>WeMjm*bx^37SGd~j;}xD(R;l>8Q}D->&3$7VRU=8V8Po- zZ<=-*Ne=SdAe<75!s9n!XIo1(LlejqzH}9H^?muR^3^9uOZV*3q-7H5Y??|rHH5Yz z%dgdo@+eLt{<0icOX`5`Df$5Q4zSl+-{Tw-iq$|RiKEnfPG3YI+Eb4^!}3GSdro7Y zOPEqM=<$Rtdk?pBY3tm$HD2r;I62C4+AR@_B|5&%ZBt#ClBzpf8e>ncmQsJxy!M>h zL>%(Xb0+$)16pta!dq9(9|e$c-=?RjYi8UG&odfvpGVJgd{c!R)ii+~Bvz-3X{0?Z z_GMaOt50W&{1_!Hsva4!|9A? zl(Rdh(+C-|xw8TH1**AIML!Ioo?T+VgBzJ}t}pP+`OK690&1n-8W-KQuO`S?r9W zOUKex|5NU_zP|-{0^h;*5D8t^0T z=l+RsIn04>orY)MeKl)ly!K{mE6x255B)wTK!hKPl$94>%6r*B z$YQtt-nUAR`5sBsf@8&z?K29EdkCQhUa~a5<;f(_PL7LVdjiqJrozJBof&_X4z58N zf&-HmsY|o&yzQ5tq|-vT{fLXuo@}fPCJ8V#pSJULY|k_V{#@!G=ss;l1I#u>+ovdK zUW9;WCws9*2FHR#OjL2E%>PYA1l}I(#vOFsyB}en!#ON!NL{5a$tX}i=sr+vUd~Gz z$r(}IL-W{aVR)N;!`xxIF7hCE5wFboymc&Tz`@LmEUtCX@3^8C_#2%?_~#%2+p)rD zDfM-Pe~L1#`vAs_Q`|Z%{P6%N@;0K5@F(Ti(9}Ozq3ekH*S*}SBpEF;$hx0v1F7QL z$d=PV_0&WYv(pSWNSJv;+ciTKwk~sWW#N)LREh5%n4h2jTzc!WjqVy;tD`UbAG`#W z88Bz)_1g&Pzf}M$Y)#j4{E)t&^~~Z?g4){@hu~uUCc*2Ca|Hn#`gNu}4N=)tiJ55= zHKs_>M@k|g@u?ftN-Ar^hlS_^Gj{2@g=l_vBEk zdhX}G&;2={dpXZ@RCE+?E#LzI_!97@o=|k&}++5URaoEn;Bf zk@VVVP=%lY{H#1G!Y1z$*R9YuJ*>cH4QF!?S6w`&9i2kx%O1|yguc&irj}ao zKA{i&%EhH^b8A4n$bgky4ocTmj#vY2)$R2Gr~$I);f6bey0xRD>N$-plUYMl{U*}6 zj1C)q|qaMo&R z%Kd&&S6wtaBcq)39rGz}HNN?_P+2l3yyQ7&cct7wh?}BJK3df7$#|HVaeskpnNenN zXHW@vljSUU{Y72fKzO@-phQB{URd*s@jdryAFssEs)daLO;wCU)2RFF0ttCd@4?Sn z$W|dy%OMf17@YYbD1N2l^QEKB2bSYMR=zySINThkQmCfm8N=V`R_Z!l7p4ZGnYPZ7 z{Ouv}d-8*bYioVzk~#X@Wv;6;9){Xco+T1_FG|N?a~pUeGkq}y0pYaIKgqlxm>w6`o_W|JX97w1OUw;={KH;&_mGVtv;f6 zE8TbS(xh9$KxwPW=5mI*xtX;F-_3_-jye~IXNx!ZGfyu`GRz{youpy5E3EG3^pKUO zBk{=xquizv9F9axO-&`IIqoN$OiChP$r<0bvXoS#1|WDjHxEe|1)$(6t;w#EEL+BU z4g2SF58RQ2*|f$TBod@NUo@L&N@A!ZGsV4K)MSY+r&o2Ott)=>auqX`4oq zLBx5n1~!b_d7}%iRkv#FdOa&?yFIPNgndDJ#OiaBfBn&>Msl>@`uXW}-+oo+g z{-zQ6r}C+QNc6|_m7dBM1En^H;RJdV+W{Q0^R}c!d!|{nZ+0OIvT&k_$$9DJ(|VXW zzS!3@q}ahU<34f`ksK*8Gqr*h4Ly~VG%^aO_n?WCs^`DZ5!AvDGg9qplSjsyS(br9}YwoE&h7iw&~zH10$J|+Aqho4YW zN+%?s`FC#5sn)`}?DVaB16?{=h3(b{;b+^XWQ^$O0-+YiDZ4Q=uR5^oyOQhot@*Ac2ptP|hTFul2G zMTMys4vx#*AK`i#N#x!J0K@_Sq9^rlkfe$08$}<$@pAH?#E)1_cZUjk9i7=IEuB}b z8kwt^eD2~53@3Z)eu~^9;6ZTsPA+!(S;@Y`*!uY8if7!#?3m4L_mMRP@4xh6CRP|3 zv0yffLenV+_%-mu3}`{TS{%T6e&o8?`8_RJW1)qTOo;ZPlst^>c^vCjZS<-Xd}cS) z_=;(JE^qO8qEpeSe8z-6X}fMkE^=j12#|s;Bv|l~q%!HF)KKt?mp@D$H5q=sa-pcm zTCWZhPEdXNT&l`ywjCkN077T0J2gj5cKKRat+9TV$%OhJrcv6w0s0*Jmd{V}|L9-m z=&@R#O1r`>Uv-nJ90rr)KI0ncL*Leo4Gi$l67R-|IPu28>idbmd6XpYB|iuoKQ@J= zNNRxvsKcJ0wY9QpH2OWM@GWByY`fTy0nX)^VX&EAA}4}L^v11Ve0przPeGp$1!Apw zQx3|Sv~Z9cx}U-Tkd}cA;=iu$PA2Ls7?mi^ef?+3z86pPz%1pv{Q({_d`o~)_zO5Q z*(EX`IndKWoR{YQtNPfJY!7m992HLZPp|H2J^@O-nW>>O|6B4XSXWp&tSQ;U_QV2+ zG-}EZ_O_LY|8L3P?*K;NK-ZFEY4523Nl74kNb-oYYZo(f zyMPdI9M)r<9p{;cShIh<8BbGzF3;IIA+y?%jrI-ShF!c8-!4r2N>dqYdg>7J#LUj( z`T2yBsL{QWQlI$cnjP1?`I~O%^UeI|)}mH$fLO8 z5sJchHJ`;{3mDlEy>7mAunw6ZlimqE_Z+D3V=Zag_X4eP>pzeycco#o-`R-k-oGBR z4;8}&IPJ02W0{`@$Tv|rP-5v}9}*;M@;=s8L$dI3kgdP22LxIRGn?GRDYnIWPh6tL zo`~a|dc38_m!!|8l$!g`V+}_u1D(J%N~hXMP-opNcvEEKh+Z4b4RxqzDk4jr1s#B0 z*PLxrb^*#`hl&DU)pW|{UkqlOti4b(;?gn{+RypVOs!+zl7)Y`==SBy;>&g;KK!sO zH=T!9igwlvE^iUF zwp4x>Qf0s#ytF=m6mlwD+7RXbc-3JhZmn~?OUSYI^feNhmAdjnB-Bi zhp}TlA13GCqSEk)8Tof==!nFNeZ+WaLzx9PX~_hQ82?I>I}%P>8K#3WhpYW;ZB--f z4WrnqFX2RvL@7BZMd$itc=4TevvJY5y%ks+xjPvG?RZo4Gv@B zE!y6ktxC{{r-na!q$xtt1(GUcX)e5e;`$G{1!qF}M?6%!^X~S|*P+sB^*L2R9i;q3 zr_MUVEaL>3U8JC*yMZ!#8vpRlB%UZQaYqR zH-qDoQ-^?PP3{3pniNa$F~GhF*&6CSJlV5djgg@Z zc&8o!V=nDa#&x2p->RfiR`0B!w=a>Bjh$=Lj2z1qoEi-}9q@iC0E z0V+~aUI^9fb*aa!J{0UvRv*+w$w5Gz=fWnSy_JDRDr<^dO02g};%WEGCjTi1N|yD3y>a6=t#vVJ_ed*OBxpHhfW#)-QCPxdPfhLwcYy z0pihZD=TU#qGTIjr%uRVr(5LFV*% zok9O#kJE?q!S5VjRQrK;VNCPECRmQ7%@8`wUb%3&3Bk+*mWyq!Fx0d zuQiJh-7@Z8U9BpUGVY%bkvydGQMP@F;X-_+Ug+h7Kv~*8y#fE2v`q)%;$&xm>q2II z5zRFeW_ts7M^~3cFUyMgRZ{lD-C2`|fjvE66HMJ(lIqkq25$~-j0qrfpFT3ZEPit^ zAwJ5d>#G^gVZ9%ma&t(v-8$e-oJvpLdt09cPi@7JYmJ4+8~bMKxlJBaXH4*fH)XaA zFAeyQ;0?{?#(MQG1w1U6|M59A1e*Y-K_dyi&~kW#Oo!uzqT?zk=;oC6WXNG^wCC8e zp2*Kod;22r+J!EjmWv=MK$X(nz8h<|{GrpVd7va$f*um0e+11DATVZ`>|0+OT#+cF zlzK8mJ0&1<8>Uc~i?@w+*ysg^j3M+ySPh%Y5*~Akrcw~!FrwPuvaAdsi?{a$GO9k` z%We)Sf+m_^sv;-pQRn$UBrc7R`mTa^9z+P!L)7!_OI=k&&Kfc>*IvT?lNB5sY`%$W z*HikmWpO6j1e>5uKa=d&=c{XJ`HdtGUU8-3L;)x+h;#h~g%l>?*`iUZ`fR_AmJ z+V(=Q&kgxO{p%5?i8}yg0;ZOBdd3L)`p;!W2xbu;{*YQu2!#rXj@*?>Rd-Cd5h<2B zGnoOad_df~R-54BRPNEFRh=vCFLu^HOopr1FTK#-iZ8{YP=QU|XvL$_?ZkQ1bWe6X z9@hc7I-l>vzG|%Dd$|iq!3?W19w9OFP^cyAW2;REO)rm^{xqQ(+w=P0AfnMxeec^5RbjYOc+by3}X!(W@nW z_|v68$@`I8K|E0Tokn7*r@Fiu?p8Wu>67r9$PMtw! ze2amk2OpH3d#j^+LNwc^cyu>|TgGFBS`+8oTJlNW_foQ2Rj z4|s^5{xx|Qz#9XM-?+jq>`Y#8iTacIAeYUhj@ZoL&vKMRjz+z~UNI+?R*W zwQr4Pcvy+f`E@=w8xQj0Cw112k!d}(SzkI0U3F!%mC~Zomo0?$GgZU0NLN`|;zVrD zrauf+d8?1>E=Qa$#8?&y#}V(tTShxWxAGwUYc5K+rq?U94-r-b8O%MFv#h#KHps49 z^}?!H%kGyp@AW||I6)bix+$#pQ*$G#Ba8fYSdVYG6INc{@D7FEr^IT%1bY^fo?450 zRuXh=wKeuoFW$Y|!CL2G0Vr>>dhfkU1lLqawSKk+C;y|5H+7R`UBsdyu0Eh$V=-|b z>%1TS1pmPGtTp89)qMVSAukPk@?!mW=l|yd$}xFUEf*Z_8o) z47S(Tcxv&T9cgiJm4)h*JHpnkc?pPG0;Iso4Ttggl~RJ91r>-@o^#{6J17Q`vy&q7 z0IoYAi9_h(TZD@Bq!hXFpG|NFfujf-N&Sb1E3ToBa6~ zprkrR1G2HXPP3$4vZ1~mz13N?`i(G9!K$sIc98=d$-<{6ay3#2VmJ^K#~Vi8~f literal 0 HcmV?d00001 diff --git a/Sparse Table/Images/recursion.png b/Sparse Table/Images/recursion.png new file mode 100644 index 0000000000000000000000000000000000000000..6928e372cd91d89baee0f7f913a951610def165a GIT binary patch literal 78302 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 z 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 E0G7IR?EnA( literal 0 HcmV?d00001 diff --git a/Sparse Table/Images/recursion_examples.png b/Sparse Table/Images/recursion_examples.png new file mode 100644 index 0000000000000000000000000000000000000000..737b95bf98062013a062852644f422deb22e4ab2 GIT binary patch literal 120693 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 &Sk;n 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

  • MsS%*de4F$i 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 T#dl#?wN$E#8mF^Qn)>_;z7a~d literal 0 HcmV?d00001 diff --git a/Sparse Table/Images/structure_examples.png b/Sparse Table/Images/structure_examples.png new file mode 100644 index 0000000000000000000000000000000000000000..69fd57218d86589ade8207b92755707549365b76 GIT binary patch literal 157486 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 s=l`d;|E|RUQ`~>o$p2S8?)dSk*7cJ5Uha[\*]. The function can be: min, max, [gcd](../GCD/), boolean AND, boolean OR ... + +*[\*] where **f** is also "idempotent". Don't worry, I'll explain this in a moment.* + +Our task is as follows: + +- Given two indices **l** and **r**, answer a **query** for the interval `[l, r)` by performing `f(a[l], a[l + 1], a[l + 2], ..., a[r - 1])`; taking all the elements in the range and applying **f** to them +- There will be a *huge* number **Q** of these queries to answer ... so we should be able to answer each query *quickly*! + +For example, if we have an array of numbers: + +```swift +var a = [ 20, 3, -1, 101, 14, 29, 5, 61, 99 ] +``` +and our function **f** is the *min* function. + +Then we may be given a query for interval `[3, 8)`. That means we look at the elements: + +``` +101, 14, 29, 5, 61 +``` + +because these are the elements of **a** with indices +that lie in our range `[3, 8)` – elements from index 3 up to, but not including, index 8. +We then we pass all of these numbers into the min function, +which takes the minimum. The answer to the query is `5`, because that's the result of `min(101, 14, 29, 5, 61)`. + +Imagine we have millions of these queries to process. +> - *Query 1*: Find minimum of all elements between 2 and 5 +> - *Query 2*: Find minimum of all elements between 3 and 9 +> - ... +> - *Query 1000000*: Find minimum of all elements between 1 and 4 + +And our array is very large. Here, let's say **Q** = 1000000 and **N** = 500000. Both numbers are *huge*. We want to make sure that we can answer each query really quickly, or else the number of queries will overwhelm us! + +*So that's the problem.* + +The naive solution to this problem is to perform a `for` loop +to compute the answer for each query. However, for very large **Q** and very large **N** this +will be too slow. We can speed up the time to compute the answer by using a data structure called +a **Sparse Table**. You'll notice that so far, our problem is exactly the same as that of the [Segment Tree](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree) +(assuming you're familiar). However! ... there's one crucial difference between Segment Trees +and Sparse Tables ... and it concerns our choice of **f**. + + +### A small gotcha ... Idempotency + +Suppose we wanted to find the answer to **`[A, D)`**. +And we already know the answer to two ranges **`[A, B)`** and **`[C, D)`**. +And importantly here, ... *these ranges overlap*!! We have **C** < **B**. + +![Overlapping ranges](Images/idempotency.png) + + +So what? Well, for **f** = minimum function, we can take our answers for **`[A, B)`** and **`[C, D)`** +and combine them! +We can just take the minimum of the two answers: `result = min(x1, x2)` ... *voilà!*, we have the minimum for **`[A, D)`**. +It didn't matter that the intervals overlap - we still found the correct minimum. +But now suppose **f** is the addition operation `+`. Ok, so now we're taking sums over ranges. +If we tried the same approach again, it wouldn't work. That is, +if we took our answers for **`[A, B)`** and **`[C, D)`** +and added them together we'd get a wrong answer for **`[A, D)`**. +*Why?* Well, we'd have counted some elements twice because of the overlap. + +Later, we'll see that in order to answer queries, Sparse Tables use this very technique. +They combine answers in the same way as shown above. Unfortunately this means +we have to exclude certain binary operators from being **f**, including `+`, `*`, XOR, ... +because they don't work with this technique. +In order to get the best speed of a Sparse Table, +we need to make sure that the **f** we're using is an **[idempotent](https://en.wikipedia.org/wiki/Idempotence)** binary operator. +Mathematically, these are operators that satisfy `f(x, x) = x` for all possible **x** that could be in **a**. +Practically speaking, these are the only operators that work; allowing us to combine answers from overlapping ranges. +Examples of idempotent **f**'s are min, max, gcd, boolean AND, boolean OR, bitwise AND and bitwise OR. +Note that for Segment Trees, **f** does not have to be idempotent. That's the crucial difference between +Segment Trees and Sparse Tables. + +*Phew!* Now that we've got that out of the way, let's dive in! + +## Structure of a Sparse Table + +Let's use **f** = min and use the array: + +```swift +var a = [ 10, 6, 5, -7, 9, -8, 2, 4, 20 ] +``` + +In this case, the Sparse Table looks like this: + +![Sparse Table](Images/structure.png) + +What's going on here? There seems to be loads of intervals. +*Correct!* Sparse tables are preloaded with the answers for lots of queries `[l, r)`. +Here's the idea. Before we process our **Q** queries, we'll pre-populate our Sparse Table `table` +with answers to loads of queries; +making it act a bit like a *cache*. When we come to answer one of our queries, we can break the query +down into smaller "sub-queries", each having an answer that's already in the cache. +We lookup the cached answers for the sub-queries in +`table` in constant time +and combine the answers together +to give the overall answer to the original query in speedy time. + +The problem is, we can't store the answers for every single possible query that we could ever have ... +or else our table would be too big! After all, our Sparse Table needs to be *sparse*. So what do we do? +We only pick the "best" intervals to store answers for. And as it turns out, the "best" intervals are those +that have a **width that is a power of two**! + +For example, the answer for the query `[10, 18)` is in our table +because the interval width: `18 - 10 = 8 = 2**3` is a power of two (`**` is the [exponentiation operator](https://en.wikipedia.org/wiki/Exponentiation)). +Also, the answer for `[15, 31)` is in our table because its width: `31 - 15 = 16 = 2**4` is again a power of two. +However, the answer for `[1, 6)` is *not* in there because the interval's width: `6 - 1 = 5` is *not* a power of two. +Consequently, we don't store answers for *all* possible intervals that fit inside **a** – +only the ones with a width that is a power of two. +This is true irrespective of where the interval starts within **a**. +We'll gradually see that this approach works and that relatively speaking, it uses very little space. + +A **Sparse Table** is a table where `table[w][l]` contains the answer for `[l, l + 2**w)`. +It has entries `table[w][l]` where: +- **w** tells us our **width** ... the number of elements or the *width* is `2**w` +- **l** tells us the **lower bound** ... it's the starting point of our interval + +Some examples: +- `table[3][0] = -8`: our width is `2**3`, we start at `l = 0` so our query is `[0, 0 + 2**3) = [0, 8)`. + The answer for this query is `min(10, 6, 5, -7, 9, -8, 2, 4, 20) = -8`. +- `table[2][1] = -7`: our width is `2**2`, we start at `l = 1` so our query is `[1, 1 + 2**2) = [1, 5)`. + The answer for this query is `min(6, 5, -7, 9) = -7`. +- `table[1][7] = 4`: our width is `2**1`, we start at `l = 7` so our query is `[7, 7 + 2**1) = [7, 9)`. + The answer for this query is `min(4, 20) = 4`. +- `table[0][8] = 20`: our width is `2**0`, we start at `l = 8` so our query is`[8, 8 + 2**0) = [8, 9)`. + The answer for this query is `min(20) = 20`. + + +![Sparse Table](Images/structure_examples.png) + + +A Sparse Table can be implemented using a [two-dimentional array](../2D%20Array). + +```swift +public class SparseTable { + private var table: [[T]] + + public init(array: [T], function: @escaping (T, T) -> T, defaultT: T) { + table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W) + } + // ... +} +``` + + +## Building a Sparse Table + +To build a Sparse Table, we compute each table entry starting from the bottom-left and moving up towards +the top-right (in accordance with the diagram). +First we'll compute all the intervals for **w** = 0, then compute all the intervals +and for **w** = 1 and so on. We'll continue up until **w** is big enough such that our intervals are can cover at least half the array. +For each **w**, we compute the interval for **l** = 0, 1, 2, 3, ... until we reach **N**. +This is all achieved using a double `for`-`in` loop: + +```swift +for w in 0.. 0)**: We need to find out the answer to `[l, l + 2**w)` for some **l**. +This interval, like all of our intervals in our table has a width that +is a power of two (e.g. 2, 4, 8, 16) ... so we can cut it into two equal halves. + - Our interval with width ``2**w`` is cut into two intervals, each of width ``2**(w - 1)``. + - Because each half has a width that is a power of two, we can look them up in our Sparse Table. + - We combine them together using **f**. + ``` + table[w][l] = f(table[w - 1][l], table[w - 1][l + 2 ** (w - 1)]) + ``` + + +![Sparse Table](Images/recursion.png) + +For example for `a = [ 10, 6, 5, -7, 9, -8, 2, 4, 20 ]` and **f** = *min*: + +- we compute `table[0][2] = 5`. We just had to look at `a[2]` because the range has a width of one. +- we compute `table[1][7] = 4`. We looked at `table[0][7]` and `table[0][8]` and apply **f** to them. +- we compute `table[3][1] = -8`. We looked at `table[2][1]` and `table[2][5]` and apply **f** to them. + + +![Sparse Table](Images/recursion_examples.png) + + + +```swift +public init(array: [T], function: @escaping (T, T) -> T, defaultT: T) { + let N = array.count + let W = Int(ceil(log2(Double(N)))) + table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W) + self.function = function + self.defaultT = defaultT + + for w in 0.. T { + let width = r - l + let W = Int(floor(log2(Double(width)))) + let lo = table[W][l] + let hi = table[W][r - (1 << W)] + return function(lo, hi) + } + ``` + +Finding answers to queries takes **O(1)** time. + +## Analysing Sparse Tables + +- **Query Time** - Both table lookups take constant time. All other operations inside `query` take constant time. +So answering a single query also takes constant time: **O(1)**. But instead of one query we're actually answering **Q** queries, +and we'll need time to built the table before-hand. +Overall time is: **O(NlgN + Q)** to build the table and answer all queries. +The naive approach is to do a for loop for each query. The overall time for the naive approach is: **O(NQ)**. +For very large **Q**, the naive approach will scale poorly. For example if `Q = O(N*N)` +then the naive approach is `O(N*N*N)` where a Sparse Table takes time `O(N*N)`. +- **Space**- The number of possible **w** is **lgN** and the number of possible **i** our table is **N**. So the table +has uses **O(NlgN)** additional space. + +### Comparison with Segment Trees + +- **Pre-processing** - Segment Trees take **O(N)** time to build and use **O(N)** space. Sparse Tables take **O(NlgN)** time to build and use **O(NlgN)** space. +- **Queries** - Segment Tree queries are **O(lgN)** time for any **f** (idempotent or not idempotent). Sparse Table queries are **O(1)** time if **f** is idempotent and are not supported if **f** is not idempotent. [†] +- **Replacing Items** - Segment Trees allow us to efficiently update an element in **a** and update the segment tree in **O(lgN)** time. Sparse Tables do not allow this to be done efficiently. If we were to update an element in **a**, we'd have to rebuild the Sparse Table all over again in **O(NlgN)** time. + + +[†] *Although technically, it's possible to rewrite the `query` method +to add support for non-idempotent functions. But in doing so, we'd bump up the time up from O(1) to O(lgn), +completely defeating the original purpose of Sparse Tables - supporting lightening quick queries. +In such a case, we'd be better off using a Segment Tree (or a Fenwick Tree)* + +## Summary + +That's it! See the playground for more examples involving Sparse Tables. +You'll see examples for: min, max, gcd, boolean operators and logical operators. + +### See also + +- [Segment Trees (Swift Algorithm Club)](https://github.com/raywenderlich/swift-algorithm-club/tree/master/Segment%20Tree) +- [How to write O(lgn) time query function to support non-idempontent functions (GeeksForGeeks)](https://www.geeksforgeeks.org/range-sum-query-using-sparse-table/) +- [Fenwick Trees / Binary Indexed Trees (TopCoder)](https://www.topcoder.com/community/data-science/data-science-tutorials/binary-indexed-trees/) +- [Semilattice (Wikipedia)](https://en.wikipedia.org/wiki/Semilattice) + +*Written for Swift Algorithm Club by [James Lawson](https://github.com/jameslawson)* + diff --git a/Sparse Table/Sparse Table.playground/Contents.swift b/Sparse Table/Sparse Table.playground/Contents.swift new file mode 100644 index 000000000..4eae8a6c2 --- /dev/null +++ b/Sparse Table/Sparse Table.playground/Contents.swift @@ -0,0 +1,144 @@ +// +// Swift Algorithm Club - Sparse Table +// Author: James Lawson (github.com/jameslawson) +// + +import Foundation + +// Last checked with Xcode Version 9.2 (9C40b) +#if swift(>=4.0) +print("Hello, Swift 4!") +#endif + +public class SparseTable { + private var defaultT: T + private var table: [[T]] + private var function: (T, T) -> T + + public init(array: [T], function: @escaping (T, T) -> T, defaultT: T) { + let N = array.count + let W = Int(ceil(log2(Double(N)))) + table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W) + self.function = function + self.defaultT = defaultT + + for w in 0.. T { + let width = r - l + let N = table[0].count + if width <= 0 || l >= N { + return defaultT + } + let r = min(N, r) + let W = Int(floor(log2(Double(width)))) + let lo = table[W][l] + let hi = table[W][r - (1 << W)] + return function(lo, hi) + } +} + +print("---------------------------- EXAMPLE 1 -------------------------------------") +// Here we have an array of integers and we're repeatedly +// finding the minimum over various ranges + +let intArray = [1, -11, -7, 3, 2, 4] +let minIntTable = SparseTable(array: intArray, function: min, defaultT: Int.max) +print(minIntTable.query(from: 0, until: 6)) // min(1, 3, -11, 3, 2, 4) = -11 +print(minIntTable.query(from: 3, until: 5)) // min(3, 2) = 2 +print(minIntTable.query(from: 2, until: 6)) // min(-7, 3, 2, 4) = -7 +print(minIntTable.query(from: 0, until: 1)) // min(1) = 1 +print(minIntTable.query(from: 0, until: 0)) // min() = Int.max +print("----------------------------------------------------------------------------\n\n") + + +print("---------------------------- EXAMPLE 2 -------------------------------------") +// Now we have an array of doubles and we're repeatedly +// finding the maximum over various ranges + +let doubleArray = [1.5, 20.0, 3.5, 15.0, 18.0, -10.0, 5.5] +let maxDoubleTable = SparseTable(array: doubleArray, function: max, defaultT: -.infinity) +print(maxDoubleTable.query(from: 0, until: 4)) // max(1.5, 20.0, 3.5, 15.0) = 20.0 +print(maxDoubleTable.query(from: 3, until: 4)) // max(3.5, 15.0) = 15.0 +print(maxDoubleTable.query(from: 4, until: 6)) // max(18.0, -10.0, 5.5) = 18.0 +print(maxDoubleTable.query(from: 1, until: 2)) // max(20.0) = 20.0 +print(maxDoubleTable.query(from: 0, until: 0)) // max() = -inf +print("----------------------------------------------------------------------------\n\n") + + +print("---------------------------- EXAMPLE 3 -------------------------------------") +// An array of booleans and we're repeatedly +// finding the boolean AND over various ranges + +let boolArray = [true, false, true, true, true, false, false] +func and(_ x: Bool, _ y: Bool) -> Bool { return x && y } + +let maxBoolTable = SparseTable(array: boolArray, function: and, defaultT: false) +print(maxBoolTable.query(from: 0, until: 4)) // and(T, F, T, T) = F +print(maxBoolTable.query(from: 2, until: 5)) // and(T, T, T) = T +print(maxBoolTable.query(from: 2, until: 6)) // and(T, T, T, F) = F +print(maxBoolTable.query(from: 0, until: 1)) // and(T) = T +print(maxBoolTable.query(from: 1, until: 2)) // and(F) = F +print(maxBoolTable.query(from: 0, until: 0)) // and() = F +print("----------------------------------------------------------------------------\n\n") + +print("---------------------------- EXAMPLE 4 -------------------------------------") +// An array of positive integers and we're repeatedly finding +// the gcd (greatest common divisor) over various ranges. The gcd operator is +// associative and idempontent so we can use it with sparse tables + +let posIntArray = [7, 2, 3, 4, 6, 5, 25, 75, 100] +func gcd(_ m: Int, _ n: Int) -> Int { + var a = 0 + var b = max(m, n) + var r = min(m, n) + + while r != 0 { + a = b + b = r + r = a % b + } + return b +} + +let gcdTable = SparseTable(array: posIntArray, function: gcd, defaultT: 1) +print(gcdTable.query(from: 0, until: 4)) // gcd(7, 2, 3) = 1 +print(gcdTable.query(from: 3, until: 5)) // gcd(4, 6) = 2 +print(gcdTable.query(from: 5, until: 7)) // gcd(5, 25, 75) = 5 +print(gcdTable.query(from: 6, until: 9)) // gcd(25, 75, 100) = 25 +print(gcdTable.query(from: 3, until: 4)) // gcd(4) = 4 +print(gcdTable.query(from: 0, until: 0)) // gcd() = 1 +print("------------------------------------------------------------------------\n\n") + + + +print("---------------------------- EXAMPLE 5 -------------------------------------") +// An array of nonnegative integers where for each integer we consider its binary representation. +// We're repeatedly finding the binary OR (|) over various ranges. The binary operator is +// associative and idempontent so we can use it with sparse tables + +let binArray = [0b1001, 0b1100, 0b0000, 0b0001, 0b0010, 0b0100, 0b0000, 0b1111] + + +let orTable = SparseTable(array: binArray, function: |, defaultT: 0b0000) +print(String(orTable.query(from: 0, until: 2), radix: 2)) // binary_or(1001, 1100) = 1101 +print(String(orTable.query(from: 3, until: 5), radix: 2)) // binary_or(0001, 0010) = 0011 + +print(String(orTable.query(from: 3, until: 6), radix: 2)) // binary_or(0001, 0010, 0100) = 0111 +print(String(orTable.query(from: 6, until: 8), radix: 2)) // binary_or(0000, 1111) = 1111 +print(String(orTable.query(from: 1, until: 5), radix: 2)) // binary_or(1100, 0000, 0001, 0010) = 1111 +print(String(orTable.query(from: 0, until: 1), radix: 2)) // binary_or(1001) = 1001 +print(String(orTable.query(from: 0, until: 0), radix: 2)) // binary_or() = 0000 +print("----------------------------------------------------------------------------\n\n") diff --git a/Sparse Table/Sparse Table.playground/contents.xcplayground b/Sparse Table/Sparse Table.playground/contents.xcplayground new file mode 100644 index 000000000..5da2641c9 --- /dev/null +++ b/Sparse Table/Sparse Table.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Sparse Table/Sparse Table.playground/playground.xcworkspace/contents.xcworkspacedata b/Sparse Table/Sparse Table.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/Sparse Table/Sparse Table.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + From 7d759ee1a1b2983fb887e514341509842a26a60d Mon Sep 17 00:00:00 2001 From: James Lawson Date: Wed, 28 Mar 2018 19:29:45 +0100 Subject: [PATCH 31/39] Fix typo. Rename varaible from i to l --- Sparse Table/README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sparse Table/README.markdown b/Sparse Table/README.markdown index 701a33f21..31bd5a781 100644 --- a/Sparse Table/README.markdown +++ b/Sparse Table/README.markdown @@ -279,7 +279,7 @@ Overall time is: **O(NlgN + Q)** to build the table and answer all queries. The naive approach is to do a for loop for each query. The overall time for the naive approach is: **O(NQ)**. For very large **Q**, the naive approach will scale poorly. For example if `Q = O(N*N)` then the naive approach is `O(N*N*N)` where a Sparse Table takes time `O(N*N)`. -- **Space**- The number of possible **w** is **lgN** and the number of possible **i** our table is **N**. So the table +- **Space**- The number of possible **w** is **lgN** and the number of possible **l** our table is **N**. So the table has uses **O(NlgN)** additional space. ### Comparison with Segment Trees From 11a5e7cb24279b86da99c8ffcd791c2bbfbe6b58 Mon Sep 17 00:00:00 2001 From: James Lawson Date: Wed, 28 Mar 2018 19:33:16 +0100 Subject: [PATCH 32/39] Fix typo "Idempotent" --- Sparse Table/Sparse Table.playground/Contents.swift | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Sparse Table/Sparse Table.playground/Contents.swift b/Sparse Table/Sparse Table.playground/Contents.swift index 4eae8a6c2..ef83263b0 100644 --- a/Sparse Table/Sparse Table.playground/Contents.swift +++ b/Sparse Table/Sparse Table.playground/Contents.swift @@ -14,14 +14,14 @@ public class SparseTable { private var defaultT: T private var table: [[T]] private var function: (T, T) -> T - + public init(array: [T], function: @escaping (T, T) -> T, defaultT: T) { let N = array.count let W = Int(ceil(log2(Double(N)))) table = [[T]](repeating: [T](repeating: defaultT, count: N), count: W) self.function = function self.defaultT = defaultT - + for w in 0.. { } } } - + public func query(from l: Int, until r: Int) -> T { let width = r - l let N = table[0].count @@ -97,14 +97,14 @@ print("------------------------------------------------------------------------- print("---------------------------- EXAMPLE 4 -------------------------------------") // An array of positive integers and we're repeatedly finding // the gcd (greatest common divisor) over various ranges. The gcd operator is -// associative and idempontent so we can use it with sparse tables +// associative and idempotent so we can use it with sparse tables let posIntArray = [7, 2, 3, 4, 6, 5, 25, 75, 100] func gcd(_ m: Int, _ n: Int) -> Int { var a = 0 var b = max(m, n) var r = min(m, n) - + while r != 0 { a = b b = r @@ -127,7 +127,7 @@ print("------------------------------------------------------------------------\ print("---------------------------- EXAMPLE 5 -------------------------------------") // An array of nonnegative integers where for each integer we consider its binary representation. // We're repeatedly finding the binary OR (|) over various ranges. The binary operator is -// associative and idempontent so we can use it with sparse tables +// associative and idempotent so we can use it with sparse tables let binArray = [0b1001, 0b1100, 0b0000, 0b0001, 0b0010, 0b0100, 0b0000, 0b1111] From eda68c40eba5aef49b3f23b8fccf9bab62eb6e9d Mon Sep 17 00:00:00 2001 From: Stephen Clark Date: Fri, 30 Mar 2018 16:15:25 +0100 Subject: [PATCH 33/39] Convex Hull: Clarified Readme, and small code clarity changes. Began to clarify Convex Hull readme, and code. (Needs more work!!) --- .../Convex Hull.xcodeproj/project.pbxproj | 6 +++--- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ Convex Hull/Convex Hull/View.swift | 12 ++---------- Convex Hull/README.md | 18 ++++++++++++++---- 4 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 Convex Hull/Convex Hull.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Convex Hull/Convex Hull.xcodeproj/project.pbxproj b/Convex Hull/Convex Hull.xcodeproj/project.pbxproj index 651a5bed3..c11cbf4d6 100644 --- a/Convex Hull/Convex Hull.xcodeproj/project.pbxproj +++ b/Convex Hull/Convex Hull.xcodeproj/project.pbxproj @@ -149,7 +149,7 @@ }; 8E6D68B51E59989400161780 = { CreatedOnToolsVersion = 8.2.1; - DevelopmentTeam = 7C4LVS3ZVC; + DevelopmentTeam = 4SQG5NJNPF; ProvisioningStyle = Automatic; }; }; @@ -384,7 +384,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 7C4LVS3ZVC; + DEVELOPMENT_TEAM = 4SQG5NJNPF; INFOPLIST_FILE = "Convex Hull/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "workmoose.Convex-Hull"; @@ -397,7 +397,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = 7C4LVS3ZVC; + DEVELOPMENT_TEAM = 4SQG5NJNPF; INFOPLIST_FILE = "Convex Hull/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "workmoose.Convex-Hull"; diff --git a/Convex Hull/Convex Hull.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Convex Hull/Convex Hull.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/Convex Hull/Convex Hull.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Convex Hull/Convex Hull/View.swift b/Convex Hull/Convex Hull/View.swift index a50cc247a..33d1426c3 100644 --- a/Convex Hull/Convex Hull/View.swift +++ b/Convex Hull/Convex Hull/View.swift @@ -11,20 +11,12 @@ import UIKit class View: UIView { let MAX_POINTS = 100 - var points = [CGPoint]() - var convexHull = [CGPoint]() override init(frame: CGRect) { super.init(frame: frame) - - // last checked with Xcode 9.0b4 - #if swift(>=4.0) - print("Hello, Swift 4!") - #endif - - generatePoints() + generateRandomPoints() quickHull(points: points) } @@ -32,7 +24,7 @@ class View: UIView { fatalError("init(coder:) has not been implemented") } - func generatePoints() { + func generateRandomPoints() { for _ in 0.. Date: Sat, 31 Mar 2018 14:12:06 +0530 Subject: [PATCH 34/39] Fixed broken youtube link in splay tree readme --- Splay Tree/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Splay Tree/readme.md b/Splay Tree/readme.md index f3b852f22..75c3c0389 100644 --- a/Splay Tree/readme.md +++ b/Splay Tree/readme.md @@ -263,7 +263,7 @@ If the rotations would had been taking first the parent and not the grandparent [Splay Tree on Wikipedia](https://en.wikipedia.org/wiki/Splay_tree) -[Splay Tree by University of California in Berkeley - CS 61B Lecture 34](https://www.youtube.com/watch?v=G5QIXywcJlY) +[Splay Tree by University of California in Berkeley - CS 61B Lecture 34](https://www.youtube.com/watch?v=8Zs1lj_bUV0) ---------------- From 6bf3a160912dd4b7bf91379175549321fd45cecc Mon Sep 17 00:00:00 2001 From: Jorge Date: Wed, 11 Apr 2018 19:17:12 +0200 Subject: [PATCH 35/39] Update Combinatorics to match Swift 4 API --- Combinatorics/README.markdown | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Combinatorics/README.markdown b/Combinatorics/README.markdown index b365b389b..a2432a680 100644 --- a/Combinatorics/README.markdown +++ b/Combinatorics/README.markdown @@ -99,17 +99,17 @@ Here's a recursive algorithm by Niklaus Wirth: ```swift func permuteWirth(_ a: [T], _ n: Int) { - if n == 0 { - print(a) // display the current permutation - } else { - var a = a - permuteWirth(a, n - 1) - for i in 0.. Date: Tue, 17 Apr 2018 08:46:31 -0400 Subject: [PATCH 36/39] Added link to Swift Alg Club book --- ...DataStructuresAndAlgorithmsInSwiftBook.png | Bin 0 -> 136406 bytes README.markdown | 26 ++++-------------- 2 files changed, 6 insertions(+), 20 deletions(-) create mode 100644 Images/DataStructuresAndAlgorithmsInSwiftBook.png diff --git a/Images/DataStructuresAndAlgorithmsInSwiftBook.png b/Images/DataStructuresAndAlgorithmsInSwiftBook.png new file mode 100644 index 0000000000000000000000000000000000000000..f8de0ba72754c0994ed31cbcd17304b791d91116 GIT binary patch literal 136406 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 DtMDZ~ literal 0 HcmV?d00001 diff --git a/README.markdown b/README.markdown index dc0fc1f57..481e25f62 100644 --- a/README.markdown +++ b/README.markdown @@ -206,32 +206,18 @@ A lot of software developer interview questions consist of algorithmic puzzles. - [Dining Philosophers](DiningPhilosophers/) - [Egg Drop Problem](Egg%20Drop%20Problem/) - [Encoding and Decoding Binary Tree](Encode%20and%20Decode%20Tree/) -## Learn more! -For more information, check out these great books: +## Learn more! -- [Introduction to Algorithms](https://mitpress.mit.edu/books/introduction-algorithms) by Cormen, Leiserson, Rivest, Stein -- [The Algorithm Design Manual](http://www.algorist.com) by Skiena -- [Elements of Programming Interviews](http://elementsofprogramminginterviews.com) by Aziz, Lee, Prakash -- [Algorithms](http://www.cs.princeton.edu/~rs/) by Sedgewick -- [Grokking Algorithms](https://www.manning.com/books/grokking-algorithms) by Aditya Bhargava +Like what you see? Check out [Data Structures & Algorithms in Swift](https://store.raywenderlich.com/products/data-structures-and-algorithms-in-swift), the official book by the Swift Algorithm Club team! -The following books are available for free online: +![Data Structures & Algorithms in Swift Book](Images/DataStructuresAndAlgorithmsInSwift.png) -- [Algorithms](http://www.beust.com/algorithms.pdf) by Dasgupta, Papadimitriou, Vazirani -- [Algorithms, Etc.](http://jeffe.cs.illinois.edu/teaching/algorithms/) by Erickson -- [Algorithms + Data Structures = Programs](http://www.ethoberon.ethz.ch/WirthPubl/AD.pdf) by Wirth -- Algorithms and Data Structures: The Basic Toolbox by Mehlhorn and Sanders -- [Open Data Structures](http://opendatastructures.org) by Pat Morin -- [Wikibooks: Algorithms and Implementations](https://en.wikibooks.org/wiki/Algorithm_Implementation) +You’ll start with the fundamental structures of linked lists, queues and stacks, and see how to implement them in a highly Swift-like way. Move on to working with various types of trees, including general purpose trees, binary trees, AVL trees, binary search trees, and tries. -Other algorithm repositories: +Go beyond bubble and insertion sort with better-performing algorithms, including mergesort, radix sort, heap sort, and quicksort. Learn how to construct directed, non-directed and weighted graphs to represent many real-world models, and traverse graphs and trees efficiently with breadth-first, depth-first, Dijkstra’s and Prim’s algorithms to solve problems such as finding the shortest path or lowest cost in a network. -- [EKAlgorithms](https://github.com/EvgenyKarkan/EKAlgorithms). A great collection of algorithms in Objective-C. -- [@lorentey](https://github.com/lorentey/). Production-quality Swift implementations of common algorithms and data structures. -- [Rosetta Code](http://rosettacode.org). Implementations in pretty much any language you can think of. -- [AlgorithmVisualizer](http://jasonpark.me/AlgorithmVisualizer/). Visualize algorithms on your browser. -- [Swift Structures](https://github.com/waynewbishop/SwiftStructures) Data Structures with directions on how to use them [here](http://waynewbishop.com/swift) +By the end of this book, you’ll have hands-on experience solving common issues with data structures and algorithms — and you’ll be well on your way to developing your own efficient and useful implementations! ## Credits From 8010ec629e93228bd960da271b406420d6cb9cb0 Mon Sep 17 00:00:00 2001 From: Ray Wenderlich Date: Tue, 17 Apr 2018 08:47:31 -0400 Subject: [PATCH 37/39] Fixed typo in link --- README.markdown | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.markdown b/README.markdown index 481e25f62..783750fbc 100644 --- a/README.markdown +++ b/README.markdown @@ -211,7 +211,7 @@ A lot of software developer interview questions consist of algorithmic puzzles. Like what you see? Check out [Data Structures & Algorithms in Swift](https://store.raywenderlich.com/products/data-structures-and-algorithms-in-swift), the official book by the Swift Algorithm Club team! -![Data Structures & Algorithms in Swift Book](Images/DataStructuresAndAlgorithmsInSwift.png) +![Data Structures & Algorithms in Swift Book](Images/DataStructuresAndAlgorithmsInSwiftBook.png) You’ll start with the fundamental structures of linked lists, queues and stacks, and see how to implement them in a highly Swift-like way. Move on to working with various types of trees, including general purpose trees, binary trees, AVL trees, binary search trees, and tries. From 12471a2f8ed0586269c8cb693efc5a33e31c45c0 Mon Sep 17 00:00:00 2001 From: Ray Wenderlich Date: Tue, 17 Apr 2018 08:48:25 -0400 Subject: [PATCH 38/39] Added final link to book --- README.markdown | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.markdown b/README.markdown index 783750fbc..919f1b67f 100644 --- a/README.markdown +++ b/README.markdown @@ -219,6 +219,8 @@ Go beyond bubble and insertion sort with better-performing algorithms, including By the end of this book, you’ll have hands-on experience solving common issues with data structures and algorithms — and you’ll be well on your way to developing your own efficient and useful implementations! +You can find the book on the [raywenderlich.com store](https://store.raywenderlich.com/products/data-structures-and-algorithms-in-swift). + ## Credits The Swift Algorithm Club was originally created by [Matthijs Hollemans](https://github.com/hollance). From 730059ec7ba7dd16115f09d5d58a01b068df9beb Mon Sep 17 00:00:00 2001 From: APKaramyshev <38246803+APKaramyshev@users.noreply.github.com> Date: Sat, 21 Apr 2018 21:54:58 +0300 Subject: [PATCH 39/39] Fixed two misspellings in O(n!) example --- Big-O Notation.markdown | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Big-O Notation.markdown b/Big-O Notation.markdown index 19a1ddbde..257f80462 100644 --- a/Big-O Notation.markdown +++ b/Big-O Notation.markdown @@ -132,9 +132,9 @@ Below are some examples for each category of performance: The most trivial example of function that takes O(n!) time is given below. ```swift - func nFacFunc(n: Int) { + func nFactFunc(n: Int) { for i in stride(from: 0, to: n, by: 1) { - nFactFunc(n - 1) + nFactFunc(n: n - 1) } } ```

    EwNTrCh(m?6Wp<&*1KTEj~B(pwGn5`$#QIN$rR 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 literal 0 HcmV?d00001 diff --git a/Sparse Table/Images/structure.png b/Sparse Table/Images/structure.png new file mode 100644 index 0000000000000000000000000000000000000000..88902df0c199e6509f54080b9268d1f7c6b5c345 GIT binary patch literal 100125 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 z