Имя: Пароль:
IT
 
Задача про временные интервалы
0 Baker_it
 
26.10.11
13:47
Добрый всем день. Есть следующая задача:

Существует n временных интервалов. Необходимо разбить эти интервалы на минимально возможное количество m групп таким образом, чтобы в каждой группе была бы временная точка, принадлежащая одновременно всем интервалам из группы.

Вопрос следующий - не существует ли общеизвестного алгоритма решения этой задачи? Стоит ли изобретать велосипед, или воспользоваться тем, что сделано до меня?

Заранее спасибо.
1 Wobland
 
26.10.11
13:48
два интервала: 0-10 и 11-20. разбей
2 Baker_it
 
26.10.11
13:49
(1) Ну две группы будет.
3 Wobland
 
26.10.11
13:50
(2) и какая точка в каждой группе принадлежит всем интервалам?
4 Baker_it
 
26.10.11
13:51
(3) В первой группе - любая, и во второй - любая. Читайте условие. :)
5 mm_84
 
26.10.11
13:54
(1) хватит задачи из матанализа постить, уже его все забыли
6 Baker_it
 
26.10.11
13:55
Да, замечу, что задача - исключительно прикладная :)
7 dimaldinho
 
26.10.11
13:55
интервалы могут быть вообще непересекающиеся
8 dimaldinho
 
26.10.11
13:57
непонятно условие, должны быть еще ограничения, иначе минимальное количество групп = 2: группа 1 = {все интервалы}, группа 2 = {все интервалы}
9 Baker_it
 
26.10.11
14:01
(7) Совершенно верно.

(8) А вот здесь - неверно. Каждый из интервалов в группе должен иметь хотя бы одну общую точку со всеми остальными.
10 1Сергей
 
26.10.11
14:18
нуно найти наболее часто встречающиеся точки в интервалах, и от них плясать, ИМХО
11 NS
 
26.10.11
14:28
Есть общеизвестный - полный перебор с отсечениями.
12 NS
 
26.10.11
14:37
Вообще-то в этой задаче, минимальный набор групп получается, если просто добавлять по порядку в группы, если интервал пересекается.

То есть не полный перебор, а однократный проход...
13 Snorkler
 
26.10.11
14:37
(0) Как по условию задачи должны быть сгруппированы интералы 9-11, 10-13, 12-14?
(1,2)(3) или (1)(2,3)?
14 НуВотКак
 
26.10.11
14:38
(12) нет, так даже если интервал персекается с одним он может пересекатся с большим-другим
15 Baker_it
 
26.10.11
14:41
(13) (1)(2;3)
16 Molinor
 
26.10.11
14:43
(15) А чем не устраивает (1,2)(3)?
17 НуВотКак
 
26.10.11
14:47
1234 *1
123  *2
578  *3
789  *4
87  *5

12345789
123__789
_____78

вычеркиваем оп максимальным вхождениям:
1) по семеркам *3*4*5
2) по восьмеркам неча уже вычеркивать
3) по единицам *1*2
вообщето дальше неча вычеркивать
18 NS
 
26.10.11
14:47
перем начинт[100];
перем конинт[100];
перем колинт;
Функция пересекается(а,б)
   Если (начинт[а]<=начинт[б])и(конинт[а]>=начинт[б]) тогда
       возврат 1;
   иначеесли (начинт[а]>=начинт[б])и(начинт[а]<=конинт[б]) тогда    
       возврат 1;
   иначе
       возврат 0;
   Конецесли;    
Конецфункции    
Процедура Сформировать()
  колинт=4;
  начинт[1]=1;конинт[1]=10;
  начинт[2]=2;конинт[2]=3;
  начинт[3]=9;конинт[3]=12;
  начинт[4]=8;конинт[4]=11;
  начгруппы=1;        
  сообщить(""+1+" "+начинт[1]+"-"+конинт[1]);
  Для а=2 по колинт цикл  
       Для б=начгруппы по а-1 цикл
           Если пересекается(а,б)=0 тогда  
               // начинаем новую группу
               сообщить("-----");  
               сообщить(""+а+" "+начинт[а]+"-"+конинт[а]);
               начгруппы=а;
               прервать;
           КонецЕсли;    
       КонецЦикла;    
       Если начгруппы<а тогда
           // продолжается старая группа
           сообщить(""+а+" "+начинт[а]+"-"+конинт[а]);
       Конецесли;    
  Конеццикла;    
КонецПроцедуры
19 Baker_it
 
26.10.11
14:47
(16) Пардон, возможны оба варианта)) Просмотрел. И оба будут верными.
20 1Сергей
 
26.10.11
14:47
(13) какая разница какие группы, главное что их минимум две
21 NS
 
26.10.11
14:48
(14) Не понимаю о чем ты. Приведи пример.
22 NS
 
26.10.11
14:49
(18) Бред написал. В группу же нужно добирать до конца...
Сейчас перепишу.
23 НуВотКак
 
26.10.11
14:53
(21) Ну ты предлагаешь добовлять в группу если есть пересечение, а интервал пожет персекаться с нескольками интервалами по разным перечечениям, по которым можно образовать меньше групп

Зы не заморачивайся
24 NS
 
26.10.11
14:58
перем начинт[100];
перем конинт[100];
перем подобрали[100];
перем колинт;
Функция пересекается(а,б)
   Если (начинт[а]<=начинт[б])и(конинт[а]>=начинт[б]) тогда
       возврат 1;
   иначеесли (начинт[а]>=начинт[б])и(начинт[а]<=конинт[б]) тогда    
       возврат 1;
   иначе
       возврат 0;
   Конецесли;    
Конецфункции    
Процедура Сформировать()
  колинт=5;        
  Для а=1 по колинт цикл
     подобрали[а]=0;
  конеццикла;    
  начинт[1]=1;конинт[1]=10;
  начинт[2]=2;конинт[2]=4;
  начинт[3]=9;конинт[3]=12;
  начинт[4]=8;конинт[4]=11;
  начинт[5]=3;конинт[5]=4;
  Для а=1 по колинт цикл
         Если подобрали[а]=0 тогда
              // начинаем группу
              подобрали[а]=1;
              сообщить("-----");  
                сообщить(""+а+" "+начинт[а]+"-"+конинт[а]);
                списподобранных=создатьобъект("списокзначений");
                списподобранных.добавитьзначение(а);
                Для б=а+1 по колинт цикл
                   Если подобрали[б]=1 тогда
                       продолжить;
                   Конецесли;                                    
                   подходит=1;
                   для в=1 по списподобранных.размерсписка() цикл
                       Если пересекается(б,списподобранных.получитьзначение(в))=0 тогда
                           подходит=0;
                           прервать;
                       Конецесли;    
                   Конеццикла;      
                   Если подходит=1 тогда
                       // добавляем в группу  
                       подобрали[б]=1;
                       списподобранных.добавитьзначение(б);
                       сообщить(""+б+" "+начинт[б]+"-"+конинт[б]);
                   Конецесли;    
                Конеццикла;    
         КонецЕсли;    
  Конеццикла;        
КонецПроцедуры
25 NS
 
26.10.11
14:58
(23) Приведи пример. Не может.
26 izekia
 
26.10.11
15:00
(0) а время дискретно?
27 Baker_it
 
26.10.11
15:06
(26) Да. Минимальная частица - секунда.
28 NS
 
26.10.11
15:08
Хотя наверно действительно может дать неоптимальное разбиение, но даже если это так - это экзотика, сходу даже пример не придумать.
29 Baker_it
 
26.10.11
15:09
(10) Это тоже вариант, который теоретически решит задачу "в лоб", но на его реализацию нужно избыточное количество вычислительных ресурсов. Памяти не хватит.
30 НуВотКак
 
26.10.11
15:09
12345 *1
12    *2
2345  *3
23456 *4

Начинаем перебирать *1 и *2 Пересекаются по 1,2 и 12, но все 4 закрываются по 2
31 Baker_it
 
26.10.11
15:09
(28) Вам - спасибо. Сейчас буду разбирать ваши алгоритмы :)
32 Baker_it
 
26.10.11
15:11
(29) Хотя конечно наверное можно извернуться с обработкой данных долями и очисткой памяти.
33 izekia
 
26.10.11
15:13
а отсортировать интервалы по возрастанию и положению на временной оси не предлагать?
34 NS
 
26.10.11
15:13
(33) А зачем?
35 izekia
 
26.10.11
15:27
(34) угу, не совсем то ...
36 Snorkler
 
26.10.11
15:32
(32) В реальной задаче каково количество анализируемых интервалов?
37 NS
 
26.10.11
15:37
(30) Ну и? Берем первый интервал, добавляем к нему второй, третий и четвертый. Получаем одну группу. Такой результат код (24) и выдаст.
38 izekia
 
27.10.11
11:31
границаНабора = ОтсортированныеПоДатеНачалаИнтервалы[0].ВремяОкончания;
группа = Новый Массив
массивГрупп = Новый Массив
Для каждого интервал Из ОтсортированныеПоДатеНачалаИнтервалы Цикл
  Если интервал.ВремяНачала > границаНабора Тогда
      массивГрупп.Добавить(группа);
      группа.Очистить();
      границаНабора = интервал.ВремяОкончания;
  Иначе
      границаНабора = Мин(интервал.ВремяОкончания, границаНабора);
  КонецЕсли;
  группа.Добавить(интервал);
КонецЦикла;
массивГрупп.Добавить(группа);

Вот и весь алгоритм, готов доказать, что количество групп будет минимальным. Если не стоит задача максимизировать количество интервалов в группах, то это оптимальный алгоритм, на мой взгляд.
39 izekia
 
27.10.11
11:32
вчера не успел подумать на работе, по дороге домой посчитал
40 NS
 
27.10.11
11:36
(38) (39)
Этот алгоритм не может быть оптимальным.
Так как мой алгоритм в лучшем случае работает за О(N), а твой всегда за О(N ln N)
Правда в худшем случае (когда один интервал) мой алгоритм работает за О(N^2)
41 izekia
 
27.10.11
11:40
(40) а ты не считал количество операций в итерации у себя и у меня?
42 izekia
 
27.10.11
11:41
я понимаю, что еще сортировка, но это вполне окупится
43 NS
 
27.10.11
11:45
(41) Вообще-то принято считать сложность алгоритма, а не итерации. то есть О() от количества итераций. У тебя за счет сортировки всегда Эн логарифмов.
44 izekia
 
27.10.11
11:48
(43) да, я тебя понял
но это все же для случая с одинаковой сложностью применимо ... надо будет попробовать замеры сделать
45 Михаил Козлов
 
27.10.11
12:22
Представим задачу (для дискретного случая) в виде двудольного графа (ИНТЕРВАЛЫ, ЧИСЛА). Вершинами доли ИНТЕРВАЛЫ будут интервалы, вершинами доли ЧИСЛА будут числа, входящие в интервалы. Дуга от вершины ИНТЕРВАЛ к вершине ЧИСЛО будет если число входит в интервал.
Тогда, если НЕ ошибаюсь, задача заключается в том, чтобы найти минимальное множество вершин доли ЧИСЛА, так чтобы из него были видны ВСЕ интервалы. ВОЗМОЖНО, здесь работает жадный алгоритм: брать число, которое входит в максимальное число интервалов - это будет "представитель" 1-ой группы, группу составят интервалы, которым число принадлежит, удалить число и интервалы из графа, повторить.
Для примера выше (интервалы обозначил буквами):
а(1234), б(123), в(578). г(789), д(78).
Для чисел вхождение в интервалы:
1(аб), 2(аб), 3(аб), 4(а), 5(в), 7(вгд), 8(вгд), 9(г).
1-я группа - число 7 (или 8), интервалы (вгд)
2-я группа - число 1 (или 2), интервалы (аб).

Не знаю, есть ли для этой задачи полиномиальный алгоритм: ее сложность пока не выяснил. Если выясню - отпишу.
46 NS
 
27.10.11
12:42
(45) Найди пример когда (24) или (38) не дадут лучший результат.
47 Михаил Козлов
 
27.10.11
12:59
(46) Того, что 24 или 38 неоптимальны я не утверждал. Хочется понять характер задачи.
48 NS
 
27.10.11
13:04
(47) Задача ИМХО не сводится к теории графов в явном виде.
49 Михаил Козлов
 
27.10.11
13:06
(48) Буду признателен, если укажите, где неправ: сам дыры не нашел.
50 NS
 
27.10.11
13:36
(49) Дыра в сложности алгоритма и в количестве вершин графа. Числа вообще могут быть не дискретны. И даже если они дискретны полиномиальным алгоритм от количества интервалов быть не может, так как количество чисел у нас вообще от количества интервалов не зависит.
51 NS
 
27.10.11
13:38
Хотя можно числами считать только крайние границы интервалов.
Тогда вы прийдете к методу в (24) и (38)
52 Михаил Козлов
 
27.10.11
14:10
(51) Возможно жадный алгоритм и совпадает с (24), (38). Пока открыт вопрос, является ли жадный алгоритм оптимальным.
53 Shaman100M
 
27.10.11
15:00
(45) По теории графов можно еще по-другому эту задачу представить:
Вершины графа - это интервалы.
Дуга между вершинами - интервалы имеют общую точку.

Тогда, задача сводится к разбитию графа на минимальное количество "полных" подграфов. Естественно, после выделения очередного полного подграфа, дуги, соединяющие его с основным, удаляются.
54 Михаил Козлов
 
27.10.11
15:26
(53) На первый взгляд это справедливо, если интервалы не "дырявые".
Известно, что поиск максимальной клики - NP-полная задача (правда, неочевидно, что интервалами можно породить произвольный граф). Для этой задачи неплохо работает алгоритм Брона — Кербоша wiki:Алгоритм_Брона_%E2%80%94_Кербоша
Может поиск минимального числа клик проще?
55 izekia
 
27.10.11
15:31
(54) угу, только сначала надо построить графы
56 Михаил Козлов
 
27.10.11
15:49
(55) Разве здесь есть какая-то проблема?
57 izekia
 
27.10.11
15:52
(56) время
58 ILM
 
гуру
27.10.11
19:33
Может и не к месту, но два временных интервала могут отображаться 16-ю разными способами на временной прямой.
59 izekia
 
27.10.11
19:42
как это?
60 ILM
 
гуру
27.10.11
22:01
Интервал это или точка или отрезок, ну а далее: "точка" может быть до начала, равна началу, внутри, равна концу, за концом (всего 5 позиций).
Если "отрезок то может не пересекать до начала, пересекать 2-й интервал, заканчиваться в начале 2-го, начинаться в начале 2-го, начинаться в конце 2-го, находиться внутри 2-го "отрезка", включать в себя 2-й "отрезок", заканчиваться в конце 2-го, находиться после 2-го и т.д.

Всего может быть 16 положений временных интервалов на прямой относительно друг друга (если каждым интервалом можно считать и "точку"(нулевая длительность ДатаНачала = ДатаОкончания) или "отрезок" (ДатаНачала < ДатаОкончания).
61 Grusswelle
 
27.10.11
22:18
(0) Обычная задачка на пересечение множеств. Причём множества - конечные.
62 Михаил Козлов
 
27.10.11
23:06
Задача оказалась не так проста: в случае "дырявых" интервалов она эквивалента (45) NP-полной задаче о покрытии wiki:Задача_о_покрытии_множества
Жадный алгоритм (45) не дает оптимального решения: пример в той же статье в Википедии.
Для "сплошных" интервалов пример из Википедии не годится.
63 МишельЛагранж
 
03.11.11
03:40
(0) по-моему условие вообще некорректно поставлено:
либо приводите все временные интервалы к единой т.о. и используйте полярные координаты для отсечения "групп" и точек в них (естесственно, все интревалы внутри групп будут равны), либо - то же самое, но с другого боку: определитесь, чем ограничена группа (каждая из m-множества групп), чтобы найти максимально входящее в каждую группу число неделимых интервальчиков (в данном случае - это секунды), и уже это принять за базу и строить отсюда какие-то теории.
Иначе бессмысленно условие "минимально возможное количество групп" - все зависит, где я проведу границу группы: у этого исходного интервала эта секунда попадает во все интервалы группы, а эта - не попадает; делаю границу группы другой - все наоборот.
И получается, что минимальное количество групп равно количеству минимальных неделимых частичек (в данной задаче - секунды), которые являются просто общими для всех интервалов: разбейте еще мельче (полсекунды, четверть секунды) - и количество искомых групп возрастет в соответствии с новым измельчением.
64 izekia
 
03.11.11
09:57
(63) ну вот приехали