#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