Найдите разницу между двумя одномерными массивами, чтобы сформировать двумерный массив этих различий в кратчайшие сроки.

Просто измените url на http://localhost вместо localhost. Если вы откроете файл html из локального, вы должны создать локальный сервер для работы с этим html-файлом, самый простой способ - Web Server for Chrome . Это устранит проблему.

0
задан Daniel Wyatt 16 January 2019 в 13:52
поделиться

2 ответа

Вы можете использовать векторы в пространстве имен System.Numerics. Предостережение заключается в том, что он будет работать только с float, а не с double. Это не должно быть проблемой для вычитания:

float[] array1 = new float[] { 1.1F, 2.0F, 3.0F, 4.0F, 5.0F };
float[] array2 = new float[] { 6.1F, 7.0F, 8.0F };    
float[,] final_array = new float[array1.Length, array2.Length];

int vectorCount = array2.Length / 4;
Vector4[] array2Vectors = new Vector4[vectorCount];
Parallel.For(0, vectorCount, i =>
{
    int offset = i * 4;
    array2Vectors[i] = new Vector4(array2[offset], array2[offset + 1],
        array2[offset + 2], array2[offset + 3]);
});

Parallel.For(0, array1.Length, i =>
{
    Vector4 v1 = new Vector4(array1[i], array1[i], array1[i], array1[i]);
    for (int j = 0; j < array2Vectors.Length; j++)
    {
        Vector4 result = Vector4.Abs(Vector4.Subtract(v1, array2Vectors[j]));
        int offset = j * 4;
        final_array[i, offset] = result.X;
        final_array[i, offset + 1] = result.Y;
        final_array[i, offset + 2] = result.Z;
        final_array[i, offset + 3] = result.W;
    }

    for (int j = vectorCount * 4; j < array2.Length; j++)
    {
        final_array[i,j] = Math.Abs(array1[i] - array2[j]);
    }
});

Поскольку вы сейчас используете векторы, вы будете использовать SIMD-инструкции ЦПУ, которые должны ускорить вашу задачу.

Дополнительный прирост производительности достигается за счет параллельного выполнения с Parallel.For, в котором используются все доступные ядра ЦП.

Вы можете попробовать это здесь.

0
ответ дан Sefe 16 January 2019 в 13:52
поделиться

Нет способа сделать это быстрее с точки зрения алгоритмической сложности. Для вычисления этого результата требуется ровно O(n * m) операций, хотя бы потому, что у вас есть результирующий массив этого размера.

Есть несколько способов немного улучшить производительность самого кода.
Самый простой - переключиться на зубчатые массивы, как уже предлагалось в комментариях:

double[] array1 = new double [] { 1.1, 2.0, 3.0, 4.0, 5.0 };
double[] array2 = new double[] { 6.1, 7.0, 8.0};    
double[][] final_array = new double[5][];

for (int i = 0; i < 5; i++)
{
    final_array[i] = new double[3];
    for (int j = 0; j < 3; j++)
    {
        final_array[i][j] = Math.Abs(array1[i] - array2[j]);
    }
}

Подробнее о многомерных массивах и зубчатых массивах и их производительности можно узнать здесь:
Каковы различия между многомерным массивом и массивом массивов в C #?

Вы также можете пойти дальше и повысить производительность, используя небезопасные указатели для доступа к многомерному массиву или используя расширенные инструкции процессора (встроенные) , но ... вопрос в том: это действительно то, что вам нужно думать? Это единственное горлышко бутылки в системе с чрезвычайно высокой нагрузкой? Если это не так, просто оставьте свой код в том виде, в котором он есть, в четко читаемой и понятной форме. Говоря о производительности, O(n * m) асимптотическая сложность отлично подходит для массивов размером 15000.

0
ответ дан Yeldar Kurmangaliyev 16 January 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: