检查多维数组是否包含2个或更多相等值并且只返回第一个数据的最佳方法是什么。
例如:我有一系列包含
的人[0][firstName] = 'John';
[0][lastName] = 'Doe';
[N][firstName] = 'Marco';
[N][lastName] = 'Polo';
[120][firstName] = 'John';
[120][lastName] = 'Doe';
应该检测到索引120是重复的并将其删除。
我正在寻找最佳性能,我不想在阵列上循环,每次检查是否有值。
有更快的东西吗?
答案 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);