Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从多个列表或数组中搜索/筛选(可能有几十亿个)项目组合的最佳方法_C#_Search_Optimization_Multidimensional Array_Data Structures - Fatal编程技术网

C# 从多个列表或数组中搜索/筛选(可能有几十亿个)项目组合的最佳方法

C# 从多个列表或数组中搜索/筛选(可能有几十亿个)项目组合的最佳方法,c#,search,optimization,multidimensional-array,data-structures,C#,Search,Optimization,Multidimensional Array,Data Structures,我正试图编写一个程序来优化游戏的设备配置。问题如下: 角色有六个不同的装备槽来放置物品。这由代码中每个插槽的6个单独项目列表表示,其中包含玩家所有的所有设备 该程序将为每个可能的装备组合(每个列表中的1个)计算角色的总统计信息。这些计算出的统计数据可以通过特定的统计数据最小/最大值进行过滤,然后还可以通过特定统计数据进行排序,以精确定位角色的特定目标统计数据集 程序应该能够在不耗尽内存或不花费数小时的情况下执行这些查询,当然,主要问题是筛选数十亿种可能的组合 我不确定实现这一点的任何支持数据结构

我正试图编写一个程序来优化游戏的设备配置。问题如下:

  • 角色有六个不同的装备槽来放置物品。这由代码中每个插槽的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)。这篇文章对优化和备选方案有一些想法,包括您正在考虑的减少搜索空间的想法。