2011-12-02 10 views
1

У меня есть много списков, и я хочу сравнить их и получить лучшие пары. Если два разных числа существуют вместе в списке, они являются парами.Как сравнить списки и эффективно использовать наиболее часто используемые пары?

Список 1 => 1 4 5 6 0 7

Список 2 => 2 3 8 6 1 9

Список 3 => 4 7 1 3 5 6

Пары

1,6 - 3 раза (песни1, песни2, песни3) Лучшие пара

1,5 - 2 раза (песни1, песни3)

4,5 - 2 раза (песни1, List3)

2,3 - 1 раз (только) List2

Как эффективно сделать это?

Примечание: В списке нет такого же числа. Все числа различаются в списке.

+1

Что вы устали и что означает «пара» в этом контексте? – soulcheck

+0

Какой язык программирования вам нужен? – ChrisBD

+0

Я хочу этого в C#. – onurbaysan

ответ

0

Вы используете списки как наборы. Чтобы лучше совместить использование, сначала отсортируйте все списки и удалите дубликаты (или используйте установленную структуру данных, если они доступны).

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

+0

Я обновил вопрос. В каждом списке нет одинаковых значений. Вы можете принять этот список как установленный. – onurbaysan

0

Возможное решение.

Сортировка каждый список и преобразовать в 10 разрядного двоичного числа

например

Список один

9 8 7 6 5 4 3 2 1 0 
    N N Y Y Y Y N N Y Y = 243 

Список Два

9 8 7 6 5 4 3 2 1 0 
    Y Y N Y N N Y Y Y N = 846 

Список Три

9 8 7 6 5 4 3 2 1 0 
    N N Y Y Y Y Y N Y N = 250 

прегенерация все возможные значения для пар

т.е.

0,1 = 3 
0,2 = 5 
... 
1,5 = 34 
... 
5,7 = 160 
... 
8,9 = 768 

Создать список значений и подсчетов (я включил текстовое представление пары для простоты)

eg

public class Details { 
    public string Pair { get; set; } 
    public int Value { get; set; } 
    public int Count { get; set; } 
} 

// selection only 
public readonly static List<Details> PairDetails = new List<Details>() { 
    new Details{Pair = "0,1", Value = 3}, 
    new Details{Pair = "0,2", Value = 5}, 
    new Details{Pair = "1,5", Value = 34}, 
    new Details{Pair = "1,6", Value = 66}, 
    new Details{Pair = "2,3", Value = 12}, 
    new Details{Pair = "4,5", Value = 48} 
}; 

затем итерацию по парам и списки

foreach (var details in PairDetails) { 
    foreach (var value in values) { 
     if ((value & details.Value) == details.Value) { 
      details.Count++; 
     } 
    } 
} 

var most = PairDetails.Where(dtls => dtls.Count == PairDetails.Max(dt => dt.Count)).ToList(); 

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

hth,

Alan.

Смежные вопросы