Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35

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

11.06.2013, 21:41. Показов 4366. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2013, 21:41
Ответы с готовыми решениями:

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

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был создан миф. Это миф о цветовой индефикации...

Циклы с условием, циклы с переменной, вложенные циклы
С условием 1. Ввести натуральное число N и вычислить сумму всех чисел фибоначчи меньших N. Предусмотреть защиту от ввода...

54
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2013, 22:57
Единственное что приходит в голову - это 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
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:03  [ТС]
А что программа делает, я ввожу число понятно, результат она его делит на что то,объясните смысл программы, не могу понять вот это:
C
1
2
for(j=1; j<i+2; j++)
        sum+=(double)1/(i*i+j);
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2013, 23:05
Это твоя программа, ты мне должен объяснять что она делает.
Зачем тебе понадобилась оптимизация цикла, который ты не знаешь для чего и как работает?
1
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:07  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Это твоя программа, ты мне должен объяснять что она делает.
сижу, разбираюсь в оптимизации циклов, уже 12 часов сижу, голова кругом, нашел какую то программу, увидел вложенный цикл решил поинтересоваться для общего развития как можно оптимизировать и что она делает, я сам понять не могу. А Вы бы не могли подсказать?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2013, 23:11
Если тебе нужны приемы оптимизации то я привел тебе один.
Для того чтобы понять как он работает не надо знать для чего нужна эта программа и какие магические числа она считает.
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
11.06.2013, 23:44
на всякий случай приведу комментарии

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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2013, 23:47
Цитата Сообщение от Matan! Посмотреть сообщение
путём изменения входных данных.
А можно оптимизировать программу путем изменения алгоритма?
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:51  [ТС]
Ну вот смотрите: 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
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2013, 23:53
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
Правильно я мыслю?
Хз. Я не понял что ты сказал.
А ты в Си/С++ вообще разбираешься?
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:54  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Хз. Я не понял что ты сказал.
А ты в Си/С++ вообще разбираешься?
есть немного, ну так совсем чуть чуть
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.06.2013, 23:55
Не рановато ты в оптимизацию полез?!
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
11.06.2013, 23:55
Цитата Сообщение от lazybiz Посмотреть сообщение
А можно оптимизировать программу путем изменения алгоритма?
Алгоритм и так прост,как тибетский валенок)
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
11.06.2013, 23:58  [ТС]
Ну смотри: 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!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
12.06.2013, 00:02
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
(double)1/(i*i+j)
это приведение типов.Почитай учебник.У тебя i и j целые и в знаменателе,поэтому надо перевести это выражение в double.

Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
sum += i
- это просто sum =sum + i.
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
12.06.2013, 00:03  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
Не рановато ты в оптимизацию полез?!
да рановато, а толку та, когда приспичит и не в такое полезешь. с 10 числа сижу курсовую делаю, оптимизация встроенных циклов, вчера в 3 часа дня как встал так и до сих пор не ложился завтра сдавать уже надо, время уже 7:01 (я в Приморье живу), информации вроде как нашел, прочитал, переделал, а вот с программой не думал что все так будет сложно, вот и приходится разбираться сидеть
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
12.06.2013, 00:04
В первой итерации i=0, j=1, поэтому сначала 1. делится на 1
0
 Аватар для Matan!
1882 / 1016 / 228
Регистрация: 31.05.2013
Сообщений: 6,645
Записей в блоге: 6
12.06.2013, 00:05
Нет,i=2 в начале.А потом i++.
Ты ведь вложил один цикл в другой.

Добавлено через 1 минуту
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
int n, i=2
Цитата Сообщение от DVGU.MAKC Посмотреть сообщение
for(i=0
непонятки...
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
12.06.2013, 00:07
Цитата Сообщение от Matan! Посмотреть сообщение
Нет,i=2 в начале.А потом i++.
Ты ведь вложил один цикл в другой.
Читай внимательней. Тут каким значением инициализируется i: for(i=0; i<n+1; i++) ?

Добавлено через 46 секунд
В самом начале =2 можно вообще убрать, на результат не повлияет.
0
0 / 0 / 0
Регистрация: 13.01.2012
Сообщений: 35
12.06.2013, 00:09  [ТС]
Смотрите что получается:
n=15
F0=1
F1=0.833333
F2=0.509524
F3=0.351166
F4=0.26463
F5=0.211287
Может быть не мучиться, взять решить исходя из этих данных математически найти в результате чего происходят такие изменения и все?
Ну выполняется же сначала внутренний цикл а потом внешний или неправильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.06.2013, 00:09
Помогаю со студенческими работами здесь

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона для функции 2*X12 - X1*X2 + 3*X22 -...

Циклы. Напечатать числа в виде таблицы, используя только циклы
4. Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): 1 2 2 ...

Циклы. Напечатать числа в виде таблицы, используя только циклы
Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): 1 2 2 ...

Переведите исходные циклы в циклы других форматотв:
Переведите исходные циклы в циклы других форматотв: For i:73 to 122 do в Цикл while: в Цикл repeat: For i:256 downto 100 do в...

Циклы в Паскале (циклы с пост- и предусловием)
Требуется напиcать программу, которая запрашивает числа с клавиатуры до тех пор, пока сумма чисел не превысит 25 или введенное число не...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru