Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3

Как ускорить логику цикла? [for experts]

25.01.2021, 16:21. Показов 5704. Ответов 62

Студворк — интернет-сервис помощи студентам
Приветсвую.
Есть рабочий код для простой задачи. На входе имеем начало и конец отрезкОВ надо определить какие области эти отрезки НЕ перекрыли. Грубо говоря какие доски забора остались НЕ покрашены.
Например
C
1
2
3
4
5
6
7
8
9
На входе:
10 //длина забора
2 //сколько отрезков
1 4 //начало конец отрезка
5 6 //начало конец отрезка
На выходе:
0 1
4 5
6 10
Вот сама программа
Кликните здесь для просмотра всего текста
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
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
 
int main()
{
    int L, start = -1, count = 0;
    scanf("%d", &L);
    unsigned int *fence = (int *)calloc((L >> 5) + 1, sizeof(int)); //set memory to 0
    if (!fence) perror("calloc failed");
 
    int N;
    scanf("%d", &N);
    for (int i = 0; i < N; i++) {
        int st; //starting point
        int ed; //ending point
        scanf("%d%d", &st, &ed);
        
        // for (int i = st; i < ed; i++) fence[i] = 1;
        for (int i = st; i < ed; i++) fence[i>>5] |= (1 << (i & 31));
 
    }
    
    for (int i = 0; i < L; i++) {
 
        if (!fence[i>>5] && ((i + 32) < L)) {
            if (count == 0) {start = i; printf ("%d ",i);}
            count += 32; i += 31; continue;
        }
        else {
 
            // if ((fence[i] || i+1 == L) && count > 0)
            if (fence[i>>5] & (1 << (i & 31))) {
                if (count > 0) {printf ("%d\n",start+count); count = 0;}
            }
            else {
                if (count == 0) {start = i; printf ("%d ",i);}
                count++;
            }
        }
    }
    
    if (count > 0) printf ("%d\n",start+count);
    if (start < 0) puts("All painted");
    free (fence);
 
    return 0;
}

//битовое расположение используется для уменьшения памяти (отведенно максимум 2Гб для нашей задачи) и (надеюсь) увеличения скорости


Но стоит задача его "ускорить". Т.к. например с такими входными данными этот код делается неприемлимо долго
Кликните здесь для просмотра всего текста
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
2000000000 //Длина
72 //Отрезки
51 57
566 4234
598149 834729
5122 6160
17 46
165271503 259311575
288436131 1932691397
75 78
343 393
41 45
204 479
74 92
207 490
49 56
964644464 1887812645
136 420
429742458 1053501121
195 393
232 1608
184 6763
13 33
60169371 1162580884
774423404 797664100
1381580035 1668522412
190444 284746
112880052 1389027745
196 279
117760 859558
121381 236758
40 83
51 74
4048 6191
32 82
1 65
37 148
0 73
591646 893422
224008 649271
3150 8259
951966787 1627123054
318604 604539
81 97
781864601 1390933683
17 124
1030908877 1796833002
39 45
82739 363091
2571 3239
156 333
4930 7479
996706325 1268325988
19 90
26667 108371
52581129 803126065
1833231690 1908070559
783093028 807124796
154115 347846
1731 6452
12 78
3 33
462351 1805485861
271 460
1282262829 1424278575
5787 8055
3759 4011
87992 288855
245938 797316
3128 7514
42 80
398695717 864069801
43 44
1223 3675


Жду от уважаемого сообщества один из двух варианта ответа
А) как еще можно ускорить данную логику ?
Б) если существенно ускорения выше обозначенной логики не возможно, подскажите алгоритм (словесный код) как можно быстро (всмысле не написать код быстро а чтоб программа быстро крутилась) решить данную задачу ?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.01.2021, 16:21
Ответы с готовыми решениями:

Как ускорить работу цикла?
Всем привет. Итак, мне нужно было решить задачу на подобии вот этой https://www.cyberforum.ru/turbo-pascal/thread298010.html на языке...

Как ускорить выполнение цикла
Есть ajax запрос по которой передается данные в другой файл и там выполняется цикл от 100 до 1000 раз примерно function name(){ ...

Как ускорить выполнение цикла на Update
имеется код на выполнение обновления базы из грида по кнопке, но все дело в том что таблица имеет 17000 строк и все это выполняется очень...

62
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
29.01.2021, 16:19
Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
double arr[4][2] = { { 2,5 }, { 1.e-100, 1242 }, { 1.4, 66 }, { 0, 13 } };
    std::qsort(arr, 4, 16, [](const void* x1, const void* x2)->int{ return *((double*)x1) - *((double*)x2); });
    for(auto i : arr) std::cout << i[0] << " " << i[1] << "\n";
    
    std::cout << "\n\n";
    
    double brr[4][2] = { { 2,5 }, { 1.e-100, 1242 }, { 1.4, 66 }, { 0, 13 } };
    std::qsort(brr, 4, 16, [](const void* x1, const void* x2)->int{ return (*((double*)x1) > *((double*)x2)) - (*((double*)x2) > *((double*)x1)); });
    for(auto i : brr) std::cout << i[0] << " " << i[1] << "\n";
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
29.01.2021, 17:51  [ТС]
вообщем смог сам победить , без подглядывания на ваши варианты (а то может и красивее сделал бы но блин что с моей головой !? почему у меня почти все задачи сводятся к куче if как заставить её думать по другому ? или это просто данно не всем ?

PS: хотя просматривая лучшие варианты на codingame - мой оказывается не самый хужший , как минимум лаконичнее многих...
PSS: очередной раз поражаюсь могуществу Си, ктото в 20 строчек делает код, а ктото этот же в 120
Кликните здесь для просмотра всего текста
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
    for (int i = 0; i < N; i++){
        if (i == 0){
            if (fence[0][0]){
                printf("%d %d\n", 0, fence[0][0]);
                if (fence[0][1] != L) printf("%d ", fence[0][1]);
            }
            else if (fence[0][1] != L) printf("%d ", fence[0][1]);
            else puts("All painted");
            continue;
        }
        if (fence[i][1] == L && fence[i][0] > 0){
            printf("%d\n", fence[i][0]);
            break;
        }
        if (i == N-1 && fence[i][0] > 0){
            printf("%d\n", fence[i][0]);
            if (fence[i][1] < L) printf("%d ", fence[i][1]);
            continue;
        }
        if (fence[i][0] > 0){
            printf("%d\n", fence[i][0]);
            printf("%d ", fence[i][1]);
        }
    }
    if (fence[N-1][1] < L) printf("%d\n", L);


Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никаких "понятных причин" я тут не вижу. О чем речь вообще?
ну просто прототип компоратора int compare (const void * pa, const void * pb); принимает только *a, *b ну то есть массив (он же указатель) и я ни как не мог предположить что туда можно впихнуть вообще почти всё что угодно
первый раз столкнулся с таким , до сих пор всё было очень строго. int на входе так int. указатель указателей так указатель указателей , а тут разрыв шаблона
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
29.01.2021, 22:12
Цитата Сообщение от alexbmd Посмотреть сообщение
вообщем смог сам победить , без подглядывания на ваши варианты
с чем искренне Поздравляю

Когда много условий (if) - значит что система решения плохо продумана.
Код в сообщении выше - мало того что наверняка проиграет в производительности,
его изменение другим программистом (или даже Вами, спустя некоторое время) будет затруднительным.

Цитата Сообщение от alexbmd Посмотреть сообщение
как заставить её думать по другому ? или это просто данно не всем ?
приходит с опытом, опыт приходит с проделанной работой (попытками), перед тем как пытаться, нужно изучить теорию
(возможности языка, алгоритмику, примеры, ). Имхо.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
29.01.2021, 22:30
Цитата Сообщение от alexbmd Посмотреть сообщение
ну просто прототип компоратора int compare (const void * pa, const void * pb); принимает только *a, *b ну то есть массив (он же указатель) и я ни как не мог предположить что туда можно впихнуть вообще почти всё что угодно
Странно. В языках С и С++ указатель может указывать на какие угодно данные, если эти данные располагаются в памяти. Почему вдруг тут оказалось "ну то есть массив" - не ясно.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
29.01.2021, 23:25  [ТС]
SmallEvil, спасибо

TheCalligrapher, ну ссылка то она ссылка но просто так один в другой не заменяются и тут даже теория не всегда помогает... понятно что нужно много практики и опыта (коего у вас не отнять) мне же пока тяжело а чаще очень тяжело бороться со всякими (*)[]-> ит.д.
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
01.02.2021, 19:33  [ТС]
Renji, SmallEvil, TheCalligrapher, zayats80888, Folian, господа , ради интереса хочу замерить скорость ваших вариантов /узнать насколько мой вариант уступает... вобщем
у меня отрезки записанны ввиде матрицы int fence[100][2], L длина, N кол-во;... у вас всякие векторы поинты и т.д. (чтоб я сам долго не ломал голову), подскажите плиз (каждый для своего варианта) как быстро перевести/скопировать мою матрицу в ваши инпут даты а дальше я скопирую ваши примеры и на основе моей инпут дате проверю все примеры на скорость ради интереса (если не возражаете).

я имею ввиду мне нужно от каждого из вас чтото типо (например)
C++
1
2
std::vector points; 
points = <vector>fence;
ну взависимости от ваших типов/перемнных


PS:
Цитата Сообщение от XLAT Посмотреть сообщение
typedef int T;
хотел спросить а с какой целью это делается ? чтоб код на пару байт был меньше ?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
01.02.2021, 19:39
Может, стоит разобраться как эти вектора работают?
В моем случае каждый lineList.push_back({x,y}); пихает в список один отрезок x-y. Ну, вызывать push_back в цикле то вы сами сумеете? Если совсем никак, то замените весь код main до push_back на:
C++
1
std::vector<Line> lineList={{1,2},{3,4},{5,6}};//ну, сами дальше ручками вбейте список отрезков
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
01.02.2021, 20:16
Цитата Сообщение от alexbmd Посмотреть сообщение
чтоб я сам долго не ломал голову
У меня из файла подгружает, структура как в шапке под спойлером, только без комментариев //длина //отрезки. Рядом с ~.cpp / ~.exe положить "fence_input1.txt" и оно само. Это по-простому.

Чтоб заполненный массив использовать придется немного костылей вставить; в принципе, могу подправить, но проще файлом)
0
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
01.02.2021, 21:36  [ТС]
так он у меня не рандом генерируется... он у меня как раз "ручками" одной строкой {1,2,3,4,5,6 и тд 100 отрезков} как раз получится запихнуть в ваш std::vector<Line> lineList={мой спсиок}
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
01.02.2021, 22:36
Цитата Сообщение от alexbmd Посмотреть сообщение
как раз получится запихнуть в ваш std::vector<Line> lineList={мой спсиок}
Не совсем. Но я чуть попозже переделаю тогда.

Кстати, насчет
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В off-lline задаче всегда эффективнее будет сначала накопить все входные данные
мне тут тоже интересно стало и я, короче, заделал файл на 10,000,000 пар чисел ну и попроверял.

Может, конечно, я где-то накосячил, но вот результаты:

Кликните здесь для просмотра всего текста

Renji, ~11 секунд
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <chrono>
 
class Line
{
    public:
        bool operator<(const Line&line)const
        {
            return x<line.x;
        }
 
        int x,y;
};
 
int main()
{
    auto begin = std::chrono::steady_clock::now();
    
    std::ifstream file("fnc_extended");
    std::size_t lenght,lineListSize;
    //std::cin>>lenght>>lineListSize;
    file >> lenght>>lineListSize;
    std::vector<Line> lineList;
    for(std::size_t i=0; i<lineListSize; ++i)
    {
        int x,y;
    //  std::cin>>x>>y;
        file >> x >> y;
        lineList.push_back({x,y});
    }
    std::sort(lineList.begin(),lineList.end());
    auto writePos=lineList.begin();
    for(auto readPos=lineList.begin()+1; readPos<lineList.end(); ++readPos)
    {
        if(writePos->x<=readPos->x && readPos->x<=writePos->y)
            writePos->y=std::max(writePos->y,readPos->y);
        else
            *++writePos=*readPos;
    }
    lineList.erase(++writePos,lineList.end());
    std::cout<<"{0,"<<lineList.front().x<<"} ";
    for(auto line=lineList.begin(); line+1<lineList.end(); ++line)
        std::cout<<"{"<<line[0].y<<" "<<line[1].x<<"} ";
    std::cout<<"{"<<lineList.back().y<<","<<lenght<<"}";
    
    file.close();
    
    auto end = std::chrono::steady_clock::now();
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
        
    std::cout << "\n\nTime = " << elapsed_ms.count() ;
    
    system("pause");
    return 0;
}

TheCalligrapher, ~19
Кликните здесь для просмотра всего текста
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
#include <vector>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <chrono>
 
int main()
{
    auto begin = std::chrono::steady_clock::now();
    std::ifstream file("fnc_extended");
 
    int length = 0;
//  std::cin >> length;
    file >> length;
 
    unsigned n_segments = 0;
//  std::cin >> n_segments;
    file >> n_segments;
 
    std::vector<std::pair<int, int>> points;
 
    for (unsigned i = 0; i < n_segments; ++i)
    {
        int xl = 0, xr = 0;
    //  std::cin >> xl >> xr;
        file >> xl >> xr;
        points.emplace_back(xl, +1);
        points.emplace_back(xr, -1);
    }
 
    points.emplace_back(length, +1);
 
    std::sort(points.begin(), points.end());
 
    int n_coverage = 0;
    int prev_x = 0;
 
    for (const auto &point : points)
    {
        if (n_coverage == 0 && prev_x != point.first)
            std::cout << prev_x << " " << point.first << std::endl;
 
        prev_x = point.first;
        n_coverage += point.second;
    }
 
 
    file.close();
 
    auto end = std::chrono::steady_clock::now();
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
 
    std::cout << "\n\nTime = " << elapsed_ms.count() ;
    system("pause");
 
}

XLAT, ~68
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <map>
#include <fstream>
#include <chrono>
 
typedef int T;
 
///----------------------------------------------------------------------------|
/// ?????.
///----------------------------------------------------------------------------:
int main()
{
    auto begin = std::chrono::steady_clock::now();
 
    std::ifstream file("fnc_extended");
 
    T n, l;
//  std::cin >> l >> n;
    file >> l >> n;
    std::map<T, T> fence;
 
    for(T i = 0; i < n; ++i)
    {
        T s;
//      std::cin >> s;
        file >> s;
        fence[s]++;
///     std::cin >> s;
        file >> s;
        fence[s]--;
    }
 
    T    cnt   = 1;
    bool intro = true,
         all   = true;
    fence[l]++;
    fence[0]--;
 
/*тут и ниже прально подменил? у меня  [i, val] не фурычит*/
    //for(auto& [i, val] : fence) // 
    for(auto& i : fence)
    {
        cnt += i.second;
 
        if(0 == cnt &&  intro)
        {
            intro = false;
            std::cout << i.first << ' ' ;
            all = false;
        }
        else if(0 <  cnt && !intro)
        {
            intro = true ;
            std::cout << i.first << '\n';
        }
    }
    if(all) std::cout << "All painted";
 
    file.close();
 
    auto end = std::chrono::steady_clock::now();
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
 
    std::cout << "\n\nTime = " << elapsed_ms.count() ;
    system("pause");
}


SmallEvil, ~39
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <chrono>
 
 
using namespace std;
 
void scanSeq(istream & is, ostream & os)
{
    typedef  unsigned long long s_t;
    map<s_t , s_t> intervs;
    s_t L, N;
    is>>L;
    is>>N;
    pair<s_t, s_t> p;
    for (s_t i = 0; i<N; ++i)
    {
        is>>p.first>>p.second;
        intervs[p.first]=p.second;
    }
 
    s_t pos_b = 0, pos_e;
    for (auto & i : intervs)
    {
        pos_e = i.first;
        if (pos_e > pos_b)
            os<<pos_b<<" "<<pos_e<<endl;  // ????? "?????????????" "??????"
        if (i.second > pos_b) // ?????????? ??? ???????? ? ??????????????? ?????????
            pos_b = i.second;  // ??????? ????, ?????????, ???? ????
    }
    if (pos_b < L) // ?????, ???? ????
        os<<pos_b<<" "<<L<<endl;
}
int main()
{
    auto begin = std::chrono::steady_clock::now();
    // ??? ?????
    //ifstream ifs("input.txt");
    ifstream ifs("fnc_extended");
    scanSeq(ifs, cout);
 
    // ?????? ????
    // stringstream ss;
    // ss<<100<<endl<<5<<endl<<" 5 11 "<<" 4 9 "<<" 1 3 "<<" 40 70 "<<" 50 60 ";
    // scanSeq(ss, cout);
    ifs.close();
 
    auto end = std::chrono::steady_clock::now();
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
 
    std::cout << "\n\nTime = " << elapsed_ms.count() ;
    system("pause");
}


Folian, ~6
Кликните здесь для просмотра всего текста
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <vector>
#include <fstream>
#include <chrono>
 
enum { BEGIN, END };
 
struct Node
{
    bool kind;
    int pos;
    Node* next;
};
 
struct MyList
{
    Node* head;
    Node* it;
 
    void add_segment(Node* A, Node* B)
    {
        it = head;
        Node* temp = nullptr;
 
        while(it->next && it->next->pos < A->pos) it = it->next;
 
        temp = it->next;
        it->next = ((it->next->kind) ? B : A );
 
        if(it->next->kind)
        {
            it->next = B;
        }
        else
        {
            it->next = A;
            it = it->next;
        }
 
        while(temp->next && temp->pos < B->pos) temp = temp->next;
        if(temp->kind)
        {
            it->next = temp;
        }
        else
        {
            if(B->pos == temp->pos)
            {
                it->next = temp->next;
            }
            else
            {
                it->next->next = temp;
            }
        }
    }
 
    void show()
    {
        it = head->next;
        while(it->next)
        {
            if(it->kind) std::cout << "\n";
            std::cout << it->pos << " ";
            it = it->next;
        }
    }
};
 
int main()
{
    auto begin = std::chrono::steady_clock::now();
 
    int len;
    int n;
 
    std::ifstream file("fnc_extended");
 
    if(file.is_open())
    {
        //  std::cin >> len >> n;
        file >> len >> n;
 
        std::vector<std::pair<Node, Node>> node_list(n);
 
        Node B_end = { END, len + 1, nullptr };
        Node B_beg = { BEGIN, len, &B_end };
        Node A_end = { END, 0, &B_beg };
        Node A_beg = { BEGIN, -1, &A_end };
 
        MyList Fence;
        Fence.head = &A_beg;
 
        for(int i=0; i<n; ++i)
        {
            node_list[i].first.kind = BEGIN;
            node_list[i].second.kind = END;
            node_list[i].first.next = &node_list[i].second;
            node_list[i].second.next = nullptr;
 
            //  std::cin >> node_list[i].first.pos >> node_list[i].second.pos;
            file >> node_list[i].first.pos >> node_list[i].second.pos;
 
//          std::cout << "\n" << node_list[i].first.pos << " : " << node_list[i].second.pos;
 
            Fence.add_segment(&node_list[i].first, &node_list[i].second);
        }
 
        std::cout << "\n\n";
        Fence.show();
 
        file.close();
    }
 
    auto end = std::chrono::steady_clock::now();
    auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
 
    std::cout << "\n\nTime = " << elapsed_ms.count() ;
    system("pause");
 
    return 0;
}

Хотя я догадываюсь, там числа часто перекрывают друг-друга. Нужно создать что-то более разрозненное, с большим количеством "дыр".


Добавлено через 24 минуты
Нет, всё справедливо было сказано; на сильно полосатом заборе у меня самый тормозной вариант, настолько тормозной что пока ещё неизвестно
Остальные варианты, как и ожидалось, +- так же.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
01.02.2021, 23:23
Цитата Сообщение от Folian Посмотреть сообщение
Может, конечно, я где-то накосячил, но вот результаты:
И чтение файла в тайминг включено???
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
01.02.2021, 23:54  [ТС]
Folian, чтение / инициализация мне кажется надо вынести из таймера

только замерять сорт/подсчёт/вывод

а замерьте тогда уже и моё плиз
Кликните здесь для просмотра всего текста

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
int compare (const void *a, const void *b)
{
    return (*(int*)a - *(int*)b);
}
 
 
int main()
{
    int fence[100][2] = {5,6,5,100,20,30,30,40,41,60,60,61,70,71,71,72,72,73,70,71,
        45,46,45,46,42,43,43,44,41,45,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48,
        45,46,44,46,42,45,43,44,41,60,60,61,47,48,47,48,47,48,47,48
    }, N = 100, L = 100;
    
    qsort (fence, N, sizeof(fence[0]), compare);
 
 
    for (int i = 0; i < N-1; i++){
        for (int j = i+1; j < N; j++){
            if (fence[j][0] <= fence[i][1] && fence[j][0] >= 0){
                if (fence[j][1] <= fence[i][1]) fence[j][0] = -1;
                else {fence[i][1] = fence[j][1]; fence[j][0] = -1;}
            }
            else break;
        }
    }
    
    int i = 0;
    for (i = 0; i < N; i++) {
        if (i == 0) {
            if (fence[0][0]) {
                printf("0 %d\n", fence[0][0]);
                if (fence[0][1] == L) break;
                else printf("%d ", fence[0][1]);
            }
            else if (fence[0][1] != L) printf("%d ", fence[0][1]);
            else {puts("All painted"); break;}
            continue;
        }
 
        if (fence[i][1] == L && fence[i][0] > 0) {
            printf("%d\n", fence[i][0]);
            break;
        }
 
        if (fence[i][0] > 0) {
            printf("%d\n", fence[i][0]);
            printf("%d ", fence[i][1]);
        }
    }
    if (i == N) printf("%d\n", L);
 
 
    return 0;
}
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.02.2021, 01:17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
И чтение файла в тайминг включено???
Особо не заморачивался, 5 - 5,7 секунд сжирает чтение. Пушбэки для интереса заменял на предварительное выделение - особой разницы не было.

alexbmd, ~13,6 c чтением ~7,8 отдельно.


Моё творение, навскидку, осилит этот файл с мелкими полосками примерно за 2,5 года
Миниатюры
Как ускорить логику цикла? [for experts]  
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.02.2021, 01:22
Цитата Сообщение от alexbmd Посмотреть сообщение
только замерять сорт/подсчёт/вывод
В консоль лучше ничего не выводить как раз, оно сожрёт больше чем чтение, если отрезков много.
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2021, 09:08
Цитата Сообщение от alexbmd Посмотреть сообщение
хотел спросить а с какой целью это делается ? чтоб код на пару байт был меньше ?
нет.

чтобы одним одним плевком менять тип.
часто, когда начинаешь вбивать код, не всегда ясно,
какую точность там для своих вводных требует валидатор.

а иногда просто хотца поэкспериментить с разными типами.

Цитата Сообщение от Folian Посмотреть сообщение
но вот результаты:
а интересно, длина забора какая?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.02.2021, 11:25
Цитата Сообщение от XLAT Посмотреть сообщение
а интересно, длина забора какая?
Да те же 2'000'000'000 оставил.
Кстати интересно, вчера внимания не обратил, но на малых отрезках выполняется не за 68, а за 47 примерно, т.е. в полтора раза быстрее, в то время как у остальных - в т.ч. и у SmallEvil - так же как и с большими, хотя вроде тоже через std::map.
1
 Аватар для alexbmd
61 / 5 / 1
Регистрация: 03.06.2013
Сообщений: 355
Записей в блоге: 3
02.02.2021, 11:46  [ТС]
Цитата Сообщение от Folian Посмотреть сообщение
В консоль лучше ничего не выводить как раз
если нужна только скорость согласен. но тут всё же конкретная задача (первый поста) с выводом

Цитата Сообщение от Folian Посмотреть сообщение
alexbmd, ~13,6 c чтением ~7,8 отдельно.
если я правильно понял у меня быстрее чем у некоторых профи ?
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.02.2021, 12:02
Цитата Сообщение от alexbmd Посмотреть сообщение
если нужна только скорость согласен. но тут всё же конкретная задача (первый поста) с выводом
Если вывод из пары отрезков - можно и оставить.
Но со вторым файлом выводов дофига. Сейчас ради интереса посмотрел: до чисел отрезков > 100'000'000 оно мелькало секунд 50, а теперь прикинь сколько оно будет мелькать до 2'000'000'000 при более или менее одинаковом разбросе и ответь, оно тебе надо? При том что этот вывод одинаков у всех.
Миниатюры
Как ускорить логику цикла? [for experts]  
0
Just Do It!
 Аватар для XLAT
4219 / 2680 / 656
Регистрация: 23.09.2014
Сообщений: 9,235
Записей в блоге: 3
02.02.2021, 13:30
Цитата Сообщение от Folian Посмотреть сообщение
у SmallEvil - так же как и с большими, хотя вроде тоже через std::map
да у SmallEvil главный цикл сделан по красивше.

я тоже щас тут поигрался с вашими тестами.
результат несколько иной:
SmallEvil обгоняет Renji на 30%

а мой обгоняет и SmallEvil и Renji,
правда если заменить std::map на std::unordered_map




файл "fnc_extended.txt" был сгенерирован так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int rrand(int range_min, int range_max)
{   return rand() % (range_max - range_min + 1) + range_min;
}
int main()
{
    srand(2021);
    if(false) ///<<<---true, шоп один раз сгенерить.
    {
        std::ofstream file("fnc_extended.txt");
 
        for(size_t i = 0; i < 20000000; ++i)
        {
            int x = rrand(0, 65000)*65000 + rrand(0, 65000);
            int y = rrand(0, 65000)*65000 + rrand(0, 65000);
            file << x << ' ' << y << '\n';
        }
    }
...
Цитата Сообщение от Folian Посмотреть сообщение
а теперь прикинь сколько оно будет мелькать
да,
тема того, что мы на самом деле измеряем до конца не раскрыта ...
1
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
02.02.2021, 14:30
Цитата Сообщение от XLAT Посмотреть сообщение
int x = rrand(0, 65000)*65000 + rrand(0, 65000);
а как оно в инт впихуется? unsigned ж минимум

Цитата Сообщение от XLAT Посмотреть сообщение
результат несколько иной:
Сдаётся мне что сортировка std::map внутри на разных реализациях может отличаться, может тут собака зарыта.


Ещё посетила мысль сравнить своё с решениями на std::map на более подходящей задаче, вроде "Когда весь забор будет покрашен". Но это уже только вечером)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2021, 14:30

Можно ли как нибудь ускорить работу цикла for?
Подскажите пожалуйста - можно ли как нибудь ускорить работу цикла for? Заранее сильно благодарен!

Ускорить работу вложенного цикла for() C#
Добрый день. Имеется цикл в котором подбираются коэффициенты к массивам таким образом, чтобы коэф регрессии стремился к нулю for...

Welcome to experts C++!
Написать программу, считывающую две строки (с нуль-окончанием) длиной до 80 символов и выводящую число вхождений каждого из символов первой...

Minsk.BelHard.vacancies: Java Experts, Team Lead, PM
Гарантируем высокое вознаграждение (от 1000-2500 по результатам собеседования) и все условия для эффективной командной работы опытным...

Как из цикла вывести данные для другого цикла?
Вообщем такая фигня... Как из цикла вывести данные для другого цикла? а то он не видит Пример : int x1 , x2 , d; if...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru