annotate vendor/sebastian/diff/src/TimeEfficientLongestCommonSubsequenceCalculator.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents 5311817fb629
children
rev   line source
Chris@2 1 <?php declare(strict_types=1);
Chris@2 2 /*
Chris@2 3 * This file is part of sebastian/diff.
Chris@2 4 *
Chris@2 5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
Chris@2 6 *
Chris@2 7 * For the full copyright and license information, please view the LICENSE
Chris@2 8 * file that was distributed with this source code.
Chris@2 9 */
Chris@2 10
Chris@2 11 namespace SebastianBergmann\Diff;
Chris@2 12
Chris@2 13 final class TimeEfficientLongestCommonSubsequenceCalculator implements LongestCommonSubsequenceCalculator
Chris@2 14 {
Chris@2 15 /**
Chris@2 16 * {@inheritdoc}
Chris@2 17 */
Chris@2 18 public function calculate(array $from, array $to): array
Chris@2 19 {
Chris@2 20 $common = [];
Chris@2 21 $fromLength = \count($from);
Chris@2 22 $toLength = \count($to);
Chris@2 23 $width = $fromLength + 1;
Chris@2 24 $matrix = new \SplFixedArray($width * ($toLength + 1));
Chris@2 25
Chris@2 26 for ($i = 0; $i <= $fromLength; ++$i) {
Chris@2 27 $matrix[$i] = 0;
Chris@2 28 }
Chris@2 29
Chris@2 30 for ($j = 0; $j <= $toLength; ++$j) {
Chris@2 31 $matrix[$j * $width] = 0;
Chris@2 32 }
Chris@2 33
Chris@2 34 for ($i = 1; $i <= $fromLength; ++$i) {
Chris@2 35 for ($j = 1; $j <= $toLength; ++$j) {
Chris@2 36 $o = ($j * $width) + $i;
Chris@2 37 $matrix[$o] = \max(
Chris@2 38 $matrix[$o - 1],
Chris@2 39 $matrix[$o - $width],
Chris@2 40 $from[$i - 1] === $to[$j - 1] ? $matrix[$o - $width - 1] + 1 : 0
Chris@2 41 );
Chris@2 42 }
Chris@2 43 }
Chris@2 44
Chris@2 45 $i = $fromLength;
Chris@2 46 $j = $toLength;
Chris@2 47
Chris@2 48 while ($i > 0 && $j > 0) {
Chris@2 49 if ($from[$i - 1] === $to[$j - 1]) {
Chris@2 50 $common[] = $from[$i - 1];
Chris@2 51 --$i;
Chris@2 52 --$j;
Chris@2 53 } else {
Chris@2 54 $o = ($j * $width) + $i;
Chris@2 55
Chris@2 56 if ($matrix[$o - $width] > $matrix[$o - 1]) {
Chris@2 57 --$j;
Chris@2 58 } else {
Chris@2 59 --$i;
Chris@2 60 }
Chris@2 61 }
Chris@2 62 }
Chris@2 63
Chris@2 64 return \array_reverse($common);
Chris@2 65 }
Chris@2 66 }