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); }); }
/** * 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)); }