【问题标题】:python: algorithm - to gather items from meanpython:算法 - 从平均值中收集项目
【发布时间】:2011-11-14 19:14:26
【问题描述】:

不确定这是否是正确的地方,但我有一个与算法有关的问题,我想不出一个有效的算法。 所以想分享我的问题陈述.. :) 为了简化我试图解释的内容,让我创建一个假设示例。

假设,我有一个列表,其中包含一个包含两个东西的对象..

lets say product id and price

现在,这是一个很长很长的清单……有点像清单…… 为此,我定义了三个价格段.. lowprice、midprice 和 highprice 然后是 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 美元......)..那么在这种情况下我应该怎么做.. 如果这不是正确的平台,请原谅我。从问题中您可以看出这更像是一个辩论性问题,而不是“我收到此错误”类型的问题。 谢谢

【问题讨论】:

  • 如果你对N个项目进行排序,然后根据比例,将N分别分成n1:n2:n3会更容易吗?
  • @AlvinK。嗯..这可能是一种解决方案,尽管我无法真正使用我计算出的一些统计数据..但绝对是一个非常棒的例子,说明了一点假设如何导致简单的编程.. :)

标签: python algorithm


【解决方案1】:

您可能正在寻找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),因此该算法将消耗与列表大小相关的线性时间。

【讨论】:

    【解决方案2】:

    方法 1

    如果什么产品属于三个价格段的分配永远不会改变,为什么不简单地构建 3 个列表,一个用于每个价格段中的产品(假设这些集合是不相交的)。 然后你可以从这些列表中随机选择(either with or without replacement - 你喜欢)。每个类别的项目数由比率给出。

    方法 2

    如果产品-价格-细分分配是预先指定的,例如,通过在函数调用时为每个细分传递相应的价格值,您可能希望产品按价格排序并使用二分搜索来选择m-nearest-neighbors(例如)。参数m可以根据比例指定。如果您指定最大距离,您可能会拒绝超出所需价格范围的产品。

    方法 3

    如果需要自主确定产品-价格-段分配,您可以应用您选择的clustering 算法,例如k-means,将您的产品分配到例如k = 3 价格段。对于实际的产品选择,您可以按照上述方式进行。

    【讨论】:

      【解决方案3】:

      您似乎应该尝试使用数据库解决方案,而不是使用列表。查看 sqlite。默认情况下在 Python 中

      【讨论】:

        猜你喜欢
        • 2022-11-15
        • 1970-01-01
        • 2011-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多