1

多次元配列に2つ以上の等しい値が含まれているかどうかを確認し、最初の値のみを返す最良の方法は何ですか.

例:私は含む人々の配列を持っています

[0][firstName] = 'John';
[0][lastName]  = 'Doe';

[N][firstName] = 'Marco';
[N][lastName]  = 'Polo';

[120][firstName] = 'John';
[120][lastName]  = 'Doe';

インデックス 120 が重複していることを検出して削除する必要があります。

私は最高のパフォーマンスを探しています。配列をループして、値があるかどうかを毎回確認したくありません。

もっと速いものはありますか?

4

2 に答える 2

6

基本的にソートと反復による要素の明確性の問題です(ソートO(NlogN)後、重複は互いに隣接します-それらを簡単に検出できます)

ただし、反復中にすべての要素をハッシュテーブルに格納し、要素が既に存在する場合は分割することによりO(N) 、平均してO(N)追加のスペースを使用して実行することもできます。

後で必要になる場合は、各要素の元のインデックスを保存することもできます (インデックスをキーとして使用しないでください)。

擬似コード:

map <- empty hash map
for each element e with idx i in list (in ascending order of i):
     if (map.contains(e)):
           e is a dupe, the first element is in index map.get(e)        
     else:    
           map.add(e,i)
于 2012-12-12T12:16:01.560 に答える
1

あなたが試すことができます

// Generate Possible name with duplicate
$names = array("John","Doe","Polo","Marco","Smith");
$array = array();

for($i = 0; $i < 20; $i ++) {
    $key = mt_rand(0, 1000);
    $array[$key]["firstName"] = $names[array_rand($names)];
    $array[$key]["lastName"] = $names[array_rand($names)];
}

// Start Sorting process
ksort($array);

// Start Storage
$data = $hash = array();

// Loop and porpulate new array
foreach ( $array as $k => $v ) {
    $h = sha1($v['firstName'] . $v["lastName"]);
    isset($hash[$h]) or $data[$k] = $v and $hash[$h] = 1;
}

var_dump($data);
于 2012-12-12T13:12:37.453 に答える