Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка маршрута поезда, из точки в точку 
:(
    Опции темы
Alx
Дата 21.3.2011, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



Всем привет.

Есть массив, состоящий из перемешанных пар городов (отправление и прибытие) вида
[E, C], [B, D], [C, A], [F, E], [A, B]

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

[F, E] -> [E, C] -> [C, A] -> [A, B] -> [B, D]


--------------------
PM MAIL WWW ICQ   Вверх
Lipetsk
Дата 22.3.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


в форме ;)
*


Профиль
Группа: Участник
Сообщений: 180
Регистрация: 28.1.2009
Где: Липецк

Репутация: 2
Всего: 5



берете первую пару,
пытаетесь к ней присоединить вторую справа или слева, потом третью и т.д.
дошли до последней пары, попытались присоединить
если остались неприсоединенные пары, пробуем снова присоединить

как-то так, например
PM   Вверх
Akina
Дата 22.3.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Отсортируй быстрым сортом по отправлению. После чего в один проход пересобери по стыковкам.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Alx
Дата 26.3.2011, 03:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



Lipetsk, а если допустим, у меня получилось к первой паре присоеденить третью, то что я дальше делаю? Пытаюсь присоеденить четвёртую к третьей или к первой?


Akina, не понял, отсортировать отправления просто бинарной сортировкой по алфавиту?
А как затем я смогу за один проход расставить все по местам? Распиши плз поподробнее, у меня туговато с матчастью smile

Вообще, я пока сделал так:
Беру первую пару (отрезок пути) дальше среди оставшихся ищу следующий отрезок, вырезаю и вставляю за ним. Дальше ищу следующего для него начиная уже с третьего элемента и так далее, пока не дойду до конечного отрезка. После этого меняю направление и ищу среди оставшихся неотсортированными элементов предшествующие отрезки, вырезаю и вставляю их в начало массива.
Ничего умнее придумать не смог. Если кто знает, подскажите как можно улучшить и этот алгоритм, просто мне нужно понять как мыслить smile Еще, скажите какая алгоритмическая сложность у моего и у ваших примеров. Большое спасибо!

Это сообщение отредактировал(а) Alx - 26.3.2011, 03:34


--------------------
PM MAIL WWW ICQ   Вверх
миг
Дата 26.3.2011, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



т.е. хочешь сказать пару [F, E] невозможно присоединить и поэтому эта пара должна быть начальной точкой отправления.

Добавлено через 5 минут и 46 секунд
Цитата

Пытаюсь присоеденить четвёртую к третьей или к первой?


присоединяй сразу с двух сторон. так автоматически найдешь начало отправления и конец
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Alx
Дата 26.3.2011, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



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


--------------------
PM MAIL WWW ICQ   Вверх
миг
Дата 26.3.2011, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(Alx @  21.3.2011,  17:16 Найти цитируемый пост)
[E, C], [B, D], [C, A], [F, E], [A, B]

Цитата(Akina @  22.3.2011,  10:51 Найти цитируемый пост)
Отсортируй быстрым сортом по отправлению. После чего в один проход пересобери по стыковкам


 берем первую пару [E,C] пытаемся присоединить со второй парой. если вторую пару нельзя присоединить создаем вторую ленту(список) и третью, четвертую, пятую и т.д. пару будем пытаться присоединить к первой и второй паре,т.е. к той которая  присоединиться. 
Если третья пара тоже не сможет присоединиться, то создаем третью ленту(список).
 т.е будет работать примерно так: 
выбираем элемент [Е,С] -создаем первую ленту в ней пока один элемент
____________________
                       [B, D]- создаем вторую, третью и т.д. лент(столько сколько понадобиться)
первый шаг    [Е,С] - первая лента
____________________
                       [B, D]
второй шаг    [Е,С][C, A] - начинаем "наращивать" ленты
___________________________
                       [B, D]
третий шаг    [F, E][Е,С][C, A]
______________________

                          [A, B] [B, D]
четвертый шаг [F, E][Е,С][C, A]
__________________________
а потом просто соединяем концы полученных лент [F, E][Е,С][C, A][A, B] [B, D]


                        





--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
Alx
Дата 28.3.2011, 04:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



При большом количестве элементов будет очень много лент с небольшим кол-вом эл-ов, которые потом тоже нужно будет как-то соединять, и я не знаю, как сделать это в один проход.
Или я ошибаюсь? Насколько этот алгоритм быстрее того, что я предложил?


--------------------
PM MAIL WWW ICQ   Вверх
Akina
Дата 28.3.2011, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Alx @  28.3.2011,  05:10 Найти цитируемый пост)
При большом количестве элементов будет очень много лент с небольшим кол-вом эл-ов, которые потом тоже нужно будет как-то соединять, и я не знаю, как сделать это в один проход.

Это не так.
Каждый очередной элемент ты пытаешься присоединить к каждой из лент как слева, так и справа. Если он слева стыкуется к одной ленте, а справа к другой - эти ленты вместе с ним объединяются в одну ленту. Т.е. алгоритм миг - однопроходный. И он однозначно лучше предложенного мной.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
миг
Дата 28.3.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(Alx @  28.3.2011,  04:10 Найти цитируемый пост)
При большом количестве элементов будет очень много лент с небольшим кол-вом эл-ов, которые потом тоже нужно будет как-то соединять, и я не знаю, как сделать это в один проход.
Или я ошибаюсь? Насколько этот алгоритм быстрее того, что я предложил? 

Дополнительные ленты создаются, когда элемент не может состыковаться с текущими лентами.. Если тебя смущает большое количество лент. Можешь на каждом шаге пытаться состыковать ленты между собой. В некоторых случаях стыкование лент на каждом шаге может ускорить работу программы, а может и замедлить.. Все будет зависеть от входных данных тут однозначно сказать нельзя.

Добавлено через 2 минуты и 13 секунд
но скорей всего в большинстве случаев замедлит работу программы
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
ksnk
Дата 28.3.2011, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 7
Всего: 386



миг, Правильно ли я понял, что формируются ВООБЩЕ ВСЕ возможные маршруты (ленты). И только потом из всех лент магическим образом выбирается нужная?
Imho, при большом количестве маршрутов - эффективнее присоединять от одной из точек с одной стороны. Меньше вариантов для перебора.


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Akina
Дата 28.3.2011, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



ksnk, почитайте исходное условие. Имеется ОДИН маршрут, разбитый на участки. И его надо собрать обратно. Поэтому конечное состояние - всегда одна лента, включающая все участки. Если не так - исходные данные неверны.

Цитата(миг @  28.3.2011,  21:07 Найти цитируемый пост)
Можешь на каждом шаге пытаться состыковать ленты между собой.

Зачем? это происходит автоматически:
Цитата(Akina @  28.3.2011,  11:26 Найти цитируемый пост)
Каждый очередной элемент ты пытаешься присоединить к каждой из лент как слева, так и справа




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
миг
Дата 28.3.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



Цитата(ksnk @  28.3.2011,  20:24 Найти цитируемый пост)
миг, Правильно ли я понял, что формируются ВООБЩЕ ВСЕ возможные маршруты (ленты). И только потом из всех лент магическим образом выбирается нужная?

количество маршрутов будет зависеть от входных данных..  В некоторых задачах будет всего два маршрута. Если данные задать по другому, то возможно  3, 4 и т.д. маршрутов.. Маршруты(ленты) создаются в процессе обработки данных. При большом количестве можно пытаться объединять маршруты(ленты). Для того, чтобы на каждом шаге создавался новый маршрут(лента) последовательность входных данных должна выглядеть крайне не удачно. Вероятность такого сценария довольно низкая, хотя и возможна при задании огромного количества входных данных..
Цитата(Akina @  28.3.2011,  21:12 Найти цитируемый пост)
Зачем? это происходит автоматически:

кажется вы правы. просто была мысль, что допустим  данные расположены крайне не удачно.
например так [Е,С][A, B] [X,Z][M,P][z,M][D,X][F, E][B, D][C, A]
то у нас в самом начале получиться четыре не связаные ленты
Код

[Е,С]
[A, B] 
[X,Z]
[M,P]

и на 5 шаге элемент [z,M] нужно сравнить с четырьмя лентами. т.е.  чем больше лент тем больше сравнений.  поэтому и решил, что на каком то этапе логичнее объединять ленты..  вероятность такого неудачного расположения данных на мой взгляд довольно низкая.. Так, что для данного примера в большинстве случаев, при перемешивании входных данных,   будет создаваться меньше 4 лент.
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1049 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.