如何选择具有最小日期差异的选择行

时间:2010-10-03 10:24:28

标签: php mysql arrays algorithm

这个问题很难说。希望这是有道理的。

我的库存中有一个项目表。

我们称之为Apple,Orange,Pear,Potato。我想挑一篮水果(1 x Apple,1 x Orange,1 x Pear)。

INVENTORY中的每个项目都有不同的可用日期。所以...

  1. Apple JANUARY
  2. Apple FEBRUARY
  3. Apple MARCH
  4. 橙色 APRIL
  5. Apple APRIL
  6. MAY
  7. 我不想按照它们在广告资源中显示的顺序选择项目。相反,我想根据可以挑选所有项目的最小日期范围来选择它们。即橘子&苹果在APRIL和梨在五月。

    我不确定这是否是MYSQL或某些PHP数组的问题。我很难过。提前谢谢。

3 个答案:

答案 0 :(得分:1)

如果水果数组尚未按日期排序,请对其进行排序。

现在,简单的O(n ^ 2)解决方案是检查所有可能的范围。没有特定语言的伪代码:

for (int i = 0; i < inventory.length; ++i)
    hash basket = {}
    for (int j = i; j < inventory.length; ++j) {
        basket.add(inventory[j]);
        if (basket.size == 3) { // or whatever's the number of fruits
            // found all fruits
            // compare range [i, j] with the best range
            // update best range, if necessary
            break;
        }
    }
end

你可能会发现它已经足够了 或者你可以写一些更复杂的O(n)解决方案。它只是一个滑动窗口[first, last]。在每一步中,我们移动左边界(不包括篮子中的一个水果)或右边(在篮子中添加一个水果)。

int first = 0;
int last = 0;
hash count = {};
count[inventory[0]] = 1;

while (true) {
    if (count[inventory[first]] > 0) {
        --count[inventory[first]];
        ++first;
    } else if (last < inventory.length) {
        ++last;
        ++count[inventory[last]];
    } else {
        break;
    }

    if (date[last] - date[first] < min_range
            && count.number_of_nonzero_elements == 3) {
        // found new best answer
        min_range = date[last] - date[first]
    }
}

答案 1 :(得分:0)

鉴于您的表库存是结构化的:

fruit, availability
apple, 3 // apples in march

//user picks the availability month maybe?
$this_month = 5 ;

//or generate it for today
$this_month = date('n') ;

// sql

"select distinct fruit from inventory where availability = $this_month";

答案 2 :(得分:0)

听起来很复杂。我将解决问题的方法是将每个水果分组到其可用月份组中,并查看每组中有多少水果。

  1. 1月(1)
  2. 2月1日
  3. MARCH(1)
  4. APRIL(2)
  5. MAY(1)
  6. 要看到最多的水果属于APRIL。所以APRIL因此是我们的首选月份。

    然后我会删除带有重复项的几个月的项目(在您的示例中为苹果),这将删除MARCH作为选项。此步骤可以立即完成,也可以在下一步之后完成,具体取决于您的数据和获得的结果。

    然后我会看下一个最受欢迎的月份并计算当月的距离(例如,JAN距离APRIL 3,MARCH是1等)。如果你有一个平局,那么你选择哪个并不重要。在这个例子中,尽管你最终会根据你的要求选择APRIL中的2个水果和来自MAY的1个水果。

    如果最受欢迎的月份实际上并未导致“最佳”选择,则此方法可能无效。