【发布时间】:2015-08-27 15:42:54
【问题描述】:
偶尔,我的妻子带着我的购物清单带我去一家真正的超市(她给我写了一张纸,或者给我发短信)。
我想知道是否有一种快速填充列表的方法,无需重复整个 super 数十次,直到我相信我已经掌握了一切。
(我发现这个问题对生活很有帮助:pair-socks-from-a-pile-efficiently,希望我能在我自己的情况下使用社区的帮助)
我不知道/不记得每件商品在超市中的位置,而且我得到的列表从未排序(例如,蔬菜列在整个列表中,而不是一个接一个)。另外,当我还在超级市场时,通常我会不断收到短信,说明要购买的物品越来越多。
我的方法是规划一条路径,确保我遍历整个超市,并在走这条路径时从列表中挑选商品。
我想到了两种方式:
- foreach 项目在超级
(n)我通过:检查我的列表中是否有这样的项目(m),会给我一个O(n*m)同谋,效率不高。李> - 将商店“划分”为行
(p):站在每一行的开头我可以阅读标志或查看我应该在那里找到哪种物品,而不是迭代我的列表,试图记住列表中的所有项目 I应该在该行中找到。比走那排并将这些物品添加到我的购物车,应该给我O(p*m)同谋。 但这从未真正发生过:我不记得我希望在该行中找到的列表中的四个项目中的三个以上,即使我记得,我也经常忘记一个项目并且有再次使用此算法(比如说q次),结果为:O(q*p*m)。
我想补充几个cmets:
- 例如,当我来到蔬菜区时,我发现自己多次翻阅该区,因为我的妻子是一位出色的厨师,并且在列表中添加了各种蔬菜
(v)。当然,我不记得所有这些蔬菜了,我宁愿在市场上的每一种蔬菜旁边停下来(或者我应该?),检查我的清单中是否有它。 - 划掉我放入购物车的每件物品(或用我仍然没有的所有物品制作一个新清单)对我来说非常耗时,所以我宁愿每次都检查整个清单尝试查找我是否还有要添加到购物车的商品。
- 另一种情况是您在去家庭度假之前第二次上车。你记得你忘了拿这个,虽然,跑回你家,拿了一些这些东西,忘记了其他的,然后又回去了。是不是类似情况?
【问题讨论】:
-
如果你能得到与商店布局相对应的购物清单,那将是一个巨大的帮助(我在这里说的是现实生活,不一定是算法)
-
@kaveman。肯定会有所帮助,但超级用户通常会更改其布局,以让我们对整个商店感到好奇。
-
只要你不忘记在每个过道中为每个过道中的每个物品获得一次什么,那么你的 O(qpm) 仍然比 O(nm) 好。还假设至少有一个过道您不需要任何东西,p(您访问的过道)将小于 P(存在的过道),可能完全否定 q。如果你走下一行,忘记了十次,它仍然比走下十行,检查 n/p 项目,以确认你不需要任何东西更有效。
-
+1 只是为了有效地提到一对袜子。我第一次遇到它,让我很开心。
-
现实生活中的答案:在线购物(例如美国的walmart.com/cp/food/976759)。否则,诸如在您去时添加项目,一次三个项目的内存限制等限制确实使这变得困难。我这样说是因为我有同样的问题......