Advertisement
Guest User

Untitled

a guest
Aug 21st, 2019
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. //
  2. // Created by @fewlinesofcode on 9/6/18.
  3. // Copyright (c) 2018 Oleksandr Glagoliev. All rights reserved.
  4. //
  5.  
  6. public class Interval<T: Comparable> {
  7. private (set) var start: T
  8. private (set) var end: T
  9. var max: T
  10.  
  11. var left: Interval<T>?
  12. var right: Interval<T>?
  13.  
  14. init(start: T, end: T) {
  15. precondition(start <= end)
  16.  
  17. self.start = start
  18. self.end = end
  19. self.max = end
  20. }
  21. }
  22.  
  23. extension Interval: Comparable {
  24. public static func ==(lhs: Interval<T>, rhs: Interval<T>) -> Bool {
  25. return lhs.start == rhs.start && lhs.end == rhs.end
  26. }
  27. public static func <(lhs: Interval<T>, rhs: Interval<T>) -> Bool {
  28. return lhs.start < rhs.start
  29. }
  30. public static func <=(lhs: Interval<T>, rhs: Interval<T>) -> Bool {
  31. return lhs < rhs || lhs == rhs
  32. }
  33. public static func >=(lhs: Interval<T>, rhs: Interval<T>) -> Bool {
  34. return lhs > rhs || lhs == rhs
  35. }
  36. public static func >(lhs: Interval<T>, rhs: Interval<T>) -> Bool {
  37. return lhs.start > rhs.start
  38. }
  39. }
  40.  
  41. extension Interval: CustomStringConvertible {
  42. public var description: String {
  43. return "(\(start),\(end)):{\(max)}"
  44. }
  45. }
  46.  
  47. public struct AugmentedIntervalTree<T: Comparable> {
  48. private (set) var root: Interval<T>? = nil
  49.  
  50. private func insert(_ node: Interval<T>?, _ newNode: Interval<T>) -> Interval<T> {
  51. guard let tmp = node else {
  52. return newNode
  53. }
  54.  
  55. if newNode.end > tmp.max {
  56. tmp.max = newNode.end
  57. }
  58.  
  59. if (tmp < newNode) {
  60. if tmp.right == nil {
  61. tmp.right = newNode
  62. } else {
  63. _ = insert(tmp.right, newNode)
  64. }
  65. } else {
  66. if tmp.left == nil {
  67. tmp.left = newNode
  68. } else {
  69. _ = insert(tmp.left, newNode)
  70. }
  71. }
  72. return tmp
  73. }
  74.  
  75. func overlaps(acc: inout [Interval<T>], node: Interval<T>?, _ interval: Interval<T>) {
  76. guard let tmp = node else {
  77. return
  78. }
  79.  
  80. if !((tmp.start > interval.end) || (tmp.end < interval.start)) {
  81. acc.append(tmp)
  82. }
  83.  
  84. if let l = tmp.left, l.max >= interval.start {
  85. overlaps(acc: &acc, node: l, interval)
  86. }
  87. overlaps(acc: &acc, node: tmp.right, interval)
  88. }
  89.  
  90. private func printTree(_ tree: Interval<T>? = nil) {
  91. if tree == nil {
  92. print("The tree is empty!")
  93. return
  94. }
  95.  
  96. if let left = tree!.left {
  97. printTree(left)
  98. }
  99.  
  100. print(tree!)
  101.  
  102. if let right = tree!.right {
  103. printTree(right)
  104. }
  105. }
  106.  
  107. // MARK: Public
  108.  
  109. public mutating func insert(_ node: Interval<T>) {
  110. root = insert(root, node)
  111. }
  112.  
  113. public func printTree() {
  114. printTree(root)
  115. }
  116.  
  117. public func overlaps(with interval: Interval<T>) -> [Interval<T>]{
  118. var res = [Interval<T>]()
  119. overlaps(acc: &res, node: root, interval)
  120. return res
  121. }
  122. }
  123.  
  124. print("--- Tree ---")
  125. var ait = AugmentedIntervalTree<Int>()
  126. ait.insert(Interval<Int>(start: 5, end: 10))
  127. ait.insert(Interval<Int>(start: 15, end: 25))
  128. ait.insert(Interval<Int>(start: 1, end: 12))
  129. ait.insert(Interval<Int>(start: 8, end: 16))
  130. ait.insert(Interval<Int>(start: 14, end: 20))
  131. ait.insert(Interval<Int>(start: 18, end: 21))
  132. ait.insert(Interval<Int>(start: 2, end: 8))
  133. ait.printTree()
  134.  
  135. print("--- Intersection ---")
  136. let queries = [Interval<Int>(start: 8, end: 10), Interval<Int>(start: 20, end: 22)]
  137.  
  138. var overlaps = [Interval<Int>]()
  139.  
  140. for query in queries {
  141. print("Intersections with \(query): \(ait.overlaps(with:query))")
  142. }
  143. print(overlaps)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement