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

Как замерить время работы функции? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Разбить число на цифры при помощи цикла http://www.cyberforum.ru/cpp-beginners/thread563190.html
Как разбивать число на цифры, когда заведомо не известно сколько в этом числе будет цифр. Циклом? Задание: Пользователь вводит с клавиатуры число - программа должна показать сколько в данном...
C++ Таблица перевода миль в километры и обратно. Помогите решить задачу, нужно вывести на экран таблицу пересчета миль в км и обратно до заданного k км. Решение нужно без использования массивов, можно использовать цикл. Должно выводится на экран... http://www.cyberforum.ru/cpp-beginners/thread563186.html
C++ Бинарные деревья: создание, отображение, поиск узлов
Написать программу, которая выполняет следующие действия: 1. Генерирует с помощью генератора случайных чисел 10 символов латинского алфавита. 2. Из полученных символов строит упорядоченное...
Переставить в заданных порядках все элементы s-ой строки и k-ого столбца матрицы C++
Определить и протестировать класс CM, содержащий в качестве компонентов указатель на «динамический двумерный массив» (матрицу А) и его размеры (m-число строк и n число столбцов), а также конструктор...
C++ Необходимо выбрать структуру (список, К-Ч дерево и т.д) для хранения данных http://www.cyberforum.ru/cpp-beginners/thread563163.html
Решил описать задачку здесь, может кому тоже интересно будет, такие не каждый день на выдумывание хитрых алгоритмов дают, это не скучная задачка вроде моих универовских "напиши односвязный список" ...
C++ Написать программу на с++, которая считывает текст из файла.. Написать программу, которая считывает текст из файла и выводит на экран только строки, не содержащие двузначных чисел. Что-то вот получилось,но не правильно работает) помогите пожалуйста #include... подробнее

Показать сообщение отдельно
Chelioss
180 / 180 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
02.05.2012, 01:03  [ТС]
Я тут измерил время нахождения определителя методом конденсации Доджонса(1) и методом разложения по первой строке(2).
Для матрицы 9x9 у меня посчитало первым методом за 3.432 секунды, а вот вторым за 81.526. Процессор amd athlon 64 x2 4600+.
Время не слишком большое? Как думаете? Странно, что первый метод так быстро считает по сравнению со вторым, а второй так долго вообще.
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <vector>
#include <iostream>
#include <windows.h>
 
void erase_irow_jcolomn( std::vector< std::vector< long double >>& matr, int i, int j )
{
    matr.erase( matr.begin() + i );
    for( size_t i = 0; i < matr.size(); ++i ) {
        matr.at( i ).erase( matr.at( i ).begin() + j );
    }
}
 
// метод конденсации Доджсона
long double determinant( std::vector< std::vector< long double >>& matr )
{
    if( matr.size() == 1 ) {
        return matr.at( 0 ).at( 0 );
    }
    if( matr.size() == 2 ) {
        return matr.at( 0 ).at( 0 ) * matr.at( 1 ).at( 1 ) - matr.at( 0 ).at( 1 ) * matr.at( 1 ).at( 0 );
    }
    auto matr1( matr );
    erase_irow_jcolomn( matr1, 0, 0 );
    auto matr2( matr );
    erase_irow_jcolomn( matr2, matr2.size() - 1, matr2.size() - 1 );
    auto matr3( matr );
    erase_irow_jcolomn( matr3, matr3.size() - 1, 0 );
    auto matr4( matr );
    erase_irow_jcolomn( matr4, 0, matr4.size() - 1 );
    auto matr5( matr );
    erase_irow_jcolomn( matr5, 0, 0 );
    erase_irow_jcolomn( matr5, matr5.size() - 1, matr5.size() - 1 );
 
    return ( determinant( matr1 ) * determinant( matr2 ) -
        determinant( matr3 ) * determinant( matr4 ) ) / determinant( matr5 );
}
 
// метод разложения по первой строке
long double determinant2( std::vector< std::vector< long double >>& matr )
{
    if( matr.size() == 1 ) {
        return matr.at( 0 ).at( 0 );
    }
 
    long double result = 0.0l;
    for( size_t i = 0; i < matr.size(); ++i ) {
        if( matr.at( 0 ).at( i ) != 0.0 ) {
            auto mtr = matr;
            erase_irow_jcolomn( mtr, 0, i );
            result += ( ( i % 2 == 0 ) ?  1 : -1 ) *
                matr.at( 0 ).at( i ) * determinant2( mtr );
        }
    }
    return result;
}
int main()
{
    int n = 9;
    std::vector< std::vector< long double >> matr( n,std::vector< long double >( n, 0.0l ) );
    for( size_t i = 0; i < matr.size(); ++i ) {
        for( size_t j = 0; j < matr.size(); ++j ) {
            matr[i][j] = rand();
        }
    }
 
    int start=GetTickCount();
    std::cout << determinant( matr ) << std::endl;
    int end=GetTickCount();
    std::cout << (end-start)/1000.0 << std::endl;
    start=GetTickCount();
    std::cout << determinant2( matr ) << std::endl;
    end=GetTickCount();
    std::cout << (end-start)/1000.0 << std::endl;
    std::cin.get();
    return 0;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru