Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
#1

Циклы и их оптимизация - C++

11.06.2013, 21:41. Просмотров 1458. Ответов 54
Метки нет (Все метки)

Доброго времени суток!
Имеется код программы, необходимо оптимизировать вложенный цикл чтобы время потраченное на выполнение программы уменьшилось после оптимизации на заметное число >1 секунды. Можете по своему усмотрению усложнить код (вложив еще цикл) для заметности автоматизации.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream.h>
#include <math.h>
#include <process.h>
 int main()
{
    int n, i=2, j;
    double sum;
    cout<<"n= ";
    cin>>n;
    for(i=0; i<n+1; i++)
    {
    sum=0;
    for(j=1; j<i+2; j++)
        sum+=(double)1/(i*i+j);
    cout<<"F"<<i<<"="<<sum<<endl;
    }
    system("pause");
   return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2013, 21:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Циклы и их оптимизация (C++):

Оптимизация кода, массивы и циклы - C++
Занимаюсь программированием совсем немного, решил потренироватся. Написал консольное приложение в духе &quot;Matrix&quot;. Там объявленно отдельно...

Заменить в коде циклы for на циклы while - C++
int i, j, n; bool a; cin &gt;&gt; i &gt;&gt; n; for (i; i&lt;n; i++) { a = true; for (j = 2; j &lt;= i / 2; j++) if ((i%j) == 0) a =...

Оптимизация - C++
Как-нибудь можно уменьшить размер кода, т.е. сократить количество строк данного кода: #include &lt;cmath&gt; #include &quot;windows.h&quot; ...

Оптимизация - C++
Мне нужно на определенную часть программы дать указание компилятору не оптимизировать эту часть. Может кто знает как это сделать???? ...

оптимизация - C++
какие 5 способов оптимизации?

Серьезная оптимизация - C++
Участвую в олимпиаде, уже придумал алгоритм который обязан работать, но к сожалению вылетаю по тайм_лимит. Алгоритм линейный, я уже не знаю...

54
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.06.2013, 22:57 #2
Единственное что приходит в голову - это lookup table.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
 
using namespace std;
 
static const size_t n_max = 55;
static double       lut[n_max * n_max + n_max + 1];
 
int main()
{
    int     n, i, ii, j;
    double  sum;
 
    cout << "n = ";
    cin >> n;
 
    if ( n > n_max ) {
        cout << "n must be less or equal " << n_max << endl;
        return 1;
    }
 
    // precalculate values
    for ( i = 0; i < n + 1; i++ ) {
        for ( j = 1; j < i + 2; j++ ) {
            lut[i * i + j] = 1. / (i * i + j);
        }
    }
 
    for ( i = 0; i < n + 1; i++ ) {
        ii = i * i;
 
        sum = 0;
        for ( j = 1; j < i + 2; j++ ) {
            sum += lut[ii + j];
        }
 
        cout << "F" << i << " = " << sum << endl;
    }
    return 0;
}
На сколько это ускорит процесс я не знаю.. надо замерять.
С другой стороны я не вижу ни одной причины, по которой стоит оптимизировать этот цикл.
0
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:03  [ТС] #3
А что программа делает, я ввожу число понятно, результат она его делит на что то,объясните смысл программы, не могу понять вот это:
C
1
2
for(j=1; j<i+2; j++)
        sum+=(double)1/(i*i+j);
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.06.2013, 23:05 #4
Это твоя программа, ты мне должен объяснять что она делает.
Зачем тебе понадобилась оптимизация цикла, который ты не знаешь для чего и как работает?
1
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:07  [ТС] #5
Цитата Сообщение от lazybiz Посмотреть сообщение
Это твоя программа, ты мне должен объяснять что она делает.
сижу, разбираюсь в оптимизации циклов, уже 12 часов сижу, голова кругом, нашел какую то программу, увидел вложенный цикл решил поинтересоваться для общего развития как можно оптимизировать и что она делает, я сам понять не могу. А Вы бы не могли подсказать?
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.06.2013, 23:11 #6
Если тебе нужны приемы оптимизации то я привел тебе один.
Для того чтобы понять как он работает не надо знать для чего нужна эта программа и какие магические числа она считает.
0
Matan!
Delphi/Java/DB Dev + Math
280 / 135 / 26
Регистрация: 31.05.2013
Сообщений: 1,223
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 23:44 #7
на всякий случай приведу комментарии

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream.h>  //подключение библиотек
#include <math.h>
#include <process.h>
 int main()
{
    int n, i=2, j;   // i, j - счётчики циклов
    double sum;
    cout<<"n= ";  //это число,которое вводим, должно быть максимальным
    cin>>n;
    for(i=0; i<n+1; i++)  //если n максимальное число,
                                //то незачем прибавлять к нему 1, проще записать for(i=0; i<=n; i++)
    {
    sum=0;    //сначала сумма была равна 0...
    for(j=1; j<i+2; j++)
        sum+=(double)1/(i*i+j);  //приведение типов в С++
    cout<<"F"<<i<<"="<<sum<<endl;
    }
    system("pause");  //останавливаем прогу,чтобы посмотреть на её результат
   return 0;
}
Добавлено через 2 минуты
попытайтесь оптимизировать прогу,путём изменения входных данных.
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.06.2013, 23:47 #8
Цитата Сообщение от Matan! Посмотреть сообщение
путём изменения входных данных.
А можно оптимизировать программу путем изменения алгоритма?
0
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:51  [ТС] #9
Ну вот смотрите: sum+=(double)1/(i*i+j); sum += i; // Оператор цикла, double - обозначает дробную переменную
получается 1/(i*i+j) то есть с математической точки зрения 1/(n*n+i+2) 1/(150*150+150+2)... 150 это допустим число повторений или с чего начинается сама программа? если с чего начинается сама программа то 1... Правильно я мыслю?
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.06.2013, 23:53 #10
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
Правильно я мыслю?
Хз. Я не понял что ты сказал.
А ты в Си/С++ вообще разбираешься?
0
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:54  [ТС] #11
Цитата Сообщение от lazybiz Посмотреть сообщение
Хз. Я не понял что ты сказал.
А ты в Си/С++ вообще разбираешься?
есть немного, ну так совсем чуть чуть
0
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
11.06.2013, 23:55 #12
Не рановато ты в оптимизацию полез?!
0
Matan!
Delphi/Java/DB Dev + Math
280 / 135 / 26
Регистрация: 31.05.2013
Сообщений: 1,223
Записей в блоге: 2
Завершенные тесты: 1
11.06.2013, 23:55 #13
Цитата Сообщение от lazybiz Посмотреть сообщение
А можно оптимизировать программу путем изменения алгоритма?
Алгоритм и так прост,как тибетский валенок)
0
DVGU.MAKC
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:58  [ТС] #14
Ну смотри: for(j=1; j<i+2; j++) sum+=(double)1/(i*i+j);i=2 получается по условию задачи в объявлении переменной, j исходя из описания цикла получается <i+2 получается сумма=1/(2*2+3)=1/7=0,14 отсюда следует программа запрашивает число повторений допустим 10, стартовое значение получается 1, потом пробегая по циклам в результате чего совершив 1 цикл делит 1на0.14 верно?
0
Matan!
Delphi/Java/DB Dev + Math
280 / 135 / 26
Регистрация: 31.05.2013
Сообщений: 1,223
Записей в блоге: 2
Завершенные тесты: 1
12.06.2013, 00:02 #15
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
(double)1/(i*i+j)
это приведение типов.Почитай учебник.У тебя i и j целые и в знаменателе,поэтому надо перевести это выражение в double.

Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
sum += i
- это просто sum =sum + i.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2013, 00:02
Привет! Вот еще темы с ответами:

Оптимизация кода - C++
В общем дело такое, мне нужно 2 одинаковые программы(небольшие), только одна программа должна быть неоптимизированная, а другая, точно...

Оптимизация памяти - C++
Доброго времени суток. У меня есть класс(код показывать не буду, он не нужен), в приватном поле есть переменная типа int *, то есть класс...

Оптимизация и усовершенствование - C++
Здравствуйте, совсем недавно начал изучать язык программирования &quot;С++&quot;. Решил попрактиковаться, сделал маленькую консольную игру. Назвал...

Оптимизация SDL - C++
Начал изучать SDL. Все бы хорошо, но процесс созданного окна кушает 25% ресурсов процессора. Когда делал по этим урокам:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
12.06.2013, 00:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru