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看一下更新-我添加了用于预处理和进行初始递归调用的伪代码。