Быстрее / лучше метод для сравнения связанных списков данных - PullRequest
0 голосов
/ 30 июля 2011

Есть два массива с тонной данных в них. Они оба имеют одинаковые ключи, только разные значения. Пример:

Скажем, у вас есть два человека, и вы хотите сделать некоторые расчеты, основываясь на том, как они любят фрукты, но вы не хотите сравнивать одни и те же фрукты.

$person1 = array("Apple" => 10, "Pear" => 4, "Banana" => 8, "Pineapple" => 7, "Watermelon" => 7)

$person2 = array("Apple" => 6, "Pear" => 10, "Banana" => 6, "Pineapple" => 9, "Watermelon" => 3)

Теперь я хочу сравнить все значения, кроме случаев, когда фрукты одинаковы. Таким образом,

Person 1    Person 2
Apple = 10  Pear = 10
Apple = 10  Banana = 6
Apple = 10  Pineapple = 9
...
Banana = 8  Apple = 6
Banana = 8  Pear = 10
Banana = 8  Pineapple = 9

Обратите внимание, что я сделал Apple Banana, а затем Banana Apple для человека от 1 до 2, потому что рассчитанное значение может отличаться. Итак, если бы я сделал что-то вроде:

(Person 1 Key) * 2 + (Person 2 Key)

Тогда вы можете получить:

10 * 2 + 6 = 26 for Person1["Apple"] and Person2["Banana"], а затем

8 * 2 + 6 = 22 for Person1["Banana"] and Person2["Apple"]

В любом случае можно сделать это без использования вложенного массива или чего-то более быстрого.


Редактировать

$calculatedValues = array();
$len = sizeof($person1);


$inc = 0;
for($i = 0; $i < $len; ++$i){
   for($j = 0; $j < $len; ++$j){
     if($i != $j){
       $calculatedValues[$inc] = $person1[i] * 2 + $person2[j];
       inc++;
     }
   }
}

1 Ответ

0 голосов
/ 30 июля 2011

Нет, ничто не будет быстрее, чем вложенный цикл. Подумайте об этом немного. Вы должны сравнить все вещи предмета А со всеми вещами предмета В, чтобы составить свой список. Если вы вложите цикл над вещами человека B в цикл над вещами человека A, сколько всего итераций вы сделаете? Ровно столько, сколько пар вы должны сравнить. Это минимальное количество операций, поэтому вы не можете сделать лучше.

foreach ($person1 as $fruitA => $quantityA) {
  foreach ($person2 as $fruitB => $quantityB) {
    $calculatedValues[] = $quantityA * 2 + $quantityB;
  }
}
...