Thursday, March 27, 2014

Binary chop in PHP

<?php

/* PHP is pass by value for function arguments
 * http://www.php.net/call_user_func has the mechanism
 * inbuilt to make calls to different bchop implementations.
 * Using call_user_func is left as an exercise for whosoever
 * reads and wants to do it.
 */
    function bchop (array $arr, $n, $key)
    {
      $min = 0;
      $max = $n;
      while ($min < $max) {
        $middle = $min + (($max - $min) >> 1);
        if ($key > $arr [$middle])
          $min = $middle + 1;
        else
          $max = $middle;
      }
      if ($arr[$min] == $key) return $min;
      else
        return -1;
    }

    $a = array(3, 4, 5, 10, 20, 21, 25, 29, 31, 35);
    $idx = bchop($a, sizeof($a), 20);

    print $idx;
?>

Tuesday, March 25, 2014

Binary Chop in Java

class BinChop
{
  public interface Strategy
  {
    public int chop(final int a[], int sz, int value);
  }; 
 
  public class Chopper implements Strategy
  {
    public int chop (final int a[], int sz, int value)
    {
      int first = 0;
      int last  = sz;
     
      while (first <= last)
      {
        int mid = (first + last)/2;  // <== potential overflow
       
        if (value < a[mid])
          last = mid - 1;
        else if (value > a[mid])
          first = mid + 1;
        else
          return mid;
      }
      return -1;
    }
  }   
 
  public class ChopperOverflow implements Strategy
  {
    public int chop (final int arr[], int n, int key)
    {
      int min = 0, max = n;
      while (min < max) {
        int middle = min + ((max - min) >> 1);  // overflow fixedmin + ((max - min) >> 1)
        if (key > arr [middle])
          min = middle + 1;
        else
          max = middle;
      }
      if (arr[min] == key) return min;
      else
        return -1;
    }
  }
 
  public static void main(String args[])
  {
    int a[] = {3, 4, 5, 10, 20, 21, 25, 29, 31, 35};
   
    Strategy strat = new BinChop().new Chopper();
    System.out.println(strat.chop(a, 10, 20));
   
    strat = new BinChop().new ChopperOverflow();
    System.out.println(strat.chop(a, 10, 20));
  } 
}

Monday, March 24, 2014

Binary Chop in C

#include <stdio.h>

int binchop (const int *a, int sz, int value)
{
   int first = 0;
   int last  = sz;

   while (first <= last)
   {
      int mid = (first + last)/2;  // <== potential overflow

      if (value < a[mid])
         last = mid - 1;
      else if (value > a[mid])
         first = mid + 1;
      else
         return mid;
   }
   return -1;
}

int binchop1 (const int *arr, int n, int key)
{
   int min = 0, max = n;
   while (min < max) {
      int middle = min + ((max - min) >> 1);  // overflow fixedmin + ((max - min) >> 1)
      if (key > arr [middle])
         min = middle + 1;
      else
         max = middle;
   }
   if (arr[min] == key) return min;
   else
   return -1;
}

int main()
{
   int A[] = {3, 4, 5, 10, 20, 21, 25, 29, 31, 35};
   int (*bchop) (const int *a, int sz, int value);

   bchop = & binchop;
   printf("%d\n", (*bchop)(A, 10, 20));

   bchop = & binchop1;
   printf("%d\n", (*bchop)(A, 10, 20));
   return 0;
}