多维数组重复 - 性能

时间:2012-12-12 12:11:33

标签: php performance algorithm multidimensional-array

检查多维数组是否包含2个或更多相等值并且只返回第一个数据的最佳方法是什么。

例如:我有一系列包含

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

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

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

应该检测到索引120是重复的并将其删除。

我正在寻找最佳性能,我不想在阵列上循环,每次检查是否有值。

有更快的东西吗?

2 个答案:

答案 0 :(得分:6)

element distinctness problem基本上是O(NlogN)通过排序和迭代(排序后,重复将彼此相邻 - 这样很容易检测到它们)

但是,也可以在O(N) 平均O(N)额外空间中完成,方法是在迭代和破坏时将所有元素存储到hash table如果元素已存在。

如果稍后需要,您可能还想存储每个元素的原始索引(并且不要将索引用作键)。

伪代码:

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)

答案 1 :(得分: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);