Arrays 我应该使用哪种算法从多维数组中提取数组?

Arrays 我应该使用哪种算法从多维数组中提取数组?,arrays,algorithm,language-agnostic,Arrays,Algorithm,Language Agnostic,例如,我想从这样的数组中提取子数组,其中arr是一个三维数组,“all”意味着在索引位置选择所有可能的值: getSubArray(arr,[“all”,“all”,1])返回arr的二维切片,其中arr的索引为[“all”,“all”,1] getSubArray(arr,[“all”,2,2])应该从arr返回一个一维数组,其中arr的索引是[“all”,2,2]即使维度的数量是可变的,这似乎相当简单,除非我遗漏了什么 似乎您可以解析第二个参数,找出结果的维度,然后将数据复制到结果中。复制数

例如,我想从这样的数组中提取子数组,其中
arr
是一个三维数组,
“all”
意味着在索引位置选择所有可能的值:

getSubArray(arr,[“all”,“all”,1])
返回arr的二维切片,其中
arr
的索引为
[“all”,“all”,1]


getSubArray(arr,[“all”,2,2])
应该从
arr
返回一个一维数组,其中
arr
的索引是
[“all”,2,2]

即使维度的数量是可变的,这似乎相当简单,除非我遗漏了什么


似乎您可以解析第二个参数,找出结果的维度,然后将数据复制到结果中。复制数据并不困难,因为您可以只找到
arr
子数组的长度,或者如果语言不支持它,您可以将维度作为参数传入

一个相对简单的方法是将此任务作为维度
N
的K元组到维度
M
的K元组的递归映射来处理。由于这与语言无关,因此需要在目标语言中提供以下功能:

  • 给定
    N
    -dim数组的实例,查找
    N
  • 给定
    N
    -dim数组和
    k
    的实例,查找维度
    k
  • 给定一个
    N
    -dim数组
    A
    的实例和一个
    N
    整数
    I
    的向量,在向量中的索引定义的位置获取或设置项。例如,如果向量是
    I={2,3,4}
    ,则需要进行从三维数组
    A
    和向量
    I
    获取
    A[2,3,4]
    的操作
  • 给定一个定义维度的大小为
    M
    的向量
    D
    ,需要一个操作来构造
    M
    维度的数组,每个维度取向量中对应项的大小。例如,如果向量
    D={3,4}
    ,则需要一个操作来创建维度为3和4的二维数组
  • 通过构建向量
    F
    D
    对请求进行预处理,如下所示:

    • 对于位于请求的
      i
      位置的每个
      “所有”
      项目,
      F[i]=-1
      D[i]=尺寸(尺寸[i])
    • 对于请求的位置
      i
      处的每个数字项
      k
      F[i]=k
      D[i]=0
    • 通过获取所有非固定索引并将其传递给数组构造函数(上述第四个先决条件),为结果创建一个数组
    现在,递归过程看起来应该相对简单:

    void RecursiveCopy(Vector F, Vector D, Array S, Vector SI, int sp, Array T, Vector TI, int tp) {
        if (pos != TS.size) {
            if (F[sp] != -1) {
                // This is an "all" dimension
                for (int i = 0 ; i != D[sp] ; i++) {
                    SI[sp] = i;
                    TI[tp] = i;
                    RecursiveCopy(F, D, S, SI, sp+1, T, TI, tp+1);
                }
            } else {
                // This is a fixed dimension
                SI[sp] = F[sp];
                RecursiveCopy(F, D, S, SI, sp+1, T, TI, tp);
            }
        } else {
            // Read from the source at indexes defined by vector SI
            var value = S.get(SI);
            // Write to the destination at indexes defined by vector TI
            T.setValue(TI, value); // Prerequisite 3
        }
    }
    
    您的
    getSubarray
    如下所示:

    Array getSubarray(Array S, Vector<string> request) {
        Vector F = Vector[S.Size]; // The number of dimensions in A; prerequisite 1
        Vector D = Vector[S.Size]; // The number of dimensions in A
        Assert(request.Size == S.Size); // Request must have N items
        int k = 0;
        Vector resDim;
        for (int i = 0 ; i != req.Size ; i++) {
            if (req[i] == "all") {
                k++;
                F[i] = -1;
                D[i] = A.dimensionOf(i); // Prerequisite 2
                resDim.Add(D[i]);
            } else {
                F[i] = ParseInteger(req[i]);
                D[i] = -1;
            }
        }
        Array T = Array(resDim); // Prerequisite #4
        Vector SI = Vector[S.Size];
        Vector TI = Vector[k];
        RecursiveCopy(F, D, S, SI, 0, T, TI, 0);
        return T;
    }
    
    Array getSubarray(数组,向量请求){
    Vector F=Vector[S.Size];//A中的维数;先决条件1
    向量D=向量[S.Size];//图中的维数
    断言(request.Size==S.Size);//请求必须有N个项
    int k=0;
    向量重调;
    for(int i=0;i!=req.Size;i++){
    如果(请求[i]=“全部”){
    k++;
    F[i]=-1;
    D[i]=A.dimensionOf(i);//前提条件2
    增加(D[i]);
    }否则{
    F[i]=ParseInteger(req[i]);
    D[i]=-1;
    }
    }
    数组T=Array(resDim);//前提条件#4
    向量SI=向量[S.Size];
    向量TI=向量[k];
    递归复制(F,D,S,SI,0,T,TI,0);
    返回T;
    }
    
    除非维度的数量是可变的,否则这是非常直截了当的。我需要为这个问题找到一个更好的标题:我试图找到一个清晰明确的标题,但我想不出一个。这里的问题几乎完全是语言固有的,它们通常不是算法问题。声明和实现返回变量维数组的函数/方法是特定于语言的,甚至很难用与语言无关的术语来理解。也许可以尝试将其重新发布为对特定语言的请求?@rbaryyoung我认为我可以实现一个特定于语言的算法来解决这个问题,而不会有太多困难:解决方案可能是一个简单的递归函数,它将数组、索引列表和当前索引位置作为输入。我一找到解决方案就发布。@RBarryYoung你说解决方案很简单:你想到了哪种特定的算法?具体来说,应该复制哪些数据,应该从哪些索引中复制?我想你应该从没有指定的索引中复制所有数据。在第二个示例中,getSubArray(arr,[“all”,2,2])您希望复制所有有效i的值arr[i][2][2](您可以通过执行arr.length获得),当然,实现这是另一个交易,但是如果你想数组的维数是可变的,我不认为这真的是语言不可知的,因为至少对于类型化语言来说,你可能会在给参数typesIs时遇到一些麻烦,这个解决方案是用伪代码编写的,或者它是一种特定的编程语言?@AndersonGreen这是一种伪代码,使用类似于Java/C的语法和虚构的数据类型(例如,所有向量都是一维数组)。与语言无关的版本要比C#或Java版本困难得多,因为我可以编写代码而不是列出假设
    ?@AndersonGreen看一下更新-我添加了用于预处理和进行初始递归调用的伪代码。