假设有一个锦标赛即将举行,你必须帮助建立。你知道吗
本次锦标赛共有N支球队,名单如下:
teams = [Team1, Team2, ..., TeamN]
在每支球队中,可以有1-3名球员,每个人都是从自己的球员名单中挑选出来的。你知道吗
假设每个列表都代表了可能的领导者、新手和助手。你知道吗
每个团队必须有一个领导者,但可能没有潜在的新人或助手。你知道吗
例如,Team1可能看起来像
Team1.Leaders = [Leader1, Leader2, ..., LeaderX1]
Team1.Rookies = [Rookie1, Rookie2, ..., RookieX2]
Team1.Helpers = [Helper1, Helper2, ..., HelperX3]
或者它可能有一个新手或助手的空列表,或者两者都有。你知道吗
每个团队、领导者、新手和助手的列表可能有不同的大小。你知道吗
您必须为每个团队选择一个领导者,并且可以选择一个菜鸟或一个助手,或者两者都选择,这取决于菜鸟和助手是否存在。(同样,每队可挑选1-3名球员)
为每一队挑选球员的所有方法列出一个组合列表。你知道吗
例如
Team1 = Team()
Team1.Leaders = [Leader1, Leader2]
Team1.Rookies = [Rookie1]
Team1.Helpers = []
Team2 = Team()
Team2.Leaders = [Leader3]
Team2.Rookies = []
Team2.Helpers = [Helper1, Helper2]
combinations = team_combinations(teams)
组合的预期输出如下所示:
[{"Team1":[Leader1, Rookie1], "Team2":[Leader3, Helper1]},
{"Team1":[Leader1, Rookie1], "Team2":[Leader3, Helper2]},
{"Team1":[Leader2, Rookie1], "Team2":[Leader3, Helper1]},
{"Team1":[Leader2, Rookie1], "Team2":[Leader3, Helper2]}]
每个字典都是你如何选择玩家的组合。你知道吗
我正在努力使获得组合的过程尽可能快,你可以想象,当有许多球员,你可以选择,你甚至可能有数百万不同的组合。你知道吗
我尝试过使用递归,其中基本情况是len(teams)==1,递归步骤是其他步骤。我成功地创建了一个可以工作的函数,但是获取组合的过程甚至需要一个小时才能完成。你知道吗
什么是获得组合的最快方法? 使用itertools会有帮助吗? 有没有更快的方法?你知道吗
首先,你只能做一件事来降低问题的复杂性——减少团队和球员的数量。这是可靠地加速代码的一种可靠方法。你知道吗
另一方面,如果组合的总数小于
10**9
,任何微观优化都变得非常重要。使用低级编程语言也是一种选择。至于Python,我要强调以下几点:tuple
作为leaders
、rookies
和helpers
的类型。它有相当快的迭代器并允许避免数据的隐式复制(例如在itertools.product
)sys.getrecursionlimit()
。你知道吗for
-循环代替堆栈for
-循环。你知道吗这是一个小草图。我写的所有类都没有
__init__
,应该用具体的实现来继承。你知道吗我已经编写了三个获得所有团队笛卡尔积的基本实现:
_product_producer
、_compiled_producer
和_stack_producer
。要选择其中一个,我们需要知道我们拥有的内存的近似值。这就是为什么我们需要声明combs_size
,_free_memory
,_max_effective_teams_length
,_min_required_memory_multiplier
,teams_combs_size
。你知道吗内部的
_teams
应该是私有的,因为生成的组合的顺序取决于团队的顺序。为了优化生产商,我们可能需要度假团队。你知道吗_configure_cache
可以在__init__
内部的某个地方调用,但对我来说似乎是错误的,因为初始化不应该太长。如果你想的话也可以扔掉。你知道吗以下是一些测试:
是的。你知道吗
相关问题 更多 >
编程相关推荐