лучший алгоритм поиска между массивами - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть проблема, которую мне нужно решить с помощью лучшего алгоритма, который я могу найти.
Позвольте мне сначала описать проблему.У меня есть класс A с номером Hashset<int> с Z количеством элементов

A -> {x,y,z | x = {0,1,2} , y = {-1,0,9} ... }
B -> {x,y,z,k | x = {0,1,-2} , y = {-1,0,19} ... }

...

с входом нового массива int {...} введенный пользователем, результатом должна быть группа с наибольшим количеством хэш-сетов с совпадающими номерами между входом и группами.

Например:

A : {[1,2,3][2,3,8][-1,-2,2]}  
B : {[0,-9,3][12,23,68][-11,-2,2]}

Вход:

[2,3,-19]

result A : {[2,3][2,3][2]}  
result B : {[3][][2]}

A : 3  
B : 2

А правильный ответ.

Или что-то в этом роде.Да, я знаю, что это субъективный вопрос, но для хорошего дела.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2011

Для примера класса HashHolder и его экземпляра A:

public class HashHolder
{
    public HashHolder()
    {
        Hashes = new List<HashSet<int>>();
    }
    public List<HashSet<int>> Hashes { get; set; }
}

Вы можете сгруппировать по хэш-сетам и взять максимальное количество между всеми группами:

var maxHash = A.Hashes.GroupBy(h => h)
               .Select(g => new { Hash = g.Key, Count = input.Count(num => g.Key.Contains(num)) })
               .OrderByDescending(g => g.Count)
               .FirstOrDefault();

Результатом будет maxHash.Hash, если maxhHash не равно нулю.

0 голосов
/ 29 сентября 2011

Предполагая, что у вас есть неизвестное количество выборок для проверки входного набора, этот запрос Linq должен помочь.

from sample in samples
let intersectedSets =
  from set in sample
  let intersection = input.Intersect(set)
  where intersection.Count() > 0
  select intersection
orderby intersectedSets.Count() descending
select intersectedSets;

Самый верхний элемент - это ваш требуемый образец, поэтому yourCollection.First() будетприведите свой набор результатов - В приведенном вами примере:

var samples = new[] {
  new[]{
    new[]{1, 2, 3},
    new[]{2, 3, 8},
    new[]{-1, -2, 2}
  },
  new[]{
    new[]{0, -9, 3},
    new[]{12, 23, 68},
    new[]{-11, -2, 2}
  }
};
var input = new[]{2, 3, -19};

var result =
  (from sample in samples
  let intersectedSets =
    from set in sample
    let intersection = input.Intersect(set)
    where intersection.Count() > 0
    select intersection
  orderby intersectedSets.Count() descending
  select intersectedSets).First();

result.Dump(); // LINQPad extension method
0 голосов
/ 28 сентября 2011

очевидно, вы хотите использовать C # для реализации этого.Я не знаю, является ли это алгоритм best (в любом контексте), но вы можете использовать LINQ, чтобы записать его очень просто и просто:

        int[][] arrays = new[] { new[] { 1, 2 }, new[] { 2, 3 }, new[] {3, 4} };
        int[] input = new[] { 1, 4 };
        Console.WriteLine(arrays.Count((itemarray) => itemarray.Any((item) => input.Contains(item))));

в массиве intМассивы это находит количество массивов, которые имеют хотя бы одно из значений входного массива.это то, что ты делаешь, хотя я не уверен, что это то, о чем ты просишь нас.

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