Advertisement
Guest User

BinarySearch benchmark

a guest
Mar 31st, 2018
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.84 KB | None | 0 0
  1. package benchmarks.binary_search
  2.  
  3. import org.openjdk.jmh.annotations.*
  4. import java.util.*
  5.  
  6. @BenchmarkMode(Mode.AverageTime)
  7. @State(Scope.Benchmark)
  8. open class BinarySearch {
  9.     private val max = 10_000_000
  10.     private val largNumbers = (0..max).toList()
  11.     private val r = Random(System.currentTimeMillis())
  12.  
  13.     @Benchmark
  14.     fun binary_search(): Int {
  15.         val item = r.nextInt(max)
  16.  
  17.         val r = binarySearch(largNumbers, item)
  18.  
  19.         assert(r >= 0)
  20.  
  21.         return r
  22.     }
  23.  
  24.  
  25.     @Benchmark
  26.     fun builtin_binary_search(): Int {
  27.         val item = r.nextInt(max)
  28.  
  29.         val r = largNumbers.binarySearch(item)
  30.  
  31.         assert(r >= 0)
  32.  
  33.         return r
  34.     }
  35. }
  36.  
  37.  
  38.  
  39. fun rangeCheck(size: Int, fromIndex: Int, toIndex: Int) {
  40.     when {
  41.         fromIndex > toIndex -> throw IllegalArgumentException("fromIndex ($fromIndex) is greater than toIndex ($toIndex).")
  42.         fromIndex < 0 -> throw IndexOutOfBoundsException("fromIndex ($fromIndex) is less than zero.")
  43.         toIndex > size -> throw IndexOutOfBoundsException("toIndex ($toIndex) is greater than size ($size).")
  44.     }
  45. }
  46.  
  47. fun <T : Comparable<T>> binarySearch(list: List<T?>, element: T?, fromIndex: Int = 0, toIndex: Int = list.size): Int {
  48.     rangeCheck(list.size, fromIndex, toIndex)
  49.  
  50.     var low = fromIndex
  51.     var high = toIndex - 1
  52.  
  53.     while (low <= high) {
  54.         val mid = (low + high).ushr(1) // safe from overflows
  55.         val midVal = list.get(mid)
  56.         val cmp = when {
  57.             midVal == element -> 0
  58.             midVal == null -> -1
  59.             element == null -> 1
  60.             else -> midVal.compareTo(element)
  61.         }
  62.  
  63.         if (cmp < 0)
  64.             low = mid + 1
  65.         else if (cmp > 0)
  66.             high = mid - 1
  67.         else
  68.             return mid // key found
  69.     }
  70.     return -(low + 1)  // key not found
  71. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement