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

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

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

> алгоритмы поиска
сообщение
Сообщение #1


Пионер
**

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

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


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


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

 





- Текстовая версия 15.05.2024 19:35
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name