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

Оптимизация полного перебора - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Самое длинное слово http://www.cyberforum.ru/cpp-beginners/thread828198.html
Дана строка, содержащая пробелы. Найдите в ней самое длинное слово, выведите это слово и его длину. Формат входных данных Задана одна строка, содержащая пробелы. Слова разделены ровно одним пробелом. Формат выходных данных Необходимо вывести самое длинное слово в строке и его длину. Пример
C++ Второклассная задача У второклассников очень популярна следующая задача: 101=1 8181515=4 1111112=0 8888888=14 http://www.cyberforum.ru/cpp-beginners/thread828194.html
Делаем срезы C++
Дана строка. Сначала выведите третий символ этой строки. Во второй строке выведите предпоследний символ этой строки. В третьей строке выведите первые пять символов этой строки. В четвертой строке выведите всю строку, кроме последних двух символов.
C++ одномерные массивы (Найдите 6-ой член последовательности)
Найдите 6-ой член последовательности A(i)=A(i-1)*A(i-1)+1 , если А(1)=5.
C++ Максимальная длина монотонного фрагмента http://www.cyberforum.ru/cpp-beginners/thread828184.html
Дана последовательность натуральных чисел, завершающаяся число 0. Определите наибольшую длину монотонного фрагмента последовательности (то есть такого фрагмента, где все элементы либо больше предыдущего, либо меньше). Числа, следующие за числом 0, считывать не нужно. Ввод Вывод 1 3 7 9 0
C++ минимальный и максимальный элемент последовательности Найти минимальный и максимальный элемент последовательности. Язык Си. Помогите, пожалуйста, поправьте подробнее

Показать сообщение отдельно
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.04.2013, 23:03     Оптимизация полного перебора
hofmn, самый простой ThreadPool дает выйгрышь в производительности в среднем в 2 раза(в лучшем случаи где-то в 3 раза).
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <thread>
#include <string>
#include <queue>
#include <mutex>
#include <ctime>
 
static bool isCheck(const std::string& key)
{
    static std::string cur_key = "SAQZ"; // Password
    return key == cur_key;
}
 
std::string Find()  // передаем код, который нужно подобрать
{
    std::string findedPin = "****";
    
    for (char j = 'A'; j <= 'Z'; ++j)
    {
        findedPin[0] = j; // [a][*][*][*]
        for (char k = 'A'; k <= 'Z'; ++k)
        {
            findedPin[1] = k; // [a][a][*][*]
            for (char l = 'A'; l <= 'Z'; ++l)
            {
                findedPin[2] = l; // [a][a][a][*]
                for (char m = 'A'; m <= 'Z'; ++m)
                {
                    findedPin[3] = m; // [a][a][a][a] 
                    if (isCheck(findedPin)) // aaaa == pin ? 
                    {
                        return findedPin;
                    }
                }
            }
        }
    }
    return "FATAL ERROR";
}
 
#include "ThreadPool.h"
 
bool Work(std::string key)
{
    for (; key[1] <= 'Z'; ++(key[1]), key[2] = 'A') 
    {
        for (; key[2] <= 'Z'; ++(key[2]), key[3] = 'A')
        {
            for (; key[3] <= 'Z'; ++(key[3]))
            {
                if (isCheck(key))
                {   
                    andrey::ThreadPool::result = key;
                    return true;
                }
            }
        }
    }
    return false;
}
 
int main()
{
    clock_t time;
 
    std::string res;
    clock_t t1 = 0, t2 = 0;
 
    for (int i = 0; i < 100; ++i) 
    {
 
        time = clock();
 
        res = Find();
 
        time = clock() - time;
        t1 += time;
 
        time = clock();
 
        andrey::ThreadPool thrpl(9);
 
        // algorithm
        for (std::string key = "AAAA"; key[0] <= 'Z'; ++(key[0]))
        {
            thrpl.enqueue(Work, key);
        }
 
        time = clock() - time;
        t2 += time;
    }
 
    printf("%lf\n", (double)t1 / CLOCKS_PER_SEC);
    printf("%lf\n", (double)t2 / CLOCKS_PER_SEC);
 
    std::cout << res << std::endl;
    std::cout << andrey::ThreadPool::result << std::endl;
 
    return 0;
}
Добавлено через 5 минут
http://d.pr/i/dWAC
 
Текущее время: 20:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru