(no subject)
Feb. 14th, 2008 11:58 pm![[identity profile]](https://www.dreamwidth.org/img/silk/identity/openid.png)
![[community profile]](https://www.dreamwidth.org/img/silk/identity/community.png)
Мля... Совсем поломал голову. Тупая, простейшая задача, но я уже вообще ничего не соображаю. Есть список <50, <100, >=100, >200 итд итп - надо преобразовать его в пары (с-до): 1-49, 50-99, 100-200, 201-MAX
Тетки дают такие списки.
А нужны пары "С-До" .Сегодня (больше некому было) пришлось ручками это все раскладывать. [...] Тарифы, мля...[...]
Я - тупой :( Мне не приходит в голову простой и эффективный алгоритм. Все время монстры какие-то рисуютсо... Некрасивые... Хелп.
Тетки дают такие списки.
А нужны пары "С-До" .Сегодня (больше некому было) пришлось ручками это все раскладывать. [...] Тарифы, мля...[...]
Я - тупой :( Мне не приходит в голову простой и эффективный алгоритм. Все время монстры какие-то рисуютсо... Некрасивые... Хелп.
no subject
Date: 2008-02-15 01:44 am (UTC)no subject
Date: 2008-02-15 01:55 am (UTC)no subject
Date: 2008-02-15 07:05 am (UTC)no subject
Date: 2008-02-15 07:02 am (UTC)Что в какой последовательности делать "в принципе" - и коню понятно.
А вот каков алгоритм оптимален?
Можно делать два прохода с созданием "модификаторов" для учета '<', '<=', '>', '>=' (+1, -1 итд)
Можно разложить на множества и искать пересечения (типа <100 это от -бесконечности до 99 и т.д.)
...
Вариантов много, но они громоздки и некрасивы. Задача-то не совсем экзотическая - может кому попадалась.
no subject
Date: 2008-02-15 03:56 am (UTC)FROM tariffs
WHERE tcost<100
AND tcost>50
no subject
Date: 2008-02-15 06:57 am (UTC)т.е. у меня есть
<50 - 1 лит,
<=100 - 2 лита
<=200 - 2.5 лита
>200 - 3 лита
для импорта в систему надо получить список, скажем, вида:
1 - 49 - 1 лит
50-100 - 2 лита
101-200 - 2,5 лита
201-MAX - 3 лита
no subject
Date: 2008-02-15 08:24 am (UTC)Сортируем список и начинаем создавать интервалы. Все интервалы - полуоткрытые. Первый интервал - [1, null). Бежим по списку. Каждый шаг закрывает один интервал и создаёт новый.
- Если встречаем "<N" - текущий интервал закрывается числом N-1, и открываем новый интервал [N, null).
- Если "<=N" - число N закрывает текущий интервал, создаём новый интервал [N+1, null).
- Если ">=N" - число N-1 закрывает текущий интервал, создаём [N, null).
- Если ">N" - число N закрывает текущий интервал, создаём [N+1, null).
По окончании закрываем последний интервал числом MAX.
no subject
Date: 2008-02-15 08:44 am (UTC)"<=N" == ">N" == "<N+1" == ">=N+1" < "<=N+1" == ">N+1" == ...
Вообще говоря, эквивалентных элементов в списке быть не должно, т.к. они сгенерят одинаковые интервалы, а это исключительная ситуация.
no subject
Date: 2008-02-15 08:58 am (UTC)дело вот в чем:
<100
>150
создадутся:
1-99
100-150 - этого интервала нет. ошибка.
150-max
<=100
>=100
неверно создадутся. неоднозначность. ошибка.
Проблема скорее в реализации "защиты от дурака" - заполнить интревалы и отметить ошибки.
no subject
Date: 2008-02-15 09:34 am (UTC)Неоднозначности отловятся при сортировке, т.к. возникнут эквивалентные элементы, что должно породить исключение.
no subject
Date: 2008-02-15 06:41 pm (UTC)"<N", ">=N" ==> [_, N), [N, null)
"<=N", ">N" ==> [_, N+1), [N+1, null)
no subject
Date: 2008-02-18 12:37 pm (UTC)no subject
Date: 2008-02-15 07:44 am (UTC)no subject
Date: 2008-02-15 07:58 am (UTC)