Сортировка массива 5d в c
Я пытаюсь выяснить, как сортировать многомерные данные (5 измерений) в C. Я знаю, что использование массива 5d является решением, которое из
читая другие сообщения о SO по этой теме, многие люди находят, если не совсем неэтичны, так эстетично отвратительны, чтобы спровоцировать непрекращающуюся рву рвутся... поэтому я заранее извиняюсь.
По существу у меня есть входящий набор данных, к которым я должен применить серию дискретных алгоритмов. Каждый алгоритм имеет набор переменных, и мне нужно рассчитать рейтинг эффективности каждого алгоритма с каждой перестановкой
возможны переменные. В конечном счете, мне нужен список, отсортированный по алгоритму наилучшего в худшем. Целый
вычисление является динамическим, поэтому наилучшее действие на одном входящем фрагменте данных вряд ли будет лучшим исполнителем на другом... поэтому я не могу устранить любую из переменных, потому что они плохие исполнители.
Вот как выглядят данные:
dataValue[ algo ][ lengthVar ][ durationVar ][ plasticityVar ] [ fungibilityVar]
Есть:
- 35 алгоритмов
- 10 переменных длины
- 230 длительности vars
- 27 пластичность vars
- 400 мерных vars
В дополнение к сортировке по алгоритму я хотел бы иметь гибкость для сортировки по любому из 5 измерений.
Это будет работать на 12 физических /24 логических ядрах с 192 гигабайтами (не мега) ОЗУ, используя VS 2010 C (не С++).
Я предполагаю, что qsort будет наиболее эффективным вариантом сортировки. Я искал Google и SO для того, чтобы сделать это безрезультатно. Есть ответы для 1d массивов, многомерных массивов в PHP или С# и т.д., Но не для C... или, по крайней мере, я не могу их найти.
Ответы
Ответ 1
qsort в cstdlib будет работать. Массив данных Datatype ***.
Итак, сначала давайте скажем, что вы хотите отсортировать первый индекс массива. Вам нужно написать функцию компаратора для сравнения двух типов данных ****. Компаратор должен вернуть значение меньше нуля, если 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);
Что это!
Тогда возникает проблема неэффективности... Если алгоритмRatingFunction занимает много времени (что я предполагаю, что это так), то вы хотите вычислить все 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-массива и т.д.
Ответ 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 в соответствии с вашими требованиями к сопоставлению.