有更好/更优雅/更有效的方法吗?
我有一个数组,我正在搜索键的值,这些值匹配或者是小于搜索值的最大值。希望这是有道理的。
我当前的方法是一种蛮力尝试,对于一小部分数据来说很好,但是这个函数需要用大数组运行多次。
$needle = '2013-04-04';
$haystack = array (
'2013-01-01' => 1,
'2013-04-03' => 2,
'2013-04-05' => 3,
'2013-07-23' => 4,
'2013-09-12' => 5,
'2013-10-18' => 6,
'2013-11-01' => 7
);
krsort($haystack);
foreach ($haystack as $k => $v)
{
$possibleMatch = $k;
if ($needle >= $k) break;
}
return $possibleMatch
提前致谢
答案 0 :(得分:0)
查看您的数据,看起来您的数组已排序。如果不是,请坚持下去。如果没有完全匹配,我认为快速获得结果的方法是bisection(也称为二分搜索或二分法)。伪代码:
在数组中间取一个键。 如果密钥不如您的搜索,请搜索以此密钥开头的子数组 如果密钥优于您的搜索,请搜索以此密钥结尾的子数组 重复,直到数组大小为1。
像这样:
+----------------------------------------------------------------------------------------+
| |
+----------------------------------------------------------------------------------------+
+----------------------------------------+ +---------------------------------------------+
| | | |
+----------------------------------------+ +---------------------------------------------+
+------------------+ +-------------------+
| | | |
+------------------+ +-------------------+
+--------+ +--------+
| | | |
+--------+ +--------+
+---++---+
| || |
+---++---+
+-+
| |
+-+
desired value
警告:不要,我再说一遍,不要搜索谷歌图片的二分法。这很疼。
答案 1 :(得分:0)
使用修改后的二进制搜索。一个样本在这里 - modify binary search to find the next bigger item than the key;可以轻松定制,以满足您的需求。