2013-08-06 48 views
2

我不知道如何解釋這一點。一個例子似乎是最簡單的方法:PHP - 包含兩個數組的最小合併

[1, 4, 7, 3, 3, 3] and [4, 0, 3, 4, 9, 9] 
should give [0, 1, 3, 3, 3, 4, 4, 7, 9, 9] 

添加這兩個數組的每個元素。如果兩個數組中都有一個元素,那麼在單個數組中添加該元素的最大數量。結果數組不需要用任何特殊的方式排序,但我在這裏做了可讀性。

請注意,這將用於具有未知整數值的大數組。有沒有一種好方法可以做到這一點,不需要太多的時間/處理能力?

+0

你看過數組排序和合並函數嗎? – Maximus2012

+0

我不知道你的意思是「在單個數組中添加最大數量的元素」 – Mike

+1

@Mike:受過教育的猜測。第一個陣列中有三個3。第二個數組中只有一個3。 3的「最大數量」是3,所以得到的數組應該包括'[... 3,3,3,...]。 –

回答

0

算法:

  1. 複製到溶液陣列的最小陣列。

  2. 遍歷其他數組。

  3. 如果找到一個新元素=>

    使用此鏈接計數的時間的元素髮生另一個陣列Count how often a particular value appears in an array中的號碼。添加相同的。

  4. 如果在結果數組中找到一個已經存在的元素,找到該元素的計數。

    如果

    添加(在結果陣列其它陣列> =計數計數)(計數在其它陣列 - 在結果陣列計數)*元件導致陣列。

    其他:什麼也不做。

這裏是工作的PHP執行上面的算法:

<?php 
$a1=[1, 4, 7, 3, 3, 3]; 
$a2=[4, 0, 3, 4, 9, 9]; 
$size=sizeof($a1); 
$result=$a1; 
foreach ($a2 as $value) 
{ 
if(in_array($value,$result)) 
{ 
    $p=array_count_values($a2)[$value] ; 
    $q=array_count_values($result)[$value] ; 
    if($p>$q) 
    { 
     $temp=array_fill(0, $p-$q , $value); 
     $result=array_merge($result,$temp); 
    } 
} 
else 
{ 
    $temp=array_fill(0,array_count_values($a2)[$value],$value); 
    $result=array_merge($result,$temp); 
} 
} 
print_r($result); 

?> 

這是輸出:

Array 
(
    [0] => 1 
    [1] => 4 
    [2] => 7 
    [3] => 3 
    [4] => 3 
    [5] => 3 
    [6] => 4 
    [7] => 0 
    [8] => 9 
    [9] => 9 
) 

我有沒有回答你的問題?

0

可能不是最優化,但

<?php 
$one=[1, 4, 7, 3, 3, 3]; 
$two=[4, 0, 3, 4, 9, 9]; 
sort($one); 
sort($two); 
foreach($one as $el) 
{ 
$combined[]=$el; 
if (array_search($el,$two)) 
{ 
unset($two[array_search($el,$two)]); 
} 
} 
foreach($two as $el) 
{ 
$combined[]=$el; 
} 
sort($combined); 
print_r($combined); 
?> 
0

試試這個:

<?php 

$array1 = [1, 4, 7, 3, 3, 3]; 
$array2 = [4, 0, 3, 4, 9, 9]; 

function min_merge($arr1, $arr2) { 
    $arr1 = array_count_values($arr1); 
    $arr2 = array_count_values($arr2); 

    foreach ($arr2 as $index => $arr) 
     if (!isset($arr1[$index]) || $arr > $arr1[$index]) 
      $arr1[$index] = $arr; 

    foreach ($arr1 as $index => $arr) 
     for ($i = 0; $i < $arr; $i++) 
      $final[] = $index; 

    return $final; 
} 

print_r(min_merge($array1, $array2)); 

Output

Array (
    [0] => 1 
    [1] => 4 
    [2] => 4 
    [3] => 7 
    [4] => 3 
    [5] => 3 
    [6] => 3 
    [7] => 0 
    [8] => 9 
    [9] => 9 
) 

未排序的,但它包含了從[0, 1, 3, 3, 3, 4, 4, 7, 9, 9]所有的數字。

+0

你可以在最後執行asort(),然後是array_values()(如果還需要對索引進行排序) – adnanyousafch

+1

OP說'結果數組不需要排序',所以我只是保持原樣。 –

0
$count[0] = array_count_values($arr1); 
$count[1] = array_count_values($arr2); 
$out = array(); 
array_map(function($e) use(&$out, $count){ 
    $n1 = (isset($count[0][$e])) ? $count[0][$e] : 0; 
    $n2 = (isset($count[1][$e])) ? $count[1][$e] : 0; 
    $next = ($n2 > $n1) ? array_fill(0, $n2, $e) : array_fill(0, $n1, $e); 
    $out = array_merge($out, $next); 
}, array_keys($count[0] + $count[1])); 
print_r($out);