【问题标题】:Finding top 3 products in lists with sub-lists在带有子列表的列表中查找前 3 个产品
【发布时间】:2022-01-25 17:29:48
【问题描述】:

我正在尝试找到比当前的蛮力解决方案更快的解决方案,该解决方案假定循环遍历所有元素并且在较大的列表中效率极低。

更具体地说,我有一个包含 N 个元素的列表。这些元素中的每一个都有另一个可变数量的元素列表。我们的目标是找出所有列表中的前 3 个产品,因为任何时候都只能使用任何列表中的一个数字。

例如,如果我们有列表(字典):

MAIN LIST: {'a':0.97,'b':0.88,'c':0.77}
A SUB-LIST: {'a1':0.68,'a2':0.13,'a3':0.04}
B SUB-LIST: {'b1':0.77,'b2':0.66,'b3':0.02}
C SUB-LIST: {'c1':0.99,'c2':0.92,'c3':0.13}
RESULT: 1.c*c1 2.c*c2 3.b*b1

我想从所有可能的产品中获得最高的数字。对列表进行排序、遍历所有元素并将它们添加到具有前 3 个项目的临时列表是当前的解决方案,但在处理具有超过 1,000 个元素的列表时会出现问题。

鉴于每个列表的长度可能超过 1000 个元素,有谁知道此处可能使用的任何类型的算法?

或者,如果在良好的时间复杂度下无法找到 3 - 您是否知道任何可能用于查找的算法,例如在所有列表中排名前 1 的产品?

【问题讨论】:

  • 您是否可以更改这些值的存储方式和接收方式,或者这是您无法控制的?
  • 有一种方法,如果需要的话。我基本上是自己创建这些列表/字典。重点是找到具有最高产品的子列表的前 3 个键。
  • 主列表中有多少键?像a,b,c ...?只是aa1a2或a3...配对?
  • 它们只能与自己的种类相乘,或者你可以有例如c * b1?
  • @ferdy 主列表中键(元素)的数量可能会有所不同。假设它是 N。

标签: python algorithm math optimization


【解决方案1】:

您可以通过获取每个前缀字母的前 3 个来减少乘法(使用 heapq nlargest)

然后将这些因素应用到前 3 名列表中,并从中选出前 3 名。

类似

from heapq import nlargest

# group the sub list by their key letter
sub_lists = dict()
for sl in [A,B,C]:
    k = next(iter(sl))[0]
    sub_lists.setdefault(k,[]).extend(sl.items())

top3s = [ (pk,pv*main_list[k]) for k,prods in sub_lists ] 
          for pk,pv in nlargest(3,prods,key=lambda kv:kv[1]) ]

top3 = nlargest(3,top3s,key=lambda kv:kv[1])

注意:你没有提供任何代码或数据,所以我无法实际测试这个

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2017-08-10
    • 2012-03-31
    相关资源
    最近更新 更多