IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> алгоритмы поиска
*оля*
сообщение 16.05.2010 18:37
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


если даны два списка чисел и нужно найти наибольшую одинаковую последовательность чисел, например, если дано:
1 2 3 4 5 6
1 2 6 2 3 4
то должен вывести 234
подскажите пожалуйста, каким алгоритмом тут лучше воспользоваться?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 24.05.2010 16:39
Сообщение #2


Гость






*оля*, тут возможны 2 варианта...

Первый (я буду удалять подпоследовательность из ПЕРВОГО списка, а не из второго):

{ Чуть-чуть изменяем цикл поиска (нам понадобится еще одна переменная)}
if k > kmax then
begin
kmax := k; p_del := p; { <--- Запоминаем, откуда начиналась самая длинная послед-ть }
end;

{ И после окончания циклов: }
p := p_del; { Запоминаем, где начиналась последовательность. Оно чуть ниже пригодится }

{ Удаляем обычным способом kmax элементов, начиная с запомненного }
for i := 1 to kmax do
begin
pp := p_del;
p_del := p_del^.next;
dispose(pp);
end;

{
А теперь проверяем, не равен ли L.first тому, запомненному адресу начала
последовательности. Если равен - значит наибольшая последовательность
была в самом начале списка, тогда все очень просто: началом списка будем
считать p_del, он теперь содержит адрес элемента, следующего за последним
удаленным...

А вот если последовательность начиналась не с начала списка - то чуть
сложнее, надо найти тот элемент, который _указывает_ на место, где раньше
была последовательность... То есть, тот, что находился ПЕРЕД ней. Найдем
его, и его NEXT поменяем на p_del...
}
if L.first = p then L.first := p_del
else begin
pp := L.first;
while pp^.next <> p do pp := pp^.next;
pp^.next := p_del;
end;


Это все, можно теперь печатать список, найденая последовательность из него уже удалена...

Это был первый способ. Второй похож, но немного отличается - не удалять элементы один за одним в цикле, а просто пропускать их (переходить к следующему). Как только дошли до конца нашей последовательности, "обрубаем" список NIL-ом и чуть-чуть подправляем указатели так, чтобы "вырезанный" кусок был отдельно, а то, что было ПЕРЕД и ПОСЛЕ него - склеиваем в одно. Это не так сложно, как кажется, достаточно нарисовать на бумажке список и посмотреть, куда какие связи надо установить...

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

Так что все-таки попробуй реализовать второй вариант, если что не получится - говори, подскажем smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме
*оля*   алгоритмы поиска   16.05.2010 18:37
*оля*   попробовала написать программу для 2х массивов, к...   16.05.2010 20:48
volvo   Это задача о Наибольшей Общей Подпоследовательност...   16.05.2010 21:32
TarasBer   > не подскажете где ошибка? Ну, например, что...   17.05.2010 13:49
*оля*   в другой книге написано в одной строчке по-другому...   18.05.2010 21:34
TarasBer   > в другой книге написано в одной строчке по-др...   19.05.2010 9:34
*оля*   все, в своем не совсем удачном алгоритме нашла еще...   19.05.2010 12:12
TarasBer   > Поэтому не могу найти алгоритм, который подой...   19.05.2010 12:44
*оля*   Пока что есть O(m*n*min(m,n)), короче кубическая...   19.05.2010 21:40
TarasBer   А, в википедии же есть аналогичный алгоритм, но ка...   20.05.2010 9:52
TarasBer   http://e-maxx.ru/algo/suffix_automata Тут уже за ...   20.05.2010 15:02
*оля*   Спасибочки большое!!!))) ну да, это у...   21.05.2010 19:57
Lapp   это уже все сложно, но ради интереса попробую разо...   22.05.2010 4:21
*оля*   Можно дать несколько советов? Буду только бла...   22.05.2010 11:35
*оля*   что-то совсем у меня со списками ничего не получае...   23.05.2010 15:45
volvo   Естественно. Вот при работе со списками как раз ну...   23.05.2010 16:09
*оля*   [code=pas] p := L.first; while p <> nil ...   24.05.2010 15:28
*оля*   Спасибо большое!!! теперь все стало го...   23.05.2010 16:20
volvo   *оля*, тут возможны 2 варианта... Первый (я буду ...   24.05.2010 16:39
*оля*   volvo, вы как всегда меня спасаете, спасибо большо...   24.05.2010 19:34
volvo   А что будет делать этот цикл, расскажешь? Чего ты ...   24.05.2010 19:55
*оля*   А что будет делать этот цикл, расскажешь? Чего ты...   24.05.2010 20:00
volvo   Ну, так и будет, если не ошибаюсь: sum := 0; repe...   24.05.2010 20:30
*оля*   Ну, так и будет, если не ошибаюсь: [code=pas]sum...   25.05.2010 17:57
volvo   Полный код (в виде PAS-файла) присоедини, посмотри...   25.05.2010 18:09
*оля*   Полный код (в виде PAS-файла) присоедини, посмотр...   25.05.2010 19:07
volvo   *оля*, а причина - тривиальна, и Андрей уже говори...   27.05.2010 12:36
*оля*   Добавляешь инициализацию и все работает. да, д...   28.05.2010 19:07
Lapp   Спасибо большое, я эту ошибку без вашей помощи не...   29.05.2010 1:32
*оля*   А между тем, на нее было указано еще в посте №13....   1.06.2010 8:10


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 16:38
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"