Example #1
0
 public function testAuxiliaryFunctions()
 {
     $this->specify("Get the minimum distance between two data array", function () {
         $data = getDataWithMinimumDistance(array(1, 8, 9), array(3, 8, 11));
         expect($data[0])->equals(1);
         expect($data[1])->equals(8);
         expect($data[2])->equals(9);
     });
     $this->specify("Get the distance between two values", function () {
         $distance = getDistanceBetweenTwoValues(88, 98);
         expect($distance)->equals(10);
     });
     $this->specify("Get the closest values by brute force algorithm", function () {
         $data = getClosestPairBybruteForce(array(1, 8, 9), 3);
         expect($data[0])->equals(1);
         expect($data[1])->equals(8);
         expect($data[2])->equals(9);
     });
     $this->specify("Get the closest values in split array by brute force algorithm", function () {
         $data = getClosestPairInSplitArrayByBruteForce(array(3, 4, 10, 20, 40), 5, array(20, 10, 30));
         expect($data[0])->equals(1);
         expect($data[1])->equals(3);
         expect($data[2])->equals(4);
     });
 }
Example #2
0
/**
 * Calculate the closest two values inside array by brute force or divide and conquer algorithm
 * @param  [Array] $array      [Array input]
 * @param  [Number] $arraySize [Array input length]
 * @return [Array]             [Array output]
 */
function getClosestPair($array, $arraySize)
{
    if ($arraySize <= 3) {
        return getClosestPairBybruteForce($array, $arraySize);
    }
    $midIndex = ceil($arraySize / 2);
    $midValue = $array[$midIndex];
    $arrayByLeft = array_slice($array, 0, $midIndex);
    $arrayByRight = array_slice($array, $midIndex, $arraySize - $midIndex);
    sort($arrayByLeft);
    sort($arrayByRight);
    $dataByLeft = getClosestPair($arrayByLeft, $midIndex);
    $dataByRight = getClosestPair($arrayByRight, $arraySize - $midIndex);
    $minData = getDataWithMinimumDistance($dataByLeft, $dataByRight);
    $arraySplit = array();
    $arraySplitSize = 0;
    for ($i = 0; $i < $arraySize; $i++) {
        if (abs($array[$i] - $midValue) < $minData[0]) {
            $arraySplit[$arraySplitSize] = $array[$i];
            $arraySplitSize++;
        }
    }
    return getDataWithMinimumDistance($minData, getClosestPairInSplitArrayByBruteForce($arraySplit, $arraySplitSize, $minData));
}