![]() |
|
|
![]()
|
|
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Доброго времени суток!
Пишу свой доморощенный аналог Excel таблицы. Каждая ячейка в таблице может содержать формулу, в составе которой могут быть другие ячейки (её зависимости). Получается система уравнений, зависимости между переменными в ней представлены в виде ориентированного ациклического графа (у меня хранится в матрице смежности). При изменении пользователем значения в ячейке по графу должна быть найдена последовательность пересчета зависимых значений. Собственно на этой задачей и маюсь. Сначала думал начать поиск от изменяемой вершины, но не смог придумать что делать с зависимостями. Сейчас склоняюсь, что надо начинать поиск от каждой не пройденной вершины, запоминать путь до измененной ячейки и класть его в очередь с приоритетами, где приоритет это расстояние. Последовательность пересчета будет получена из очереди. Посоветуйте, есть ли более оптимальный алгоритм, ведь наверняка уже все давно придумано? UPDATE: Схема c ошибкой. Смотрите ниже! ![]() Это сообщение отредактировал(а) Ch0bits - 20.4.2012, 21:15 |
|||
|
||||
| Lipetsk |
|
|||
![]() в форме ;) ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 28.1.2009 Где: Липецк Репутация: 2 Всего: 5 |
у вас граф не соответствует формулам!!!
если по формулам, то при изменении C нужно делать одно из Y->X->Z->X Z->X->Y->X Y->Z->X Z->Y->X и скорее всего проще не думать о том, какой именно из пересчётов выполнять, и тогда достаточно помнить для каждой ячейки, кто от нее зависит и обойтись без графов |
|||
|
||||
| Pavia |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
1) Пусть у нас есть изменившийся ячейка или ячейки. Иначе прекращаем алгоритм.
2) Надо найти все ячейки которые имеют связи с нашими изменившимися ячейками. 3) Затем удалить дубликата. 4) Посчитать изменения в этих ячейках. 5) переходим к пункту 1. Для быстрого поиска просто хранить в графе обратные дуги, т.е не ориентированный граф. Приоритеты не нужны если не боитесь лишних вычислений. А вот если хотите снизить вычислительные затраты то можно с приоритетами. Тогда в два прохода. Первый рассчитываем приоритеты второй вычисляем. Первый проход. Вместо вычисления увеличиваем приоритет на 1. Затем второй проход вычисляем только те изменившиеся у которых приоритет равен 0. Затем для этих по обратным связям уменьшаем на 1 приоритет. |
|||
|
||||
| Mirkes |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 586 Регистрация: 18.8.2011 Где: Красноярск Репутация: 4 Всего: 17 |
Если аналог Excel, то есть еще один эффект, о котром следует подумать заранее - функции типа случайное число, которые не имеют аргументов, но в Excel фактически зависят от ВСЕХ ячеек. То есть при любом изменении в любой ячейке производится пересчет случайных величин.
-------------------- Mirkes |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
||||
|
||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: 2 Всего: 3 |
Вы не смотрели в сторону топологической сортировки? |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Смотрел, тоже интересная идея, но решений топологической сортировки может быть несколько, а значит будут лишние пересчеты. С другой стороны, преимуществом будет то, можно единожды отсортировать граф для листа, пока неизменны формулы. И не пересчитывать зависимости каждый раз. До сих пор думаю вот. В понедельник несколько реализаций испробую на реальных данных и выберу менее затратную. |
|||
|
||||
| disputant |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 210 Регистрация: 28.11.2011 Репутация: 2 Всего: 3 |
Ну, тогда развернуть стрелочки и хранить граф зависимостей? Тогда просто идти по графу зависимостей от измененной ячейки поиском в ширину и пересчитывать все, на пути попадающееся?
|
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Всему виной моя неграмотность. Графы не пригодились ни разу за 7 лет после института
disputant получи +1, ты абсолютно прав, сегодня реализовал топологическую сортировку, все отлично. Большое спасибо всем. Это сообщение отредактировал(а) Ch0bits - 22.4.2012, 13:21 |
|||
|
||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |