TGViewer
Артём Рыбин | Мэйби Артём Рыбин | Мэйби @maybe_digital · 250 subscribers
Post #28 153
Интервальное слияние

Основные применения метода интервального слияния:
- Задачи, связанные с расписаниями, временными промежутками и любыми задачами, требующими объединения пересекающихся или смежных интервалов
- Также оптимизации и упрощения работы с временными данными, такими как управление ресурсами, планирование задач и обработка временных интервалов

Алгоритм:
1. Сначала сортируем интервалы по начальным значениям.
2. Затем начиная с первого интервала и перебираем все остальные интервалы.
3. Если текущий интервал пересекается с предыдущим, объединяем их в один интервал.
4. Если текущий интервал не пересекается с предыдущим, добавляем предыдущий интервал к результирующему списку и продолжаем сравнивать текущий интервал с последующими.

Временная сложность:
* Сортировка интервалов: O(n log n), где n - количество интервалов. Это связано с тем, что перед объединением интервалов необходимо отсортировать их по начальным точкам.
* Объединение интервалов: O(n), после сортировки интервалы объединяются за линейное время.

Таким образом, общая временная сложность алгоритма интервального слияния составляет O(n log n), где n - количество интервалов.

Пространственная сложность:
Пространственная сложность зависит от того, какие структуры данных используются для хранения интервалов и промежуточных результатов. Обычно это может быть O(n) дополнительной памяти для хранения отсортированных интервалов и результата их слияния.

Пример задачи: Объединить пересекающиеся временные интервалы.
type Interval struct {
      Start int
      End   int
}
 
func merge(intervals []Interval) []Interval {
      if len(intervals) <= 1 {
            return intervals
      }
 
      // Сортировка интервалов по начальному значению
      sort.Slice(intervals, func(i, j int) bool {
            return intervals[i].Start < intervals[j].Start
      })
 
      merged := make([]Interval, 0)
      current := intervals[0]
 
      for i := 1; i < len(intervals); i++ {
            if intervals[i].Start <= current.End {
                  // Если текущий интервал пересекается с предыдущим, объединяем их
                  current.End = max(current.End, intervals[i].End)
            } else {
                  // Если текущий интервал не пересекается с предыдущим, добавляем предыдущий к результирующему списку
                  merged = append(merged, current)
                  current = intervals[i]
            }
      }
 
      merged = append(merged, current)
 
      return merged
}

#ПовторяемАлгосы
  • ❤ 1
  • 👨‍💻 1
More from @maybe_digital
  1. Sep 22, 2026Ну что, возвращаемся в медиа пространство Новый выпуск из серии подкастов «От кода к бизне…
  2. Sep 12, 2026А кто это у нас тут в отпуске смог пробиться на AI Cases Conf? Когда проект интересный - о…
  3. Sep 3, 2026Поговорили в ТГ и погнали на студию В сотый раз говорю, что безумно благодарен Олегу, за т…
  4. Aug 22, 2026Зашел к Олегу с идей сделать подкаст. В целом, аудиоверсия у нас есть
  5. Aug 21, 2026Не еду на конфу Сегодня общались с программным коммитетом и пришли к тому, что идея классн…
  6. Aug 20, 2026Сегодня был небольшой созвон утром, после которого получило письмо на почту Уважаемый Арте…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →