powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм объединения массивов в группы по числу общих элементов
16 сообщений из 16, страница 1 из 1
Алгоритм объединения массивов в группы по числу общих элементов
    #39273190
Downer123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пусть имеется несколько именованных массивов с числами (ИД каких-либо объектов, не суть важно) в них:

Код: javascript
1.
2.
3.
4.
a : [1 2 3]
b: [2 3 4 5]
c: [1 3 5]
d: [1 2 3 6 7]



Размер массива не фиксирован, элементы внутри 1го массива не повторяются.

Нужно получить все комбинации имен массивов, имеющих как минимум N общих элементов.

Пример, если N = 1, то результатом будет {a, b, c, d}, так как все 4 массива имеют общее число 3 в них. Все другие комбинации здесь не нужны (типа пар {a, b}, {c, d} и тд.) ибо они уже входят в комбинацию из 4х.

Если N = 2, то получатся комбинации {a, b, d} (общие числа 2 и 3), {a, c, d} (общие числа 1 и 3) и {b, c} (общие числа 3 и 5). Снова все другие комбинации здесь не нужны (типа {a, b}, {a, c}), потому что они уже присутствуют в триплетах.

Если N = 3, получится {a, d}, так как только 2 этих массива имеют по 3 общих элемента.

Если N = 4, результатов не будет.

Посоветуйте хотя бы в какую сторону копать, ничего в голову не приходит из алгоритмов.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273205
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если можно это засунуть в БД, то select`ами с группировкой вроде должно нормально выбираться.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273209
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если массивов немного, то просто написать функцию сравнения двух массивов и тупо сравнить все со всеми.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273212
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется что если отформатировать под матрицу то можно
придумать оптимизации.

Код: sql
1.
2.
3.
4.
a:  [1 2 3        ]
b:  [  2 3 4 5    ]
c:  [1   3   5    ]
d:  [1 2 3     6 7]
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273217
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не совсем тупо. При сравнении сохранять совпавшие части массивов, например для 2х
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
сравнение a-b
a,2,3
b,2,3
сравнение a-c
a,1,3
c,1,3
сравнение a-d
a,2,3
d,2,3
a,1,3
d,1,3
...
затем из результата выкидываем дубли, и выбираем все группы с группировкой по значению подмассива. т.е. получим
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Группа 1,3
a,1,3
c,1,3
d,1,3
Группа 2,3
a,2,3
с,2,3
d,2,3
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273221
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напутал немного пока копипастил, такой результат
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Группа 1,3
a,1,3
c,1,3
d,1,3
Группа 2,3
a,2,3
b,2,3
d,2,3

т.е. получили {a, c, d} и {a, b, d}

Ну и третьим шагом надо выкинуть повторы если такие окажутся в результате.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273240
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonМне кажется что если отформатировать под матрицу то можно
придумать оптимизации.
ИМХУ в матрице из 2-х строк легко сравнивать 2 массива, выкинул ненужное (один из столбцов пуст), а из остального нагенерил результатов. Например
Код: plaintext
1.
a:  [1 2 3        ]
d:  [1 2 3     6 7]
получили
Код: plaintext
1 2 3
нагенерили пар по 2
Код: plaintext
1.
{1 2}
{2 3}
Затем записали результат
Код: plaintext
1.
2.
3.
{a 1 2}
{d 1 2}
{a 2 3}
{d 2 3}
Хотя тут и матрицы не надо, отсортировать оба массива, и искать в одном по очереди все элементы второго. Нашли - записали.

А большей пользы от матрицы я не вижу, т.е. 3 и более массивов никак там не обработать.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273244
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tполучили
Код: plaintext
1 2 3
нагенерили пар по 2
Код: plaintext
1.
{1 2}
{2 3}

Немного недописал, пар побольше будет
Код: plaintext
1.
2.
{1 2}
{1 3}
{2 3}
Но сути это не меняет, будет работать как выше писал, просто будут повторы при выводе результата.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273245
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недочитал ТЗ
Downer123Пример, если N = 1, то результатом будет {a, b, c, d}, так как все 4 массива имеют общее число 3 в них. Все другие комбинации здесь не нужны (типа пар {a, b}, {c, d} и тд.) ибо они уже входят в комбинацию из 4х.
Тогда четвертым шагом проверить вхождение одного результата в другой, тут сравнивать каждый со всеми бОльшими по размеру, если входит - удалять. Принцип сравнения тот же.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273492
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если сравнивать каждый массив с каждым, и перед этим упорядочить все массивы, то мы получим O(n^4lgn), где n - количество элементов самого большого массива. Можно ли сделать это быстрее?
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273516
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Задачка NP
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273517
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перебором, без оптимизации, которой, скорее всего, не существует. C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
    class Program
    {
        static void Main(string[] args)
        {
            // Количество общих элементов
            var commonItemsCount = 2;

            var data = new[]
            {
                new[] {1, 2, 3},
                new[] {2, 3, 4, 5},
                new[] {1, 3, 5},
                new[] {1, 2, 3, 6, 7}
            };

            var q =
                from a1 in data
                from a2 in data
                where a1 != a2
                let c = a1.Intersect(a2).ToArray()
                where c.Length >= commonItemsCount
                select new { a1, a2, c };

            var selectedItems = new HashSet<int[]>();

            // Результат
            var result =
                (from g in q.GroupBy(v => v.c, new ArrayComparer())
                 orderby g.Key.Length descending
                 select new
                 {
                     // Общие элементы
                     CommonItems = g.Key,

                     // Массивы, содержащие эти элементы
                     Arrays = g
                        .Select(v => v.a1)
                        .Concat(g.Select(v => v.a2))
                        .Distinct()
                        .Where(v =>
                        {
                            if (selectedItems.Contains(v))
                                return false;

                            selectedItems.Add(v);
                            return true;
                        })
                        .ToArray()
                 })
                 .Where(v => v.Arrays.Length > 0)
                 .ToArray();
        }

        class ArrayComparer : IEqualityComparer<int[]>
        {
            public bool Equals(int[] x, int[] y)
            {
                return x.SequenceEqual(y);
            }

            public int GetHashCode(int[] obj)
            {
                return obj.Aggregate(0, (a, v) => a ^ v.GetHashCode());
            }
        }
    }


...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273520
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Массивы в этой задаче не более чем представления множеств

Имеется семейство множеств, найти все подсемейства с мощностью пересечения не менее N
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273530
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилSashaMercury,

Задачка NP

Да, спасибо, так и есть. Выше я рассуждал об алгоритме поиска только всех пар множеств содержащих заданное количество элементов
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39273616
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КПеребором, без оптимизации, которой, скорее всего, не существует. C#
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
            var result =
                (from g in q.GroupBy(v => v.c, new ArrayComparer())
                 orderby g.Key.Length descending
                 select new
                 {
                     // Общие элементы
                     CommonItems = g.Key,

                     // Массивы, содержащие эти элементы
                     Arrays = g
                        .Select(v => v.a1)
                        .Concat(g.Select(v => v.a2))
                        .Distinct()
                        .Where(v =>
                        {
                            if (selectedItems.Contains(v))
                                return false;

                            selectedItems.Add(v);
                            return true;
                        })
                        .ToArray()
                 })
                 .Where(v => v.Arrays.Length > 0)
                 .ToArray();
        }



Я вот щас задумался насколько удобно нам оценивать P/NP в условиях когда программа записана в виде
конвейера lambda-fuctions.
...
Рейтинг: 0 / 0
Алгоритм объединения массивов в группы по числу общих элементов
    #39274237
dimonz80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Downer123,

Не совсем то что автор хотел, но все же

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 
val sets = Map(
  "a" -> Set(1, 2, 3),
  "b" -> Set(2, 3, 4, 5),
  "c" -> Set(1, 3, 5),
  "d" -> Set(1, 2, 3, 6, 7))

val intersections = { 
  (for (i <- sets; j <- sets if (i != j)) yield {
    (i._1, j._1) -> i._2.intersect(j._2)
  }).groupBy { _._2 }.map { e => e._1 -> e._2.keys.map { p => Set(p._1, p._2) }.flatten }
} // =  Map(Set(1, 3) -> Set(c, d, a), Set(3, 5) -> Set(c, b), Set(1, 2, 3) -> Set(a, d), Set(2, 3) -> Set(d, b, a))

val max = sets.map { _._2.size }.max

for (n <- (1 to max)) {
  val result =
    intersections
      .filter { _._1.size >= n }
      .map { _._2 }
  println("N=" + n + " " + result)
}




Код: sql
1.
2.
3.
4.
5.
N=1 List(Set(c, d, a), Set(c, b), Set(a, d), Set(d, b, a))
N=2 List(Set(c, d, a), Set(c, b), Set(a, d), Set(d, b, a))
N=3 List(Set(a, d))
N=4 List()
N=5 List()
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм объединения массивов в группы по числу общих элементов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]