Подтвердить что ты не робот

Сортировка массива 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... или, по крайней мере, я не могу их найти.

4b9b3361

Ответ 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 в соответствии с вашими требованиями к сопоставлению.