![]() |
|
![]() ![]() ![]() |
|
psyco |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 6.12.2008 Репутация: нет Всего: нет |
Здравствуйте! Пишу интерпретатор математических выражений. Входные данные - текст формулы и аргумент х, в котором нужно найти значение этой функции. Вкратце покажу как реализовал(C#):
1. Входная строка и аргумент х поступают на RPNCore 2. RPNCore вызывает Constants, заменяя все символьные константы на числа 3. RPNCore вызывает TAFT, заменяя все символьные функции на числа 4. RPNCore вызывает RPNConvert, преобразовывая строку в обратную польскую нотацию 5. RPNCore вызывает RPNSolve, вычисляя по обратной польской нотации значение функции в точке х. На примере: x+sin(pi*x), в точке x=1 1. 2. x+sin(pi*x)->1+sin(3.14*1) 3. 1+sin(3.14*1)->1+0 4. 1+0-> 1 0 + 5. 1 0 + -> 1 Все работает, как мог оптимизовал. Среднее время нахождения результата простеньких выражений порядка 5-10мс (знаю, много). Проблема состоит в том, что при табуляции математического выражения и входного аргумента х, например х=[-10,10], с количеством точек n=500, программа работает около 15 сек !!! Табуляция происходит так: вызываю RPNCore с текстом математического выражения и х=-10, записываю первое значения, увеличиваю х: х=-9.96 вызываю RPNCore, записываю следующее значение и т.д. Подскажите, пожалуйста, как можно было бы ускорить работу? (может быть через многопоточность, или все намного проще?) Заранее благодарен! Это сообщение отредактировал(а) psyco - 26.4.2011, 23:37 |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Переводишь строку во внутреннее представления в котором легко производить вычисления.
RPNCore - выкинуть из цикла. Парсинг самое медленное, его надо выполнять один раз, оставить только вычисления.
|
|||
|
||||
psyco |
|
|||
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 6.12.2008 Репутация: нет Всего: нет |
Это конечно самый оптимальный вариант, но как это реализовать я не представляю. Насколько я понимаю нужно строку перевести в формат функции, а потом ее табулировать. Можете подсказать какие-то основные идет насчет этого? Спасибо |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |