Найти пересечение двух многомерных массивов в C # 4.0

#c# #.net-4.0 #multidimensional-array #intersection #ranking

#c# #.net-4.0 #многомерный массив #пересечение #Рейтинг

Вопрос:

Пытаюсь найти решение моей проблемы с ранжированием.

По сути, у меня есть два многомерных массива double [,]. Оба содержат рейтинги для определенных сценариев, поэтому [номер ранга, номер сценария] . Несколько сценариев могут иметь одинаковый ранг.

Я хочу сгенерировать третий многомерный массив, используя пересечения двух предыдущих многомерных массивов для обеспечения совместного ранжирования.

У кого-нибудь есть идея, как я могу это сделать на C #?

Большое спасибо за любые советы или помощь, которые вы можете предоставить!

Редактировать:

Спасибо за все ответы, извините, я должен был включить пример.

Вот оно:

 Array One:
[{0,4},{1,0},{1,2},{2,1},{3,5},{4,3}]

Array Two:
[{0,1},{0,4},{1,0},{1,2},{3,5},{4,3}]

Required Result:
[{0,4},{1,0},{1,2},{1,1},{2,5},{3,3}]
  

Комментарии:

1. Не могли бы вы поделиться примером того, как будут выглядеть массивы с данными и как вы хотите, чтобы они выглядели при объединении?

2. Почему номер ранга является измерением? Разве не было бы достаточно просто иметь массив, где индекс — это сценарий, а значение в индексе — ранг?

3. ДонАндре, я мог бы преобразовать его в это, если нужно? Спасибо

Ответ №1:

Вот несколько примеров кода, который делает кучу предположений, но может быть чем-то вроде того, что вы ищете. Я также добавил несколько комментариев:

     static double[,] Intersect(double[,] a1, double[,] a2)
    {
        // Assumptions:
        //      a1 and a2 are two-dimensional arrays of the same size
        //      An element in the array matches if and only if its value is found in the same location in both arrays
        //      result will contain not-a-number (NaN) for non-matches
        double[,] result = new double[a1.GetLength(0), a1.GetLength(1)];
        for (int i = 0; i < a1.GetLength(0); i  )
        {
            for (int j = 0; j < a1.GetLength(1); j  )
            {
                if (a1[i, j] == a2[i, j])
                {
                    result[i, j] = a1[i, j];
                }
                else
                {
                    result[i, j] = double.NaN;
                }
            }
        }
        return resu<
    }
  

По большей части, поиск пересечения многомерных массивов будет включать перебор элементов в каждом из измерений в массивах. Если индексы массива не являются частью критериев соответствия (мое второе предположение в моем коде удалено), вам придется обходить каждое измерение в каждом массиве, что увеличивает время выполнения алгоритма (в данном случае от O (n ^ 2) до O (n^ 4).

Если вы достаточно заботитесь о времени выполнения, я считаю, что сопоставление массивов является одним из типичных примеров оптимизации динамического программирования (DP); который вы можете прочитать на досуге.

Я не уверен, как вы хотели получить свои результаты…вероятно, вы могли бы вернуть плоскую коллекцию результатов, которые могут быть проиндексированы парой, что потенциально сэкономило бы много места, если ожидаемый набор результатов обычно невелик. Я выбрал третий массив фиксированного размера, потому что это было проще всего сделать.

Наконец, я упомяну, что я не вижу острого способа C # сделать это, используя IEnumerable, LINQ или что-то в этом роде. Кто-то более осведомленный в C #, чем я, может подключиться в любое время….

Комментарии:

1. Фантастический ответ, спасибо. К сожалению, это не совсем то, что мне нужно — полностью моя вина, извините! Я должен был включить пример. Я добавил один сейчас.

Ответ №2:

Учитывая дополнительную информацию, я бы сказал, что на самом деле вы работаете не с многомерными массивами, а с набором пар. Пара — это пара двойников. Я думаю, что следующее должно работать хорошо:

 public class Pair : IEquatable<Pair>
{
    public double Rank;
    public double Scenario;

    public bool Equals(Pair p)
    {
        return Rank == p.Rank amp;amp; Scenario == p.Scenario;
    }

    public override int GetHashCode()
    {
        int hashRank= Rank.GetHashCode();
        int hashScenario = Scenario.GetHashCode();
        return hashRank ^ hashScenario;
    }
}
  

Затем вы можете использовать оператор Intersect для IEnumerable:

 List<Pair> one = new List<Pair>();
List<Pair> two = new List<Pair>();
// ... populate the lists
List<Pair> result = one.Intersect(two).ToList();
  

Ознакомьтесь со следующей статьей msdn о Enumerable.Intersect() для получения дополнительной информации:
http://msdn.microsoft.com/en-us/library/bb910215(v=vs.90).aspx