Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
1

Парадокс

30.04.2013, 00:38. Показов 1634. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Назрел вопрос. Релизовывал сортировку слиянием, далее при тестировании, точнее при замерах времени работы, наткнулся на удивительную вещь:

вот код мейна номер один:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void main()
{
    const int N = 200000;
    int A[N];
 
    int F;
 
    for (int i = N-1; i>= 0; i--)
        A[i] = rand();
 
    int start = GetTickCount();
 
    merge_sort (A, 1, N);
 
    int end = GetTickCount();
 
    cout<<end - start;
 
    _getch();
}
время работы: см. изображение 1.

после чего сделал следующее:
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
#include "head.h"
 
void main()
{
    const int N = 200000;
    int A[N];
 
    int F;
 
    for (int i = N-1; i>= 0; i--)
        A[i] = rand();
 
    cout<<1<<endl;
 
    int start = GetTickCount();
 
    merge_sort (A, 1, N);
 
    int end = GetTickCount();
 
    cout<<end - start;
 
    _getch();
}
время работы см. картинку 2. Причем не обязательно cout, вообще, добавление любого действия, перед сортировкой дает такой результат.
Вопрос: КАК ???
Вот сама сортировка, как понимаю дело в ней, поскольку все остальное ведет себя нормально:
Кликните здесь для просмотра всего текста
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
void merge (int *Array, int p, int q, int r)
{
    int i = p - 1, j = q;
 
    int *result = new int[r - p + 1];
 
    int k = 0;
 
    while(i < q && j < r)
        if (Array[i] < Array[j])
            result[k++] = Array[i++];
        else
            result[k++] = Array[j++];
 
    while (i < q)
        result[k++] = Array[i++];
    while (j < r)
        result[k++] = Array[j++];
 
    for (int i = 0, j = p - 1 ; i<r - p + 1; i++, j++)
        Array[j] = result[i];
 
    delete[] result;
}
 
void merge_sort (int *Array, int Start, int End)
{
    if (Start < End)
    {
        int Split = (Start + End)/2;
        merge_sort (Array, Start, Split);
        merge_sort (Array, Split + 1, End);
        merge (Array, Start, Split, End);
    }
}
Миниатюры
Парадокс   Парадокс  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.04.2013, 00:38
Ответы с готовыми решениями:

Парадокс выбора
Имеет ли смысл напрочь забыть о всех функциях прямиком из Си? Существует ли полная замена в Си++...

C++, динамический массив, парадокс
Итак, столкнулся с таким моментом: Друг пишет в CodeBlocks С++: #include &lt;stdio.h&gt; int...

Парадокс: значение переменной равно её адресу
Друзья! Вот код, в нём всё понятно. Выводятся одинаковые значения. Но ведь этого не может быть!...

Парадокс в компилере C++
Недавно программирую на C++. Пишу на Visual Studio. Язык по началу кажется лёгким, и я решил...

19
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
30.04.2013, 01:00 2
Возможно, дело в оптимизации компилятором, вызовы происходят в разное время.
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
30.04.2013, 12:07  [ТС] 3
происходит только для этой сортировки, все остальные которые писал, работают независимо от того есть перед их запуском что-то или нету...

Добавлено через 10 часов 51 минуту
пробовал в онлайн компиляторах, разницы во времени никакой. Пробовал на другом компьютере, разница есть, но где-то в секунду для больших массивов. Может дело в Visual Studio 2012 ? И у себя и на другом компе компилировал в ней.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
30.04.2013, 12:26 4
Цитата Сообщение от alig007 Посмотреть сообщение
Может дело в Visual Studio 2012 ?
Можно запустить без отладчика - тогда время мало отличается.
Если линковать статически студийный рантайм, то результаты вообще резко меняются.
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
30.04.2013, 14:48 5
alig007, Ссравнение делают на одинаковых тестах, не факт, что ваш компилятор не делает randomize, srand(GetTickcCount()) перед запуском

Добавлено через 8 минут
alig007, Вот такой код, всё окей работает, никаких оптимизаций или чудес (PS я грань кости не менял, всегда генерируется по одному и тому же распределению => массивы одинаковые)
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <set>
#include <vector>
#include <limits>
#include <queue>
#include <string>
#include <map>
#include <algorithm>
#include "Windows.h"
#include <conio.h>
 
using namespace std;
 
void merge (int *Array, int p, int q, int r)
{
    int i = p - 1, j = q;
 
    int *result = new int[r - p + 1];
 
    int k = 0;
 
    while(i < q && j < r)
        if (Array[i] < Array[j])
            result[k++] = Array[i++];
        else
            result[k++] = Array[j++];
 
    while (i < q)
        result[k++] = Array[i++];
    while (j < r)
        result[k++] = Array[j++];
 
    for (int i = 0, j = p - 1 ; i<r - p + 1; i++, j++)
        Array[j] = result[i];
 
    delete[] result;
}
 
void merge_sort (int *Array, int Start, int End)
{
    if (Start < End)
    {
        int Split = (Start + End)/2;
        merge_sort (Array, Start, Split);
        merge_sort (Array, Split + 1, End);
        merge (Array, Start, Split, End);
    }
} 
 
int main(){            
    freopen("input.txt", "rt", stdin);
    freopen("output.txt", "wt", stdout);
    const int N = 200000;
    int A[N];
 
    int F;
 
    for (int i = N-1; i>= 0; i--)
        A[i] = rand()%100000;
 
    int start = GetTickCount();
 
    merge_sort (A, 1, N);
    
    cout << GetTickCount() - start;
 
    return 0;
}
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
30.04.2013, 18:43  [ТС] 6
кстати, если поменять debug на release то время сокращается, но по прежнему остается разрыв в несколько секунд
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
30.04.2013, 18:51 7
alig007, я вам скинул код, в котором всё верно работает
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
30.04.2013, 19:06 8
Цитата Сообщение от Ternsip Посмотреть сообщение
C++
1
A[i] = rand()%100000;
rand() умеет генерировать числа > 32767 ?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.04.2013, 19:11 9
Цитата Сообщение от ya_noob Посмотреть сообщение
rand() умеет генерировать числа > 32767 ?
Зависит от реализации http://www.cplusplus.com/refer... /RAND_MAX/
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
30.04.2013, 20:44 10
ya_noob, нет, кто вам сказал ? я написал Mod для страховки

Добавлено через 1 минуту
ya_noob, я хотел показать, что нет никакого парадокса, есть невнимательность

Добавлено через 4 минуты
Tulosba, во всех стандартах с++, действительно, это 2 неполных байта
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.04.2013, 21:02 11
Ternsip, не во всех https://ideone.com/TPcbJD
1
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
30.04.2013, 22:17 12
Tulosba, забавно, спасибо, кстати, в C++ builder от Embarcadero rand тоже большое число кидал, так что защита -- сила привычки

Добавлено через 5 минут
Tulosba, я проверил через http://codeforces.com/ GNU C++0x 4, разве gcc-4.7.2 не относится ? потому как выдаёт именно 32767, уж простите за придиру, я люблю мелкие шалости

Добавлено через 1 минуту
Tulosba, Просто, потом, на запросы пиши по ГОСТу, дорогой ГОСТЬ буду отвечать вот такими дерзкими вещами, как различия в спецификациях. В целом, это не плохой рычаг на защите своего софта.
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
30.04.2013, 23:38  [ТС] 13
Ternsip, нихрена там не работает, точно так же как и в моем все. по крайней мере в VS 2012. Пробовал компилить в старом Билдере 6, и во-певых, сортирует быстрее чем ВС 2012, во-вторых, нету разницы между первым и вторым вариантами. все-таки дело в продукте майкрософта скорее всего.
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
01.05.2013, 00:15 14
alig007, а вы точно моё решение собрали ? без всякой отсебятины ? у меня тоже MVS2012. Создайте новый проект с решением.

Добавлено через 1 минуту
alig007, попробуйте засекать через ctime clock
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
01.05.2013, 15:10  [ТС] 15
Ternsip, проверил все заново, без изменений. да и вообще, чем отличается ваш код?) да и неважно чем засекать, разница между 20 секундами и 2 секундами и без таймера заметна)
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
01.05.2013, 15:44 16
Запуск без отладчика? (ctrl+F5)
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
01.05.2013, 16:05 17
alig007, тогда запускайте ваш код на http://codeforces.com/ там будет время исполнения

Добавлено через 46 секунд
alig007, http://codeforces.com/problemset/customtest
на этом сайте гарантированно верно показывеется время работы программы
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
01.05.2013, 18:08  [ТС] 18
Croessmah, без отладчика, во первых - время одинаково для обоих случаев, во-вторых - время сортировки гораздо меньше чем с отладчиком. Так в чем же дело все-таки?

Добавлено через 1 минуту
блин, а если еще и в режиме Realese а не Debug то время вообще офигительно мало, для 200 000 елементов, 31 мс, по сравнению с 160 в режиме Debug
0
670 / 198 / 29
Регистрация: 10.05.2012
Сообщений: 595
01.05.2013, 18:10 19
alig007, запустите ваш код на http://codeforces.com/problemset/customtest и ваша проблема решится, правда, там потребуется регистрация. Вся ваша беда в том, что вы не можете разобраться со средой.
0
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 28
01.05.2013, 18:34  [ТС] 20
Ternsip, да я понял уже) ладно, спсибо всем)
0
01.05.2013, 18:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.05.2013, 18:34
Помогаю со студенческими работами здесь

Работа с базой данных парадокс
Всем привет. Ребята вы не могли бы привести пример работы с базой данных paradox (.db), или хотя...

Парадокс при динамическом создании элементов
Доброго времени суток уважаемые форумчане. Столкнулся с нерешаемой проблемой, а именно парадокс. ...

Парадокс
ситуация в следующем есть цмс но это не важно, на лакалке к базе данных цмс добавил еще три своих...

Парадокс
Математический парадокс Допустим я у друга взял 100 рублей ,пошел в магазин и потерял их,...

If else парадокс)
if (!isset($fupload) or empty($fupload) or $fupload =='') { $avatar =...

Парадокс
Здравствуйте! Вот моя машина- материнка Foxconn NF4SK8AA-8KRS SLI nForse4, 4DDR, 2xPCL-Ex,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru