我有要存储的数字集合(任意顺序)。
伪码:
id_a:[3,5,7,11]
id_x:[3,5,10,21]
id_b:[12,24,25,26]
etc.
我需要能够搜索所有集合并返回group_ID。例如,如果我查找5,我应该返回['id_a','id_x']
我想通过某种映射有效地完成这项工作,而不是通过循环所有集合的所有数字我还希望能够直接映射到每个键并返回集合(例如,'id_x'
返回[3,5,10,21]
);同样,我更希望这能有效地完成,而不需要循环键。
编辑:我可以用数字作为钥匙,有效地取回"id_"。或者,我可以走另一条路,使用"id_"作为键,有效地取回数字数组。然而,我希望能够在两个方向上都有效率。我想我可以维护两个数组,但这看起来很混乱。
您的示例都按排序顺序显示数组值。如果它们总是按排序顺序排列,那么您可以使用二进制搜索来查找已知值。此代码:
function binarySearch($needle, array $haystack) {
$high = count($haystack) - 1;
$low = 0;
$mid = false;
while ($high >= $low) {
$mid = ($high + $low) >> 1;
$t = $needle - $haystack[$mid];
if ($t < 0) {
$high = $mid - 1;
} elseif ($t > 0) {
$low = $mid + 1;
} else {
return $mid;
}
}
return $mid;
}
function searchArrays($needle) {
static $id_a = array(3,5,7,11);
static $id_x = array(3,5,10,21);
static $id_b = array(12,24,25,26);
static $arrayNames = array('id_a', 'id_x', 'id_b');
$rv = array();
foreach ($arrayNames as $arrayName) {
$array = $$arrayName;
$index = binarySearch($needle, $array);
if ($array[$index] == $needle) {
$rv[] = $arrayName;
}
}
return $rv;
}
$needles = range(3,8);
foreach ($needles as $needle) {
$result = searchArrays($needle);
printf("searchArrays(%s)=%s'n", $needle, join(', ', $result));
}
将输出以下内容:
searchArrays(3)=id_a, id_x
searchArrays(4)=
searchArrays(5)=id_a, id_x
searchArrays(6)=
searchArrays(7)=id_a
searchArrays(8)=