搜索数组以获得最密钥匹配

时间:2014-02-22 12:42:30

标签: php arrays algorithm sorting search

有更好/更优雅/更有效的方法吗?

我有一个数组,我正在搜索键的值,这些值匹配或者是小于搜索值的最大值。希望这是有道理的。

我当前的方法是一种蛮力尝试,对于一小部分数据来说很好,但是这个函数需要用大数组运行多次。

$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

提前致谢

2 个答案:

答案 0 :(得分:0)

查看您的数据,看起来您的数组已排序。如果不是,请坚持下去。如果没有完全匹配,我认为快速获得结果的方法是bisection(也称为二分搜索或二分法)。伪代码:

在数组中间取一个键。    如果密钥不如您的搜索,请搜索以此密钥开头的子数组    如果密钥优于您的搜索,请搜索以此密钥结尾的子数组    重复,直到数组大小为1。

像这样:

  +----------------------------------------------------------------------------------------+
  |                                                                                        |
  +----------------------------------------------------------------------------------------+
  +----------------------------------------+ +---------------------------------------------+
  |                                        | |                                             |
  +----------------------------------------+ +---------------------------------------------+
  +------------------+ +-------------------+
  |                  | |                   |
  +------------------+ +-------------------+
                       +--------+ +--------+
                       |        | |        |
                       +--------+ +--------+
                       +---++---+
                       |   ||   |
                       +---++---+
                       +-+
                       | |
                       +-+

                      desired value

警告:不要,我再说一遍,不要搜索谷歌图片的二分法。这很疼。

答案 1 :(得分:0)

使用修改后的二进制搜索。一个样本在这里 - modify binary search to find the next bigger item than the key;可以轻松定制,以满足您的需求。