C# 从多个列表或数组中搜索/筛选(可能有几十亿个)项目组合的最佳方法
我正试图编写一个程序来优化游戏的设备配置。问题如下:C# 从多个列表或数组中搜索/筛选(可能有几十亿个)项目组合的最佳方法,c#,search,optimization,multidimensional-array,data-structures,C#,Search,Optimization,Multidimensional Array,Data Structures,我正试图编写一个程序来优化游戏的设备配置。问题如下: 角色有六个不同的装备槽来放置物品。这由代码中每个插槽的6个单独项目列表表示,其中包含玩家所有的所有设备 该程序将为每个可能的装备组合(每个列表中的1个)计算角色的总统计信息。这些计算出的统计数据可以通过特定的统计数据最小/最大值进行过滤,然后还可以通过特定统计数据进行排序,以精确定位角色的特定目标统计数据集 程序应该能够在不耗尽内存或不花费数小时的情况下执行这些查询,当然,主要问题是筛选数十亿种可能的组合 我不确定实现这一点的任何支持数据结构
Weapons List
|
-----Armor List
|
------Helm List... etc
树的每一层都会保留一个字典,其中包含每个列表中1个项目的ID,并逐步计算角色的属性(当角色穿过树时,从武器+盔甲+头盔中简单添加属性,等等…)
当应用了最小/最大过滤器的任何stat到达该stat的边界时(即,如果stat在到达树的底层之前超过了最大值,它将从字典中删除该“路径”,从而从遍历中删除可能结果的整个分支)
这里的主要目标是减少搜索算法可能要遍历的树路径,并在树需要计算它们之前删除尽可能多的无效结果,以使搜索尽可能快,并避免任何浪费的循环。在基于“最大”过滤器删除项目时,这似乎非常简单,因为当逐步添加每个项目的统计数据时,我们可以快速判断统计数据何时超过了预期的最大值——但是当涉及到基于最小总统计数据的停止路径时,我不知道如何预测和删除这些路径,这些路径到第六项时不会超过最小值
为了简化这个想法,可以这样想:
我有3个数字数组
[X][0][1][2]
[0] 5 3 2
[1] 1 0 8
[2] 3 2 7
[3] 2 1 0
我想从3个数组(和)中找出最小值为9,最大值为11的所有组合。
每个数组必须选择至少但不超过1项,并且这些选定值的总和就是要搜索的内容。这需要能够扩展到搜索6+个数组,每个数组包含40+个值。上述方法是否正确,或者最好的解决方法是什么(主要是使用c#)您应该能够通过使用每个插槽的下限和上限筛选出大量项目:
var minimum = slots.Sum(slot => slot.Minimum);
var maximum = slots.Sum(slot => slot.Maximum);
foreach (var slot in slots)
{
var maxAvailable = maximum - slot.Maximum;
var minAvailable = minimum - slot.Minimum;
var filtered = slot.Items
// If we choose the strongest item in all the other slots and it's still below the minimum
.Where(item => item.Value + maxAvailable >= request.MinimumValue)
// If we choose the weakest item in all the other slots and its still above the maximum
.Where(item => item.Value + minAvailable <= request.MaximumValue);
}
var-minimum=slot.Sum(slot=>slot.minimum);
var max=slot.Sum(slot=>slot.max);
foreach(插槽中的var插槽)
{
var maxAvailable=最大值-插槽.max;
var minAvailable=最小值-插槽最小值;
var filtered=slot.Items
//如果我们在所有其他插槽中选择最强的项目,但它仍然低于最小值
.Where(item=>item.Value+maxAvailable>=request.MinimumValue)
//如果我们在所有其他插槽中选择最弱的项目,并且它仍然高于最大值
.Where(item=>item.Value+m可用的好问题!您当前使用的是多维数组[x,y]
还是数组[x][y]
?后者通常要快得多,上面有一篇很好的文章可以让您开始。@Performalj虽然C#锯齿阵列比多维阵列快,但速度差是一个单位数的因素。OP的问题是组合的。使用更快的阵列实现不会节省足够的时间来降低这种性能问题。因此,基本上您希望从数组中识别所有有效的项组合。如果您有n个数组,每个数组有k个项,那么最坏的情况复杂性是O(n^k)。这篇文章对优化和备选方案有一些想法,包括您正在考虑的减少搜索空间的想法。