Geringste Zahlendifferenz zwischen meheren Zahlenarrays?

Hallo,

wäre es möglich (Performance / Speicherbedarf), die Arrays zu einem großen zusammenzuführen, diesen dann zu sortieren und dann die Differenzen zu berechnen?


// Edit: Die Funktionen wären dann: array_merge() und sort()

// Edit2: Mal schnell hingeklatscht:
PHP:
#!/usr/bin/php5
<?php
  $speed [] = array (54898, 27454, 18306, 13732, 10988, 9158, 7851, 6871, 6109, 5499);
  $speed [] = array (70144, 35077, 23388, 17543, 14037, 11699, 10029, 8777, 7803, 7023); 

  $all = array();
  for($i=0; $i<count($speed); $i++) {
    $all = array_merge($all, $speed[$i]);
  }
  
  sort($all);
  
  $bestDiff = -1;
  $ret_smaller = -1;
  $ret_bigger = -1;
  for($i=1; $i<count($all); $i++) {
    $diff = $all[$i] - $all[$i - 1];
    if($diff < $bestDiff || $bestDiff == -1) {
      $bestDiff = $diff;
      $smaller = $all[$i - 1];
      $bigger = $all[$i];
    }
  }
  
  echo "Kleinster Unterschied: " . $bestDiff . " (" . $smaller . " und " . $bigger . ")\n";
?>

// Edit3: Funktioniert so bei mir, jetzt stellt sich nur noch die Frage mit der Performance.

Gruß
BK
 
Zuletzt bearbeitet:
@bratkartoffel
Das Problem dabei ist, dass unter Umständen ein Paar aus einer einzigen Wertereihe stammen könnte. So wie ich verstanden habe, sollen beide Werte aus verschiedenen Reihen kommen.
 
Hallo,

wäre es möglich (Performance / Speicherbedarf), die Arrays zu einem großen zusammenzuführen, diesen dann zu sortieren und dann die Differenzen zu berechnen?


// Edit: Die Funktionen wären dann: array_merge() und sort()

Ich glaube, die Werte in einem Unterarray sollten nicht auch miteinander verglichen werden. Sieht mir nach Messreihen aus und diese sind nicht beliebig mischbar.
 
Ich glaube, die Werte in einem Unterarray sollten nicht auch miteinander verglichen werden. Sieht mir nach Messreihen aus und diese sind nicht beliebig mischbar.
Mein Code oben beruht ebenfalls auf dieser Annahme ( und kann mehr als 2 Arrays "handeln" ;) )
 
Also, um das nochmals klarzustellen :)

Es sollen mehr als 3 Array's in betracht gezogen werden, also z.b.

PHP:
$speed = array(); 
$speed[0] = array(54898, 27454, 18306, 13732, 10988, 9158, 7851, 6871, 6109, 5499); 
$speed[1] = array(70144, 35077, 23388, 17543, 14037, 11699, 10029, 8777, 7803, 7023);  
$speed[2] = array(9999999, 1, 9999999, 7413, 1, 1, 1, 1, 1, 1);  //<== Mal eine komische Reihenfolge

Nun sind folgende Zahlen am nähesten aneinander:
$speed[0] ==> 7851
$speed[1] ==> 7803
$speed[2] ==> 7413


Und diese müssen Ermittelt werden.

PS: Gibt es für dieses "Ding" einen Fachbegriff?!

LG
Hawkster
 
Tja schön. Nun solltest du aber unsere Lösungen mal testenund nicht einfach abwarten wwas wir sonst noch presentieren......

PS meine Lösung sagt genau das was du suchst....
Code:
array(4) {
  ["v0"]=>
  string(4) "7851"
  ["v1"]=>
  string(4) "7803"
  ["v2"]=>
  string(4) "7413"
  ["diff"]=>
  string(3) "876"
}
 
PHP:
<?
set_time_limit(3);

$speed = array();
$speed[] = array(54898, 27454, 18306, 13732, 10988, 9158, 7851, 6871, 6109, 5499);
$speed[] = array(70144, 35077, 23388, 17543, 14037, 11699, 10029, 8777, 7803, 7023);
$speed[] = array(1);


$min = Array();
$bestMin = 0;
foreach ($speed as $key => $arr){
    foreach($arr as $val){
        for ( $i = $key+1; $i < count($speed);$i++){
            for ($j = 0; $j < count($speed[$i]);$j++){
                $curMin = $val - $speed[$i][$j];
                if ($bestMin == 0){ $bestMin = ($curMin < 0) ? $curMin*-1 : $curMin; }
                else {
                    $curMin *= ($curMin < 0) ? -1 : 1;
                    if ($curMin < $bestMin ){
                        $bestMin = $curMin;
                        $min[0] = $val;
                        $min[1] = $speed[$i][$j];
                    }
                }        
            }
        }
    }
}

print_r($min); 
		
?>

Ausgabe:
Array ( [0] => 7851 [1] => 7803 )

Leider ist das ja falsch, weil nun theoretisch folgendes kommen muss:
Array ( [0] => 5499 [1] => 7023 [2] => 1)

Mit freundlichen Grüßen,
Hawkster
 
@yaslaw,

bei deinem Code verstehe ich nicht was du machst. Du Willst eine Verbindung zur DB haben, aber die werte stehen dort doch garnicht...
Aber ich versuchs dir zu liebe einfach mal :)
 
Zurück