2012-03-19 9 views
0

私は、文字列の2列があります:1つの秩序配列 - 配列X、及び1つの順不同配列 - 配列Y配列のソート - とマージ - アルゴリズム

新しい配列が持つべき何を:すべての項目は、配列のみからでなければなりませんYとXとYの間に重なるものは、Xの順序に基づいて順序付けされ、残りがあればYの元の順序と同じ順序で終了する必要があります。 XにはYにないエントリが含まれているため、無視するだけです。

これを行う効率的な方法は何ですか(PHPで)?

例:

配列X:{ 'A'、 'Z'、 'Q'、 'D'}

配列Y:{ 'B'、 'C​​'、 'A'、 'D'、 'Z'}

結果:{ 'A'、 'Z'、 'D'、 'B'、 'C​​'}

だからアイデアは次のとおりです。私たちは第二を取りたいです配列Y(配列Y)を作成し、配列Xで与えられた順序に基づいて要素をソートします。配列Yには余分な要素があるかもしれませんので、これらの余分な要素を新しい配列の最後に配置したいだけです。意味がありますか?

$result = array(); 

// build index array for constant lookup 
$indexY = array_flip($y); 

// test for each value in X whether it is in Y 
foreach ($x as $valueX) { 
    if (isset($indexY[$valueX])) { 
     $result[] = $valueX; 
     // remove it from the index so we know which values remain 
     unset($indexY[$valueX]); 
    } 
} 

// append remaining values 
foreach ($indexY as $valueY => $i) { 
    $result[] = $valueY; 
} 

更新これは間違いなく最も簡潔な解決策ではなく、実行時の複雑さが言及した他の人には逆に、Ο(N)である:

+0

あなたは、例えば、入力配列と出力例を与えることができますか?あなたの説明はちょっと難しいです。 – Nick

+0

例を追加しました。ありがとう、ありがとう、 – user809240

答えて

1

あなたはこれを行うことができますここではarray_intersectarray_diff、およびarray_mergeは、それぞれΟ(n・log n)の内部で配列をソートします。

+0

非常に効率的ではありませんか?それはn^2時間ですね。 – user809240

+0

@ user809240いいえ、実際にはΟ(* n *)のため、一定の検索時間を可能にするインデックスがあります。 – Gumbo

1
<?php 

$intersect = array_intersect($x, $y); 
$diff = array_diff($y, $x); 
$result = array_merge($intersect, $diff); 

?> 
3
$r = array_merge(array_intersect($x, $y), array_diff($y, $x)) 
関連する問題