Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 21:47   #1
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию Ускорить работу программы

Код:
#include <cstdlib>
#include <iostream>

double p(int s, int r)
{ if(s%2!=0) return 0;
if(r==0) return 0;
if(s==0) return 1;
if((p==0)&&(s==0)) return 0;
else return ((2*s*r*p(s,r-1)) + (s*(s-1)*p(s-2,r)))/ (((s+r)*(s+r-1))-(r*(r-1)));     }
using namespace std;

int main(int argc, char *argv[])
{int s,r;
    scanf("%d%d",&s,&r);
    printf("%.11lf\n",p(s,r));
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Помогите, пожалуйста.
akademochka вне форума Ответить с цитированием
Старый 15.04.2013, 22:39   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

akademochka

Ускорить работу программы

это тебе поможет
Rififi вне форума Ответить с цитированием
Старый 15.04.2013, 23:02   #3
PathTheir
Пользователь
 
Аватар для PathTheir
 
Регистрация: 14.04.2013
Сообщений: 62
По умолчанию

Код:
#include <cstdlib>
#include <iostream>

double p(int s, int r)
{ 
if ((s%2!=0) || (r == 0) || (p==0) && (s==0)) return 0;
if(s==0) return 1;
else {
  double l = p(s-2, r);
  return ((2*r*p(s,r-1) + s*l - l)/(2*r + s - 1));  
}   
}
using namespace std;

int main(int argc, char *argv[])
{int s,r;
    scanf("%d%d",&s,&r);
    printf("%.11lf\n",p(s,r));
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Так должно быть чуть побыстрее. (Самую малость)
PathTheir вне форума Ответить с цитированием
Старый 15.04.2013, 23:09   #4
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

Спасибо большое! своим остроумием вы мне очень помогли
akademochka вне форума Ответить с цитированием
Старый 15.04.2013, 23:11   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Было бы здорово, если бы Вы предоставили алгебраическое описание функции p.
Код:
if((p==0)&&(s==0)) return 0;
p==0 ???

Rififi, добрый Вы. Хотя функция неприятная, факт.
Если я не напутал в расчётах, то для чётного s она равна... TeX-разметки нет, поэтому вот так:
(C(s/2,0)*П1 <= k <= r(2k-1) + C(s/2 + 1, 1) * 2r * П1 <= k <= r-1(2k-1) + ... + C(s/2 + r-1, r-1) * 2r*(2r-2)*(2r-4)*...*4) / Пs/2 < k <= r + s/2(2k-1)
(C(n,k) - биноминальный коэффициент) Растёт быстро, считается фигово.
Abstraction вне форума Ответить с цитированием
Старый 15.04.2013, 23:14   #6
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

Спасибо, конечно, но этого не достаточно : Максимальное время выполнения: 1.014 секунды из 1 секунда
akademochka вне форума Ответить с цитированием
Старый 15.04.2013, 23:19   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Нужна мемоизация. Обратите внимание, что при вызове p(5,4) значение p(2,1) сейчас будет независимо считаться 20 раз. Если вместо этого завести динамический массив, изначально заполненный, скажем, -1 и сначала пытаться искать значение в нём, всё станет чуть менее мрачно.
Abstraction вне форума Ответить с цитированием
Старый 16.04.2013, 00:00   #8
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

Что-то типа этого? Только я понимаю, что написала бред(не работает), но все же....помогите исправить
Код:
#include <cstdlib>
#include <iostream>

using namespace std;
int A[2010][2010];

double p(int s, int r) {
       if(s%2!=0) return 0;
if(r==0) return 0;
if(s==0) return 1;
if((p==0)&&(s==0)) return 0;
 
    if (A[s][r] == -1) {
       

        for (int i = 1; i <= s ; i++) {
        for(int j=1 ;j<=r;j++) {
           A[s][r] =((2*s*r*A[s][r-1]) + (s*(s-1)*A[s-2][r]))/ (((s+r)*(s+r-1))-(r*(r-1)));}}
        
    return A[s][r];
}}

int main() {
  int s,r;
    scanf("%d%d",&s,&r);
    memset(A, -1, sizeof A);
    A[1][1]=1;
printf("%.11lf\n",p(s,r));
    system("PAUSE");
    return EXIT_SUCCESS;
}
akademochka вне форума Ответить с цитированием
Старый 16.04.2013, 00:31   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Прочитайте описание функции memset(). Нужен массив double (причём вариант с фиксированным размером не вполне удачен), и инициализировать его проще в цикле (заодно загнав туда условия выхода из рекурсии):
Код:
for(int i=1; i<=MAX_S; ++i){
  for(int j=1; j<=MAX_R; ++j){
    if(i%2 != 0) A[i][j] = 0; //if-else конструкцию можно заменить на A[i][j] = i%2 - 1;
    else A[i][j] = -1;  //Но не факт, что это будет быстрее
  }
}

for(int i=0; i<=MAX_S; ++i) A[i][0] = 0;
for(int j=0; j<=MAX_R; ++j) A[0][j] = 1;
Условие с p==0 бессмысленно. Если Вы этого не понимаете - поймите (разберите, что такое идентификатор p и чему может быть равно его численное значение).

Соответственно:
Код:
double p(int s, int r){
  if(A[s][r] >= 0) return A[s][r];

  A[s][r] = (2*r*p(s,r-1) + (s-1)*p(s-2,r)) / (s + 2*r - 1); //Выражение упрощено
  return A[s][r];
}

Последний раз редактировалось Abstraction; 16.04.2013 в 00:35.
Abstraction вне форума Ответить с цитированием
Старый 16.04.2013, 01:01   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

а при каких значениях вы замеряете время исполнения?
У меня показатель: 0.001354 секунды на таком коде:

Код:
double p(int s, int r)
{ 
    if ((s%2!=0) || (r == 0) || (p==0) && (s==0)) return 0;
    if(s==0) return 1;
    else
    {
        double l = p(s-2, r);
        return ((2*r*p(s,r-1) + s*l - l)/(2*r + s - 1));  
    }   
}
int main()
{
    Timer timer;  timer.Quant();
    cout<<"result = "<<p(5,4)<<endl;
    cout<<"elapsed = "<<timer.Quant()<<endl;
}
_Bers вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить работу БД SERG1980 БД в Delphi 9 09.11.2010 23:30
Ускорить работу с БД Poltev86 БД в Delphi 2 25.05.2010 09:46
ускорить работу макроса borik120 Microsoft Office Excel 12 19.01.2010 17:25
Как ускорить работу программы SibBear Общие вопросы Delphi 7 27.03.2009 14:40
помогите ускорить работу программы... Pashtet Паскаль, Turbo Pascal, PascalABC.NET 5 25.11.2008 22:12