Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложность алгоритма, Помогите оценить сложность алгоритма 
:(
    Опции темы
Vitaly333
Дата 27.5.2008, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Есть один алгоритм. Нужно подсчитать количество арифметических операций ( умножений, делений и сложений) в алгоритме для n. Знаю что сложность будет кубическая , но точно какая подсчитать не смог.

Вот сам алгоритм:

Код


public void Algorithm(){
    int i,j,k;
    int n;
    double sum,sum2;
        
                             
    for (i = 0; i < n ; i++) {
        sum = 0.0;
            for (k = 0; k <= i - 1; k++) sum += A[k][i] * A[k][i]*A[k][k];
            A[i][i] = A[i][i] - sum;

         for (j = i + 1; j < n; j++) {
               sum2 = 0.0;
                for (k = 0; k <= i - 1; k++) sum2 +=A[k][i]*A[k][j]*A[k][k];                
                A[i][j] = (A[i][j] - sum2)/A[i][i];                
         }
    }
            
            
    }



PM MAIL   Вверх
maxdiver
Дата 27.5.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Странно, что не получилось, ведь тут вроде не очень сложно.
Умножение: есть цикл по i, выполняющий n итераций, внутри него каждый раз происходит n-1 умножение (от 0 до i-1 и от i+1 до n-1), т.е. всего n(n-1).
Деление: на первой итерации (i=0) выполняется n-1 деление, на второй n-2, и т.д., на последней 0. Складываем все значения - получаем сумму арифметической прогрессии, и получаем всего n*(n-1)/2.
Со сложениями посложней, потому что не совсем понятно, что считать сложением smile (ну всякие ++, или i+1)
Ну например, если считать только операции +=, то получится, столько же, сколько умножений.
PM MAIL WWW ICQ   Вверх
Vitaly333
Дата 27.5.2008, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

Странно, что не получилось, ведь тут вроде не очень сложно.
Умножение: есть цикл по i, выполняющий n итераций, внутри него каждый раз происходит n-1 умножение (от 0 до i-1 и от i+1 до n-1), т.е. всего n(n-1).


Да не всё так просто получается как кажется на первый взгляд.
А вы разве не заметили что при 2-ом запуске k - ого цикла он имеет 3 уровень вложенности! А это означает что сложность алгоритма будет кубическая!  Вы не обратили внимание , что ещё имеется цикл j = i+1...n а уже в нем k-ый. Если считать что как вы написали то это получается общая сложность : (1.5n)^2+2.5n - а это квадратичная сложность получается. К тому же , даже если бы не было 3  - его уровня вложенности то умножений было бы не n(n-1) а  2n(n-1) - так как на каждой итерации выполнялось бы 2(n-1) умножений sum += A[k][i] * A[k][i] *A[k][k];

 
PM MAIL   Вверх
maxdiver
Дата 27.5.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Vitaly333
Хе, да уж, я умудрился не заметить третий for ))
Меня колбасит после сдачи вычислительной математики, прошу извинить smile
PM MAIL WWW ICQ   Вверх
ksili
Дата 29.5.2008, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 2
Всего: 17



Если принять, что третий for выполняется всегда, можно посчитать верхнюю асимптотическую оценку сложности алгоритма


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
maxdiver
Дата 29.5.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Подождите, а третий (по глубине вложенности) for - ведь количество итераций в нём никак не зависит от j.
Значит, при оценке кол-ва операций его можно рассматривать наравне с forами второго уровня, т.е. например:

Умножение: есть цикл по i, выполняющий n итераций, внутри него каждый раз происходит 2(i-1) умножение, и плюс 2(n-i-1)(i-1) умножение; вот нужно просуммировать такие величины, для этого можно попробовать выразить их рекуррентно...
PM MAIL WWW ICQ   Вверх
Vitaly333
Дата 29.5.2008, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

Если принять, что третий for выполняется всегда, можно посчитать верхнюю асимптотическую оценку сложности алгоритма

Выполняется всегда кроме первой итерации (когда i = 0). Под верхней асимптотической оценкой сложности алгоритма вы понимаете только  умножения при n^3?

Цитата

Умножение: есть цикл по i, выполняющий n итераций, внутри него каждый раз происходит 2(i-1) умножение, и плюс 2(n-i-1)(i-1) умножение; вот нужно просуммировать такие величины, для этого можно попробовать выразить их рекуррентно... 


Просуммировать по i = от 0 до n-1?

PM MAIL   Вверх
maxdiver
Дата 29.5.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Ага.
Или как раз эту сумму не получается посчитать?
Вообще, вот что имеем:
2(n-i-1)(i-1) = 2(n-2-(i-1))(i-1) = 2(n-2)(i-1) - 2(i-1)^2.
Т.е. получили сумму обычной арифметической прогрессии, и последовательности вида 1,4,9,16...; сумма для неё точно есть, я в книге какой-то видел, можно попробовать вывести самому или поискать в интернете.
PM MAIL WWW ICQ   Вверх
Vitaly333
Дата 30.5.2008, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

2(n-2)(i-1) - 2(i-1)^2.


Но это опять же получается квадратичная сложность...
PM MAIL   Вверх
maxdiver
Дата 30.5.2008, 07:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Нет, это одно слагаемое порядка квадрата. А вся сумма, очевидно, получится порядка куба.
Я даже помню, что формула для суммы последовательности 1,4,9,16,... содержит три скобки-множителя.

Добавлено через 10 минут и 33 секунды
Вот, сам нашёл эту формулу smile
Sn = 1/6 n (n+1) (2n+1)
PM MAIL WWW ICQ   Вверх
Vitaly333
Дата 30.5.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

Sn = 1/6 n (n+1) (2n+1)


Это сумма только операций умножения или вообще всех операций? Не могли бы вы подкинуть ссылку гду вы это нашли?
PM MAIL   Вверх
maxdiver
Дата 30.5.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Это сумма для ряда 1+2^2+3^2+...+n^2.
Сумму для ряда 1+2+...+n, надеюсь, все знают )
Тогда мы в состоянии вычислить значение такой вещи:
СУММА 2(n-2)(i-1) - 2(i-1)^2 по i = 0..n-1

Ссылка на формулу для ряда, составленного из квадратов:
http://mathworld.wolfram.com/SquarePyramidalNumber.html
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0536 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.