Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Алгоритм для сохранения последних состояний в программе. / 20 сообщений из 20, страница 1 из 1
28.04.2020, 06:59
    #39952194
Алгоритм для сохранения последних состояний в программе.
Простая и частая задача: нужно сохранить последние Х(const) состояний программы (без сохранения в постоянной памяти). Допустим - рисуем графику с возможностью отката в пределах Х шагов.
Как это сделать чисто алгоритмически (как сделать в коде я разберусь).
Допустим (для примера) состояние программы храниться в виде записи.
Можно сделать через обычный массив и добавлять новое состояние в конец, удалять старое из начала. Ужасный алгоритм с огромным количеством ненужного копирования.
Можно сделать через банальный отдельный индекс массива который увеличивать/уменьшать при записи/откату состояния. При достижении конца/начала - перекидывать на начало/конец (бегать в массиве по кругу).
Можно сделать связанные списки и тоже гонять по кругу.
Можно просто через указатели.
Может быть ещё как-то через стек можно.

Наверняка это тривиальная задача которая есть в любом учебнике, но вот как-то мне не попадалось и даже не соображу как корректно сформировать запрос поиску.
Посему два вопроса:
1. Как называют такой алгоритм
2. Как обычно его реализовывают на Delphi.
...
Рейтинг: 0 / 0
28.04.2020, 10:18
    #39952244
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Андрей Игоревич
Простая и частая задача: нужно сохранить последние Х(const) состояний программы. Как это сделать чисто алгоритмически.

Чисто алгоритмически прежде всего следует выбросить из головы понятие "состояние программы" и начать мыслить "изменениями". Изменение - это то, что переводит программу из одного состояния в другое. А дальше, когда ты научишься записывать любое состояние программы как серию изменений, останется ещё одна деталь: сохранять вместе с каждым изменением обратное (либо уметь его при необходимости генерировать). Добавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее.
...
Рейтинг: 0 / 0
28.04.2020, 10:44
    #39952256
Алгоритм для сохранения последних состояний в программе.
softwarer
Андрей Игоревич
Простая и частая задача: нужно сохранить последние Х(const) состояний программы. Как это сделать чисто алгоритмически.

Чисто алгоритмически прежде всего следует выбросить из головы понятие "состояние программы" и начать мыслить "изменениями". Изменение - это то, что переводит программу из одного состояния в другое. А дальше, когда ты научишься записывать любое состояние программы как серию изменений, останется ещё одна деталь: сохранять вместе с каждым изменением обратное (либо уметь его при необходимости генерировать). Добавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место. И так далее.

Можно было и проще написать: вместо состояния программы лучше вести лог и для каждой операции иметь обратную.

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

Ну и опять же, неужели все хранят бесконечные логи? Как реализовывают функционал "сохранить последние 1000 операций"? Для примера, при добавлении 1001 надо выкинуть 1ю. Как это реализовывают?
...
Рейтинг: 0 / 0
28.04.2020, 10:48
    #39952257
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Андрей Игоревич
Как это реализовывают?

Связанный список с отдельным хранением ссылок на первый и/или последний элемент. В каждом элементе есть ссылка на следующий и/или предыдущий.

Содержимое элемента любое. Хоть record, хоть объект.
...
Рейтинг: 0 / 0
28.04.2020, 10:50
    #39952258
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Андрей Игоревич
но требует принципиально другого подхода к алгоритму программы

Да нет. Это просто требует вместо onclick-ов, напрямую лезущих в состояние программы, использовать объекты класса "команда". Вполне внедряется в готовое приложение, хотя, конечно, усилий требует.

Андрей Игоревич
проще состояние всей программы сохранить

Тогда ненужные копирования, о которых ты печёшься - незначимая мелочь на этом фоне. Делай как угодно.

Андрей Игоревич
Как реализовывают функционал "сохранить последние 1000 операций"?

А где ты видел такой функционал? Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"?
...
Рейтинг: 0 / 0
28.04.2020, 10:53
    #39952260
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
softwarer
Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"?

Я думаю, что 1000 он взял с потолка имея ввиду, что есть какой-то ограниченный чем-то (определенным количеством или свободной памятью) лог для отката.
...
Рейтинг: 0 / 0
28.04.2020, 10:57
    #39952262
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
wadman
Я думаю, что 1000 он взял с потолка

Я намекаю ему, что если одна команда занимает, допустим, 50 байт, то бесконечный лог на тысячу операций займёт аж целых 50 килобайт. И ещё намекаю, где он сможет увидеть опцию Undo after save, которая подскажет, как на самом деле делают.
...
Рейтинг: 0 / 0
28.04.2020, 10:57
    #39952263
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Андрей Игоревич
Простая и частая задача: нужно сохранить последние Х(const) состояний программы (без сохранения в постоянной памяти). Допустим - рисуем графику с возможностью отката в пределах Х шагов.
Как это сделать чисто алгоритмически (как сделать в коде я разберусь).
Допустим (для примера) состояние программы храниться в виде записи.
Можно сделать через обычный массив и добавлять новое состояние в конец, удалять старое из начала. Ужасный алгоритм с огромным количеством ненужного копирования.
Можно сделать через банальный отдельный индекс массива который увеличивать/уменьшать при записи/откату состояния. При достижении конца/начала - перекидывать на начало/конец (бегать в массиве по кругу).
Можно сделать связанные списки и тоже гонять по кругу.
Можно просто через указатели.
Может быть ещё как-то через стек можно.

Наверняка это тривиальная задача которая есть в любом учебнике, но вот как-то мне не попадалось и даже не соображу как корректно сформировать запрос поиску.
Посему два вопроса:
1. Как называют такой алгоритм
2. Как обычно его реализовывают на Delphi.
Это очень непростая задача, называется "персистентные структуры данных".
Для многих структур данных (например, банальный массив) до сих пор нет персистентных решений в пределах приемлимой вычислительной сложности.
И нерешённость этой задачи очень мешает распространению функциональных языков.
...
Рейтинг: 0 / 0
28.04.2020, 11:13
    #39952269
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
авторДобавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным будет передвинуть в старое место.
Есть еще нюанс что не всегда обратное действие возможно в принципе. Фарш как известно невозможно провернуть назад и мясо из котлет не восстановишь.
...
Рейтинг: 0 / 0
28.04.2020, 11:16
    #39952270
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
makhaon
Есть еще нюанс что не всегда обратное действие возможно в принципе.

Это эквивалентно утверждению, что предыдущего состояния программы не существовало в принципе.
...
Рейтинг: 0 / 0
28.04.2020, 12:17
    #39952300
Алгоритм для сохранения последних состояний в программе.
wadman
Андрей Игоревич
Как это реализовывают?

Связанный список с отдельным хранением ссылок на первый и/или последний элемент. В каждом элементе есть ссылка на следующий и/или предыдущий.

Содержимое элемента любое. Хоть record, хоть объект.

Ну значит так и сделаю, зря чтоль недавно их изучал :).

softwarer
wadman
Я думаю, что 1000 он взял с потолка

Я намекаю ему, что если одна команда занимает, допустим, 50 байт, то бесконечный лог на тысячу операций займёт аж целых 50 килобайт. И ещё намекаю, где он сможет увидеть опцию Undo after save, которая подскажет, как на самом деле делают.

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

kealon(Ruslan)
Это очень непростая задача, называется "персистентные структуры данных".
Для многих структур данных (например, банальный массив) до сих пор нет персистентных решений в пределах приемлимой вычислительной сложности.
И нерешённость этой задачи очень мешает распространению функциональных языков.

Спасибо, изучу.
...
Рейтинг: 0 / 0
28.04.2020, 12:21
    #39952306
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Пример: FastReport, редактор шаблонов отчетов.
Тупо сохраняют в памяти весь шаблон при почти любых изменениях.
Работает быстро. Нормальный подход, почти не требуется морщить моск.
...
Рейтинг: 0 / 0
28.04.2020, 12:41
    #39952317
L1G
L1G
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Андрей Игоревич

1. Как называют такой алгоритм
2. Как обычно его реализовывают на Delphi.
1. кольцевой буфер https://en.wikipedia.org/wiki/Circular_buffer
2. https://stackoverflow.com/questions/1600318/where-can-i-find-a-good-delphi-or-object-pascal-implementation-for-a-circular-bu
...
Рейтинг: 0 / 0
28.04.2020, 13:25
    #39952334
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
softwarer

Андрей Игоревич
Как реализовывают функционал "сохранить последние 1000 операций"?

А где ты видел такой функционал? Зайди в настройки дельфы - ты там видишь поле типа "Redo last 1000 operations"?

XE7: меню "Tools/Options" - раздел "Editor Options", параметр "Undo Limit"
...
Рейтинг: 0 / 0
28.04.2020, 13:29
    #39952338
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Polesov,

да, точно, появилась такая фигня.
...
Рейтинг: 0 / 0
28.04.2020, 13:33
    #39952340
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
softwarer
Polesov,

да, точно, появилась такая фигня.

Э-э-э... Могу ошибаться, но подобная "фигня" была еще в Borland Pascal 7.0
По крайней мере в D5 точно есть )
...
Рейтинг: 0 / 0
28.04.2020, 13:39
    #39952344
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Polesov,

ничего не могу сказать. Вероятность того, что я всё это время не обращал на неё внимание, отлична от нуля.
...
Рейтинг: 0 / 0
28.04.2020, 13:43
    #39952347
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
softwarer
Polesov,

ничего не могу сказать.

Я сделал это не в интересах истины, а в интересах правды. (c) )
...
Рейтинг: 0 / 0
28.04.2020, 13:43
    #39952348
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
softwarerДобавил квадрат - обратным будет удаление квадрата. Передвинул в другое место - обратным
будет передвинуть в старое место. И так далее.

В некоторых случаях это будет труднее сохранения снапшота состояния.

Схему хранения последовательности изменений использовал CVS. GIT, считающийся более
прогрессивным, использует хранение снапшотов состояния.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.04.2020, 14:09
    #39952360
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм для сохранения последних состояний в программе.
Dimitry Sibiryakov
В некоторых случаях это будет труднее сохранения снапшота состояния

Да. Но это в любых случаях будет куда более экономным, нежели сохранение снапшота состояния.

Dimitry Sibiryakov
CVS. GIT,

К разным ситуациям разные требования. Задаче undo/redo не требуется думать о быстром сравнении версий 666 и 1666, сохранности данных в случаях частичного краша винта и т. д.

Напомню моё утверждение: по сравнению с тратами на "сохранение снапшотов" выбор между массивом, кольцевым буфером или любой другой структурой хранения указателей на эти снапшоты непринципиален. Есть возражения?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Алгоритм для сохранения последних состояний в программе. / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]