我有这样的数组:如何匹配阵列行口罩的阵列
array('1224*', '543*', '321*' ...)
巫包含17K“面具”或前缀
和第二阵列:
array('123456789', '123456788', '987654321' ....)
巫包含有关250k数字。
现在我怎么能有效地匹配每个数字形式的第二个数组,以掩盖/前缀从数组1?
[编辑]
ARRAY1仅包含前缀,每个条目仅具有一个*
在它的结束。
我有这样的数组:如何匹配阵列行口罩的阵列
array('1224*', '543*', '321*' ...)
巫包含17K“面具”或前缀
和第二阵列:
array('123456789', '123456788', '987654321' ....)
巫包含有关250k数字。
现在我怎么能有效地匹配每个数字形式的第二个数组,以掩盖/前缀从数组1?
[编辑]
ARRAY1仅包含前缀,每个条目仅具有一个*
在它的结束。
那么,这里的一个解决方案:
Prelimary步骤:
*
的。搜索:
number
(二进制搜索)的这一点。first
和last
(二分搜索)。这应该是O(k*n*log(n))
其中n
是平均数长度(位数)和k
号的数目。
基本上这是一个一维Radix tree,以获得最佳性能,应实现它,但它可以是挺难的。
我的两分钱....
$s = array('1234*', '543*', '321*');
$f = array('123456789', '123456788', '987654321');
foreach ($f as $haystack) {
echo $haystack."<br>";
foreach ($s as $needle) {
$needle = str_replace("*","",$needle);
echo $haystack "- ".$needle.": ".startsWith($haystack, $needle)."<br>";
}
}
function startsWith($haystack, $needle) {
$length = strlen($needle);
return (substr($haystack, 0, $length) === $needle);
}
为了提高性能,它可能是两个数组排序第一,并在内部foreach
循环添加一个退出条款是个好主意。
顺便说一句,在startWith
-function是从这个伟大的解决方案中的SO:startsWith() and endsWith() functions in PHP
另一种选择是在一个循环中使用preg_grep:
$masks = array('1224*', '543*', '321*' ...);
$data = array('123456789', '123456788', '987654321' ....);
$matches = array();
foreach($masks as $mask) {
$mask = substr($mask, 0, strlen($masks) - 2); // strip off trailing *
$matches[$mask] = preg_grep("/^$mask/", $data);
}
不知道如何有效的,这将是,只是提供它作为替代。
也许在这种情况下使用trie可能会很好。 – mfonda
@mfonda我的英语不太好,我不明白我能用/应该用什么? – canni
请参阅http://en.wikipedia.org/wiki/Trie – mfonda