powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / алгоритм проверки дырок в интервале
11 сообщений из 11, страница 1 из 1
алгоритм проверки дырок в интервале
    #33083353
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здраствуйте. посоветуйте пожалуйста эффективный алгоритм поиска дырок в множестве.
грубо говоря есть таблица с полями start, count.
надо вывести все записи этой таблицы в виде start, fin, а также пустые интервалы с указанием что запись отсутствует.
для понятности пример:
startcount110123177301
нужно чтобы получилось
startfinexist110+1111-1214+1516-1723+2429-3030+
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083371
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно как-нибудь ограничить максимальный размер "дырки"? Например, тысячей? Если да, то задача легко решается с опомщью SQL-запроса.
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083397
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Garya - объясните мне, как при помощи SQL-запроса можно получить данные, которых в таблице нет?
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083410
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya
сделаем допущение что можно (например 256 :)
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083440
Фотография Мигалка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что возвращать в случаеstartcount111123177301
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083499
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я подумал. Ограничение не нужно. Можно сделать живописнее и более универсально. :)

Код: plaintext
1.
2.
3.
4.
5.
6.
select Start, Start+[Count]-1 as [End], '+' as [Sign]
from Sequenses
union
select a.Start+a.[Count] as Start, (select min(b.Start)-1 from Sequenses b where b.Start>a.Start+a.[Count]) as [End], '-' as [Sign]
from Sequenses a
where a.Start<(select max(Start) from Sequenses) and 
      not exists(select c.* from Sequenses c where c.Start=a.Start+a.[Count])
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083843
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33083981
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то на форуме по MS SQL Server таких задачек видимо-невидимо. Обычно такие вопросы ТАМ задают... :)
А самые красивые и быстродействующие решения обычно выдает SergSuper (да светится имя его). Я так с ним даже и не пытаюсь конкурировать... :)
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33084339
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Мигалка
возвращать
1,11,+
12,14,+
15,16,-
17,23,+
и т.д.

спасибо всем ответившим.
буду пробовать-пытаться
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33084839
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Кабан Савраскин. Мой запрос возвращает именно то, что тебе нужно (смежные интервалы в один интервал НЕ сливает). Только с алиасами для полей я немного поднаврал (посчитал, что название полей в результирующем наборе несущественно). Однако, если заменить "as [End]" на "as Fin", а "as [Sign]" на "as [Exist]", то получится в точности нужный результирующий набор (при условии, что исходная таблица называется Sequenses):

/* этот кусок запроса возвращает только имеющиеся интервалы (которые помечаются знаком "+") /*
select Start, Start+[Count]-1 as [Fin] , '+' as [Exist]
from Sequenses
union
/* а этот кусок запроса возвращает только промежутки между интервалами, помеченные знаком "-" */
select a.Start+a.[Count] as Start, (select min(b.Start)-1 from Sequenses b where b.Start>a.Start+a.[Count]) as [Fin] , '-' as [Exist]
from Sequenses a
/* исключаем последнюю запись, чтобы пустота за ней не воспринималась как незаполненный промежуток */
where a.Start<(select max(Start) from Sequenses) and
/* и еще исключаем промежутки, между интервалами, размер которых равен нулю */
not exists(select c.* from Sequenses c where c.Start=a.Start+a.[Count])
...
Рейтинг: 0 / 0
алгоритм проверки дырок в интервале
    #33084949
Фотография Кабан Савраскин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)
спасибо Гаря за столь подробное разъяснение (особенно по поводу алиасов :).
могу добавить только, что пришлось [] заменить на ", потому как в постгресе синтаксис чуть-чуть другой.
запрос действительно работает как часы
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / алгоритм проверки дырок в интервале
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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