在c中排序5d数组

Pae*_*ula 12 c sorting qsort multidimensional-array

我试图找出如何在C中对多维数据(5维)进行排序.我知道使用5d数组是一个解决方案,通过阅读关于此主题的其他帖子,许多人发现,如果不是完全不道德的,那么美学上令人厌恶,以便引发不断的抛射物呕吐...所以我提前道歉.

基本上我有一组传入的数据,我必须应用一系列离散算法.每个算法都有一组变量,我需要计算每个算法效率的排名,每个变量的排列都是可能的.最终,我需要一个按最差到最差的算法排序的列表.整个计算是动态的,因此对于一个传入的数据最有效的方法不太可能是另一个数据的最佳表现者......所以我无法消除任何变量,因为它们表现不佳.

以下是数据的外观:

dataValue[ algo ][ lengthVar ][ durationVar ][ plasticityVar ] [ fungibilityVar]
Run Code Online (Sandbox Code Playgroud)

有:

  • 35个算法
  • 10个长度变量
  • 230持续时间的变种
  • 27个可塑性变量
  • 400个可替代性变种

除了按算法排序之外,我还希望能够灵活地对5个维度中的任何维度进行排序.

这将使用VS 2010 C(非C++)在具有192 gig(非meg)RAM的12个物理/ 24逻辑核心机器上运行.

我假设qsort将是最有效的排序选项.我已经广泛搜索谷歌和SO如何做到这一点无济于事.有1d数组的答案,PHP或C#中的多维数组等,但不适用于C ...或者至少我找不到一个.

小智 4

cstdlib 中的 qsort 可以工作。该数组是数据类型* **data。

首先,假设您要对数组的第一个索引进行排序。您必须编写一个比较器函数来比较两个数据类型****。如果 ab,比较器应返回一个小于零的值。

int myComparator(void *a, void *b){
    Datatype ****c=(Datatype****)a; Datatype ****d=(Datatype****)b
    return algorithmRatingFunction(b)-algorithmRatingFunction(a);
}
Run Code Online (Sandbox Code Playgroud)

这显然效率低下,因为您必须在每次比较时重新评估每个数据集的算法,但让我们稍后讨论。有了比较器后,您可以对数组进行排序:

qsort(data,35,sizeOf(Datatype),myComparator);
Run Code Online (Sandbox Code Playgroud)

就是这样!

然后就是效率低下的问题......如果algorithmRatingFunction需要很长时间才能完成(我猜确实如此),那么您只想计算所有35种算法一次且仅一次。你可以做的是预先计算分数:

int scores[35];
for(int n=0;n<35;n++)
    scores[n]=algorithmRatingFunction(data[n]);
Run Code Online (Sandbox Code Playgroud)

然后创建另一个有序整数数组:

int ordering[35];
for(int n=0;n<35;n++)
    ordering[n]=n;
Run Code Online (Sandbox Code Playgroud)

因此“排序”的状态对应于数据集的顺序。然后,您可以创建一个新的比较器:

int myFasterComparator(void *a, void *b){
    int c=*(int*)a; int d=*(int*)b
    return scores[c]-scores[d];
}
Run Code Online (Sandbox Code Playgroud)

并在订购时调用它:

qsort(ordering,35,sizeOf(int),myFasterComparator);
Run Code Online (Sandbox Code Playgroud)

然后使用排序重建数组。像这样:

Datatype ****ordereddata[35];
for(int n=0;n<35;n++)
    ordereddata[n]=data[ordering[n]];
Run Code Online (Sandbox Code Playgroud)

对于所有其他级别也是如此。就像 dasblinkenlight 发布的那样,qsort 将 5d 数组的排序问题减少为比较两个 4d 数组的问题。因此,您不必对每个 4d 数组进行排序,而只需比较两个 3d 数组等。