【问题标题】:Faster/Better method to compare related lists of data比较相关数据列表的更快/更好的方法
【发布时间】:2011-07-30 03:47:15
【问题描述】:

有两个数组,其中包含大量数据。它们都有相同的键,只是值不同。示例:

假设你有两个人,你想根据他们对水果的喜好做一些计算,但你不想比较相同的水果。

$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

请注意,我为第 1 个人和第 2 个人分别做了 Apple Banana 和 Banana Apple,因为计算的值可能不同。所以,如果我做了类似的事情:

(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++;
     }
   }
}

【问题讨论】:

  • “所以我实际上没有任何代码,” - 这是你的第一个问题......

标签: php nested-loops


【解决方案1】:

不,没有什么比嵌套循环更快的了。想一想。您必须将所有项目 A 的东西与所有项目 B 的东西进行比较才能生成您的列表。如果你在 B 人的东西上嵌套一个循环,在 A 人的东西上循环,你将进行多少次迭代?与您必须比较的配对一样多。这是最少的操作数,所以你不能做得更好。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多