Автор Тема: Смёржить отрезки  (Прочитано 10399 раз)

DIzer

  • Гость
Re: Смёржить отрезки
« Ответ #15 : Октябрь 23, 2012, 03:36:25 pm »
блин, Сергей, для ответа на вопросы которые вы ставите достаточно нескольких сравнений к максимум всем элементам списка... если число элементов < 1000 может не стоит мозги компостировать сложными вариантами

DIzer

  • Гость
Re: Смёржить отрезки
« Ответ #16 : Октябрь 23, 2012, 03:39:54 pm »
разве что отсортировать предварительно этот список по нижней границе...

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Смёржить отрезки
« Ответ #17 : Октябрь 23, 2012, 05:28:27 pm »
если число элементов < 1000 может не стоит мозги компостировать сложными вариантами
Ещё может быть 300 доменов/локаций. То есть триста раз по тысяче. А времени на это не должно тратится вообще ни сколько. Ну там 10 миллисекунд максимум.

Вобщем, мы тут сейчас уже сочинили алгоритм на сто строк для сборки нужной структуры. После сборки структура уже не изменяется. То есть отдельно билдер, отдельно структура. Билдер правда мусорит (основан на двухсвязных списках), но мы его потом доусовершенствуем, если захотим.

Билдер хранит в себе двухсвязный список точек (а не список диапазонов). Каждая точка может быть начальной, конечной или одиночной. Использование в билдере списка точек вместо списка диапазонов сильно поуменьшило комбинаторику. Результатом работы билдера является отсортированный список диапазонов.

DIzer

  • Гость
Re: Смёржить отрезки
« Ответ #18 : Октябрь 23, 2012, 05:32:17 pm »
 ИМХО нет смысла заниматься  задачей.. если нет нормальной ее постановки..

DIzer

  • Гость
Re: Смёржить отрезки
« Ответ #19 : Октябрь 23, 2012, 05:37:06 pm »
формально в 10 мили секунд можно уложиться простым поиском по списку... но  если скажем выяснится что требуется искать 100 раз в секунду..то это точно не прокатит..

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Смёржить отрезки
« Ответ #20 : Октябрь 23, 2012, 05:50:02 pm »
К сведению: номера телефонные отлично сортируются поразрядной сортировкой. Сложность соответственно O(n).
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Смёржить отрезки
« Ответ #21 : Октябрь 23, 2012, 05:51:54 pm »
Билдер хранит в себе двухсвязный список точек (а не список диапазонов). Каждая точка может быть начальной, конечной или одиночной. Использование в билдере списка точек вместо списка диапазонов сильно поуменьшило комбинаторику. Результатом работы билдера является отсортированный список диапазонов.

Не очень понял. Вы заменили изначальную структуру (список диапазонов) или этот список точек генерится по запросу?
А профит я так понимаю в том, что список упорядочен, т.е. сделали быстрый поиск?

ps И еще интересно чем мой вариант не подходит? Там ведь один проход по списку... (Если изначальный список не меняется все время конечно.)
« Последнее редактирование: Октябрь 23, 2012, 05:54:19 pm от ilovb »

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Смёржить отрезки
« Ответ #22 : Октябрь 23, 2012, 06:00:02 pm »
Если нужен быстрый поиск, то мой код тоже возвращает упорядоченный список непересекающихся диапазонов... И сравнить два таких списка элементарно.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Смёржить отрезки
« Ответ #23 : Октябрь 23, 2012, 07:26:50 pm »
Не очень понял. Вы заменили изначальную структуру (список диапазонов) или этот список точек генерится по запросу?
Я сделал так, что изначального плохого списка вообще нет. Список сразу хороший по построению.

Билдер билдер = НовыйБилдер();

// получаем данные из БД и засовываем их в билдер:
билдер.Добавить(123, 456);
билдер.Добавить(987, 10000);

// А теперь билдим сразу правильный список:
Список список = билдер.Собрать();

Внутри билдера упорядоченный двухсвязный список точек. Уж больно легко их мёржить. Надо найти начальную head и конечную tail точку, затем все что между ними сколлапсировать вот так:
head.next = tail;
tail.prev = head;

Уже забилженный "Список" - неизменный, там внутри массив. По массиву можно делать бинарный поиск.

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Смёржить отрезки
« Ответ #24 : Октябрь 23, 2012, 07:39:07 pm »
Понятно.
А есть возможность ваш код тут запостить? Хотя бы в урезанном виде.

ps Кстати псевдокод можно было и на ангельском. Я полиглот и не совсем кошерный одинэснег ;) ;D

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Смёржить отрезки
« Ответ #25 : Октябрь 23, 2012, 07:48:17 pm »
Любопытно - это часть какой задачи ? Биллинг мг/мн ?

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Смёржить отрезки
« Ответ #26 : Октябрь 24, 2012, 04:29:33 am »
Нет, мг./мн - как-то сомнительно,  наверное, всё же это нечто с базой абонентских номеров?
 

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Смёржить отрезки
« Ответ #27 : Октябрь 24, 2012, 08:26:24 am »
А есть возможность ваш код тут запостить? Хотя бы в урезанном виде.
Конечно, только я его ещё разок обмозгую, потом запощу сюда.

Кстати, в твоём алгоритме смежные диапазоны вроде не мёржатся? Те что отличаются на единицу?

У меня мёрж {{10, 20}, {21, 30}} даёт {{10, 30}}.

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Смёржить отрезки
« Ответ #28 : Октябрь 24, 2012, 08:37:30 am »
У меня мёрж {{10, 20}, {21, 30}} даёт {{10, 30}}.

А я в подобных задачах использую интервалы такого рода [x0,x1[   ( т.е  x1 не входит) Удобнее получается.

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Смёржить отрезки
« Ответ #29 : Октябрь 24, 2012, 08:43:49 am »
Любопытно - это часть какой задачи ? Биллинг мг/мн ?
Раздача телефонных номеров.

Владелец множества телефонных номеров (оператор связи) может продать их подмножество другому владельцу (более мелкому оператору связи), а тот может продать подмножество подмножества номеров третьему владельцу и т.д.

Или раздача может делатся в рамках одного владельца, но по географическому/административному признаку. Область - район - посёлок, область - город - район и т.п. из этой оперы.