Commit 362941a

mo <mokha@cisco.com>
2017-05-25 23:28:57
implement recurse binary search.
1 parent 25665e7
Changed files (1)
spec/triplet_sum_spec.rb
@@ -51,11 +51,32 @@ describe "triplet sum" do
     false
   end
 
+  def bsearch_index(items, target)
+    n = items.size
+    return (target == items[0]) ? 0 : nil if n == 1
+    return 0 if n == 2 && target == items[0]
+    return 1 if n == 2 && target == items[1]
+    return nil if n == 2
+
+    mid = n / 2
+    result = target <=> items[mid]
+    if result == 0
+      return mid
+    elsif result > 0
+      result = bsearch_index(items[mid+1..n], target)
+      return mid + result if result
+    else
+      result = bsearch_index(items[0..mid], target)
+      return mid + result if result
+    end
+    nil
+  end
+
   def triplet_sum(target, items)
     # nlogn
     sorted = items.sort
     # logn
-    high_index = sorted.bsearch_index { |x| x > target }
+    high_index = bsearch_index(sorted, target)
     sorted = sorted[0..high_index] if high_index
     n = sorted.size
     # n
@@ -78,6 +99,10 @@ describe "triplet sum" do
     false
   end
 
+  #def triplet_sum(target, items)
+    #items.combination(3).to_a.any? { |x| x.reduce(:+) == target }
+  #end
+
   it do
     expect(triplet_sum(15, [14, 1, 2, 3, 8, 15, 3])).to be(false)
   end
@@ -133,12 +158,14 @@ describe "triplet sum" do
   end
 
   xit 'plots the time for each' do
+    puts "\"n\",\"time (seconds)\""
     10.times do |n|
       items = Array.new((n + 1) * 1_000) { rand(100) }
       start_time = Time.now
       triplet_sum(rand(100), items)
       end_time = Time.now
-      puts "#{items.size} items: #{(end_time - start_time) * 1_000} seconds"
+      #puts "#{items.size} items: #{(end_time - start_time) * 1_000} seconds"
+      puts "\"#{items.size}\",\"#{(end_time - start_time) * 1_000}\""
     end
   end
 end