不确定这是否是正确的地方,但我有一个与算法相关的问题,我不能想到一个有效的算法。 所以想到分享我的问题陈述.. :) 为了简化我想要解释的内容,让我创建一个假设的例子。
假设,我有一个列表,其中包含一个包含两件事的对象..
lets say product id and price
现在,这是一个很长的清单......像库存一样...... 除此之外,我已经定义了三个价格段......低价,中价和高价 然后是k1,k2,k3,其中k1,k2和k3是比率。 因此,现在的工作是,我必须从这个庞大的库存中收集产品,以便从低价格范围中获得n1种产品,来自中等价格范围的n2种产品和来自高价格范围的n3种产品......其中n1:n2: n3 == k1:k2:k3
现在,我如何有效地实现以下目标。 我的目标是低价位是100美元 我必须收集这个系列的20个产品.. 中间价格范围大概是500美元 等等
所以我从100美元开始..然后寻找90到100之间以及100到110之间的项目 假设我在区间1低(90,100)中找到5个产品,在区间1高(100,110)中找到2个产品 然后,我进入下一个低间隔和下一个高间隔。 我继续这样做,直到我得到这个时间间隔内的产品数量。
我该怎么做?还有一种情况,特定价格范围内的产品数量少于我需要的数量......(也许中间价格范围是105美元......)所以在这种情况下该怎么做.. 请原谅我,如果这不是正确的平台..从问题可以看出,这更像是一个辩论性问题,而不是“我得到这个错误”类型的问题。 感谢
答案 0 :(得分:2)
您可能正在寻找selection algorithm。
首先找到n1
'最小元素,将其设为e1
,下限列表是所有元素element <= e1
。
对其他范围做同样的事情。
下界列表的伪代码:
getLowerRange(list,n):
e <- select(list,n)
result <- []
for each element in list:
if element <= e:
result.append(element)
return result
注意如果有许多“相同”的项目[结果将是一个更大的列表],此解决方案将失败,但找到这些项目并将其从结果列表中删除并不难。
请注意,选择算法为O(n)
,因此此算法将消耗与列表大小相关的线性时间。
答案 1 :(得分:2)
方法1
如果分配哪些产品属于三个价格段永远不会改变,为什么不简单地建立3个列表,一个用于每个价格段中的产品(假设这些集合是不相交的)。 然后你可以随机选择这些列表(either with or without replacement - 如你所愿)。每个班级的项目数量由比率给出。
方法2
如果要预先指定产品 - 价格 - 细分 - 分配,例如,通过在函数调用中传递每个细分的相应价格值,您可能希望按价格对产品进行排序并使用二进制搜索来选择m-nearest-neighbors(例如)。可以根据比率指定参数m
。如果您指定了最大距离,则可以拒绝超出所需价格范围的产品。
方法3
如果需要自主确定产品价格段分配,您可以应用所选的clustering算法,例如k-means,将产品分配到k = 3
价格段。对于实际的产品选择,您可以按上述方式进行类似的操作。
答案 2 :(得分:0)
您似乎应该尝试使用数据库解决方案,而不是使用列表。看看sqlite。默认情况下它在Python中