我试图找出如何在C中对多维数据(5维)进行排序。我知道使用5d数组是一种解决方案,来自 阅读关于这个话题的其他帖子很多人发现,如果不是完全不道德的话,那么美学上令人厌恶,以便引发不断的抛射物呕吐...所以我提前道歉。
基本上我有一组传入的数据,我必须应用一系列离散算法。每个算法都有一组变量,我需要计算每个算法的效率排名 变量可能。 最终,我需要一个按最差到最差的算法排序的列表。整体 计算是动态的,因此对于一个传入的数据最有效的方法不太可能是另一个数据的最佳表现...因此我无法消除任何变量,因为它们表现不佳。
以下是数据的外观:
dataValue[ algo ][ lengthVar ][ durationVar ][ plasticityVar ] [ fungibilityVar]
有:
除了按算法排序外,我还希望能够灵活地对5个维度进行排序。
这将使用VS 2010 C(而不是C ++)在具有192 gig(非meg)RAM的12个物理/ 24逻辑核心机器上运行。
我假设qsort是最有效的排序选项。我已经广泛搜索谷歌和SO如何做到这一点无济于事。有1d数组的答案,PHP或C#中的多维数组等,但不适用于C ......或者至少我找不到答案。
答案 0 :(得分:4)
cstdlib中的qsort会起作用。该数组是数据类型 * **数据。
首先,假设您要对数组的第一个索引进行排序。您必须编写比较器函数来比较两个数据类型****。如果ab。
,比较器应返回小于零的值int myComparator(void *a, void *b){
Datatype ****c=(Datatype****)a; Datatype ****d=(Datatype****)b
return algorithmRatingFunction(b)-algorithmRatingFunction(a);
}
这显然效率很低,因为每次比较都必须为每个数据集重新评估算法,但让我们在一秒钟内完成。使用比较器后,您可以对数组进行排序:
qsort(data,35,sizeOf(Datatype),myComparator);
就是这样!
然后就是效率低下的问题......如果algorithmRatingFunction需要很长时间才能完成(我猜它确实如此),那么你想要计算所有35个算法一次且只计算一次。你能做的就是事先计算得分:
int scores[35];
for(int n=0;n<35;n++)
scores[n]=algorithmRatingFunction(data[n]);
然后创建另一个有序整数数组:
int ordering[35];
for(int n=0;n<35;n++)
ordering[n]=n;
因此“排序”的状态对应于数据集的顺序。然后,您可以创建一个新的比较器:
int myFasterComparator(void *a, void *b){
int c=*(int*)a; int d=*(int*)b
return scores[c]-scores[d];
}
并在订购时调用它:
qsort(ordering,35,sizeOf(int),myFasterComparator);
然后使用排序重建数组。像这样:
Datatype ****ordereddata[35];
for(int n=0;n<35;n++)
ordereddata[n]=data[ordering[n]];
对于所有其他级别也是如此。像发布的dasblinkenlight一样,qsort减少了将5d数组排序为比较两个4d数组的问题。因此,不必对每个4d数组进行排序,只需要比较两个3d数组等等。
答案 1 :(得分:2)
我认为你真的需要因为5D效果而拒绝呕吐。改为构造一个结构:
typedef struct {
int algorithm;
int length;
int duration;
int plasticity;
int fungibility;
int dataValue;
} AlgorithmTestData;
然后定义测试数据1D数组:
AlgorithmTestData algoTestCases[NUMBER_OF_TEST_CASES];
或者,如果您不知道malloc
的测试用例的大小,则可以动态分配。
然后根据您的比较要求,您将qsort
algoTestCases 1D阵列。