Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 1 / 0
Регистрация: 05.08.2017
Сообщений: 15

Вывести те элементы, которые встречаются в массиве только один раз

05.08.2017, 13:12. Показов 40341. Ответов 199
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Изучаю c++, ломаю уже 1 день голову над данной задачей:
Дан массив. Выведите те его элементы, которые встречаются в массиве только один раз. Элементы нужно выводить в том порядке, в котором они встречаются в списке.

Сделал идею такую: если элемент встречается 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 <iostream>
#include <vector>
using namespace std;
int main () {
    int n, numMin = 0, p = 0;
    cin >> n;
    vector <int> num(n);
    for (int i = 0; i < n; i++)
        cin >> num[i];
    for (int i = 0; i < n; i++) {
        int rav = 0;
        for (int i = p; i < n; i++) {
            if (num[numMin] == num[i]) {
                rav++;
            }
        }
        if (rav == 1) {
            cout << num[numMin] << " ";
        }
        numMin++;
        p++;
    }
return 0;
}
Добавлено через 36 минут
На вход получаю:
5
1 3 3 3 2
На выход получаю:
1 3 2 (вместо 1 2)
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.08.2017, 13:12
Ответы с готовыми решениями:

Вывести числа, которые встречаются в массиве несколько раз / один раз
дан массив состоящий из 100 целых чисел. а)Вывести все числа,которие встречаются в етом массиве несколько раз б)Вывести все...

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

Удалить нечётные элементы, которые встречаются в массиве один раз
удалить нечетные элементы, которые встречаются в массиве только один раз c++

199
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
06.06.2026, 00:02
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от alexu_007 Посмотреть сообщение
Кто сделает быстрее?
Так скорость ещё зависит от производительности компьютера. Если один сидит на P4 с 512MB DDRI 400MHz , а другой на 4-х ядерном с 8GB DDR5 4800MHz....)).
Если сравнивать - то на одинаковых ПК.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,095
Записей в блоге: 2
06.06.2026, 00:15
Цитата Сообщение от alexu_007 Посмотреть сообщение
C++
1
2
3
4
for(quint32 i = 0; i < n; i++)
    {
        k = lst.at(i);
        if(kll.at(k) == 0) {kll[k]++; continue;}
Как говорят в играх
Tried to cheat, yeah?
Никто ведь не обещал что значения исходного массива "достаточно малы" и, значит, можно использовать "дешифратор" at(k)
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
06.06.2026, 00:39
Цитата Сообщение от Димон007 Посмотреть сообщение
Так скорость ещё зависит от производительности компьютера.
Это понятно. Можно (при желании) проверить на одном ПК. У меня ноутбук, не чемпион по производительности. Дело в алгоритме. 10 млн. раз проходить по массиву размером в те же 10 млн. - не хватит жизни дождаться результата. Или пройти всего 2 раза - первый раз найти требуемые числа, второй - вывод на экран (или как у меня, подсчёт количества).

Эта задача может быть реальной, например в списке из 10 млн. записей найти те, которые встречаются один раз - и как вариант скинуть результат в файл. Выводить на экран ессно бессмысленно, никто и никогда не просмотрит тысячи строк (цифр) результата.

Добавлено через 13 минут
Цитата Сообщение от Igor3D Посмотреть сообщение
Никто ведь не обещал что значения исходного массива "достаточно малы" и, значит, можно использовать "дешифратор" at(k)
Если значения исходного массива случайны и велики - их точно будет всех (или почти всех) по одному. Если будут слишком малы - в результат не попадёт ни один, все будут повторяться по многу раз. Нужно смотреть по реальной задаче. Население планеты плюс-минус 8 млрд. - все "влезут" в int64. Если больше, то соотв. длинная арифметика со всеми вытекающими.

Я для тестирования (для учебной задачи) подобрал приблизительно средние числа.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,095
Записей в блоге: 2
06.06.2026, 01:25
Цитата Сообщение от alexu_007 Посмотреть сообщение
Эта задача может быть реальной,
..
Нужно смотреть по реальной задаче.
Такую задачу проще решить чем гадать "насколько она реальна"
Цитата Сообщение от alexu_007 Посмотреть сообщение
Я для тестирования (для учебной задачи) подобрал приблизительно средние числа.
Давайте называть вещи своими именами: Вы просто смухлевали

Напр std::unordered_map не делает предположений типа какие там числа, большие, маленькие или средние. И от Вас требуется общее решение, а не частное
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
06.06.2026, 07:35
Ну и сколько времени займет ваше std::unordered_map на массиве размером 10 млн. чисел?
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
06.06.2026, 11:26
Цитата Сообщение от alexu_007 Посмотреть сообщение
Кто сделает быстрее?
попробуй мой вариант в своих условиях измерить. Ни на что не претендую, просто проверим

без мапы, с разными политиками. Довольно неспешно
https://www.onlinegdb.com/4H-z8tdyW
Кликните здесь для просмотра всего текста
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
//C++20
 
#include <iostream>
#include <algorithm>
#include <random>
#include <chrono>
#include <execution>
 
int main()
{
    //политика выполнения
    constexpr auto policy =
        std::execution::seq
    //  std::execution::unseq
    //  std::execution::par
    //  std::execution::par_unseq
    ;
    
    size_t count=10'000u;
    
    //генерим в пределах, сопоставимых с количеством
    std::mt19937 gen(std::random_device{}());
    std::uniform_int_distribution<unsigned int> dis(0u,count);
    
    std::vector<int> v;
    v.reserve(count);
    for(size_t i=0; i<count; ++i)
    {
        v.push_back(dis(gen));
    }
    
    auto t1=std::chrono::steady_clock::now();
    
    //для алгоритма не нужно, это для отображения результирующего количества
    size_t numbers_to_show{};
    
    //сюда копим строку с числами
    std::string s;
    s.reserve(1024);
    
    for(auto b = std::begin(v), e = std::end(v), cur=b; cur!=e; ++cur)
    {
        auto& val = *cur;
        
        //в начале - ищем, что нет нигде ДАЛЕЕ
        if(cur==b   && std::find(policy, cur+1, e, val) != e   ) [[unlikely]] {continue;}
        
        //в конце - ищем, что нет нигде ДО
        if(cur+1==e && std::find(policy, b, cur+1, val) != cur ) [[unlikely]] {continue;}
 
        //в середине - ищем отсутствие ДО и ПОСЛЕ
        if(std::find(policy, b    , cur, val) != cur) {continue;}
        if(std::find(policy, cur+1, e  , val) != e  ) {continue;}
 
        s.append(std::to_string(val)).append(",");
        ++numbers_to_show;
    }
    
    auto t2=std::chrono::steady_clock::now();
    
    //вывод чисел на экран отключил
    //std::cout << s << '\n';
    
    std::cout <<"numbers to show: "<< numbers_to_show<<'\n';
    std::cout <<"time = "<< std::chrono::duration_cast<std::chrono::duration<double,std::milli>>(t2-t1)<<'\n';
}


с мапой
https://www.onlinegdb.com/VoLWN5ZJL
Кликните здесь для просмотра всего текста
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
//C++20
 
#include <iostream>
#include <random>
#include <chrono>
#include <unordered_map>
 
int main()
{
    size_t count=10'000'000u;
    
    //генерим в пределах, сопоставимых с количеством
    std::mt19937 gen(std::random_device{}());
    std::uniform_int_distribution<unsigned int> dis(0u,count);
    
    std::vector<int> v;
    v.reserve(count);
    for(size_t i=0; i<count; ++i)
    {
        v.push_back(dis(gen));
    }
 
    auto t1=std::chrono::steady_clock::now();
    
    //для алгоритма не нужно, это для отображения результирующего количества
    size_t numbers_to_show{};
    
    //сюда копим строку с числами
    std::string s;
    s.reserve(1024);
    
    //блок нужен, так как вызов деструктора мапы
    //тоже должен попасть в измерение
    {
        std::unordered_map<int, size_t> map;
        map.reserve(count);
        for(auto val : v){++map[val];}
 
        
        for(auto val : v)
        {
            if(map[val]==1)
            {
                s.append(std::to_string(val)).append(",");
                ++numbers_to_show;
            }
        }
    }
    
    auto t2=std::chrono::steady_clock::now();
    
    //вывод чисел на экран отключил
    //std::cout << s << '\n';
    
    std::cout <<"numbers to show: "<< numbers_to_show<<'\n';
    std::cout <<"time = "<< std::chrono::duration_cast<std::chrono::duration<double,std::milli>>(t2-t1)<<'\n';
}


(вывод чисел на экран отключил, если вдруг понядобится - можно открыть)



Добавлено через 33 минуты
Цитата Сообщение от alexu_007 Посмотреть сообщение
lst.at(i);
        if(kll.at(k)
кстати, какой смысл в at , если границы известны? Индексирование [] будет быстрее работать
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,095
Записей в блоге: 2
06.06.2026, 13:24
Так что, выходит без познаний в std::unordered_map задачка вообще нормально не решается? Предлагались квадратичный перебор (визитная карточка лоха), частный случай и.. все
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
06.06.2026, 16:20
Igor3D, а что значит - нормально?

Либо быстро и с дополнительной памятью
Либо долго и без дополнительной памяти
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
06.06.2026, 17:24
Цитата Сообщение от Алексей1153 Посмотреть сообщение
попробуй мой вариант в своих условиях измерить. Ни на что не претендую, просто проверим
Сравнил. По два ряда чисел - это результаты работы моего и вашего алгоритмов (мой сверху) - для проверки, что мы считаем одно и то же. Имитация списка семизначных телефонных номеров (1234567 типо это 123-45-67). Верхние числа - количество найденных одиночных номеров. Средние строки чисел - первые 10 найденных номеров. Внизу - время выполнения. На массиве длиной 10 млн и 100 млн номеров:
Миниатюры
Вывести те элементы, которые встречаются в массиве только один раз   Вывести те элементы, которые встречаются в массиве только один раз  
1
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,095
Записей в блоге: 2
06.06.2026, 17:27
Цитата Сообщение от Алексей1153 Посмотреть сообщение
а что значит - нормально?
Нормальный программист таких вопросов не задает, для него это интуитивно
Цитата Сообщение от Алексей1153 Посмотреть сообщение
Либо быстро и с дополнительной памятью
Либо долго и без дополнительной памяти
Против выделения доп памяти никто не возражает, напр используемая std::unordered_map вероятно сожрет в 3-4 раза больше чем исходные данные, да, ассоциативный контейнер - удовольствие дорогое. Но расходы должны быть разумны, напр если в исходных данных число 12345678 - это не основание выделять 12 метров для десятка исходных элементов

Интересная вариация задачи: печатать все кроме тех что уже напечатаны (без дубликатов)
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
06.06.2026, 17:32
Цитата Сообщение от Igor3D Посмотреть сообщение
Нормальный программист таких вопросов не задает
ещё как задаёт. ТЗ придумывает не программист

Добавлено через 1 минуту
alexu_007, так это с мапой или без ? Я там два варианта приложил
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,316
06.06.2026, 20:50
С мапой.

C++ (Qt)
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
// кнопка 1
void Widget::press_pbtn_01()
{
    quint32 k;
    quint32 cx = 0;
 
    const quint32 n = 10000000;
 
    QString str;
 
    QList<quint32> lst;     //{0, 1, 3, 4, 5, 8, 0, 10 , 5, 7, 1, 3, 2};
    QList<quint8> kl2;
 
 
    QRandomGenerator gnr;
    gnr.seed(20);
 
 
    // заполнение массива случайными числами
    for(quint32 i = 0; i < n; i++)
    {
        //k = QRandomGenerator::global()->bounded(1000000, 10000000);
 
        k = gnr.generate() & std::numeric_limits<quint32>::max();
        k = k % 9000000 + 1000000;
        lst << k;
    }
 
 
    // начало отсчёта времени выполнения
    m_time.start();
 
 
    // обнуление массива ключей
    for(quint32 i = 0; i < n; i++)
    {
        kl2 << 0;
    }
 
 
    for(quint32 i = 0; i < n; i++)
    {
        k = lst.at(i);
        if(kl2.at(k) < 2) kl2[k]++;
        continue;
    }
 
 
    for(quint32 i = 0; i < n; i++)
    {
        k = lst.at(i);
        if(kl2.at(k) == 1)
        {
            if(cx < 10) str += QString::number(k) + "  ";
            cx++;
        }
    }
 
    // конец отсчёта времени выполнения
    qint64 msecs = m_time.elapsed();
    QTime time(0,0,0,0);
 
 
    ui->label_01->setText(QString::number(cx));
    ui->label_02->setText(str);
    ui->label_03->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
}
 
 
 
 
 
// кнопка 2
void Widget::press_pbtn_02()
{
    {
        size_t count = 10000000;
        quint32 cx = 0;
        QString str;
 
        QRandomGenerator gnr;
        gnr.seed(20);
 
        std::vector<int> v;
        v.reserve(count);
 
        for(size_t i=0; i<count; ++i)
        {
            quint32 k = gnr.generate() & std::numeric_limits<quint32>::max();
            k = k % 9000000 + 1000000;
            v.push_back(k);
        }
 
        // начало отсчёта времени выполнения
        m_time.start();
 
        //блок нужен, так как вызов деструктора мапы
        //тоже должен попасть в измерение
        {
            std::unordered_map<int, size_t> map;
            map.reserve(count);
            for(auto val : v){++map[val];}
 
            for(auto val : v)
            {
                if(map[val]==1)
                {
                    if(cx < 10) str.append(QString::number(val)).append("  ");
                    ++cx;
                }
            }
        }
 
        // конец отсчёта времени выполнения
        qint64 msecs = m_time.elapsed();
        QTime time(0,0,0,0);
 
        ui->label_04->setText(QString::number(cx));
        ui->label_05->setText(str);
        ui->label_06->setText(time.addMSecs(msecs).toString("hh:mm:ss.zzz"));
    }
}
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
07.06.2026, 06:03
Цитата Сообщение от alexu_007 Посмотреть сообщение
Написал "быструю" функцию. .... Кто сделает быстрее?
Прошу меня извинить, если что не так, я просто любитель, немного знаю Си. С С++ знаком совсем поверхностно, по библиотекам Ардуино. Забрёл сюда из соседней ветки про микроконтроллеры.
Тема меня заинтересовала, решил написать свой пример и проверить на стареньком ПК (DDR2 2GB, Athlon 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
77
78
/******************************************************************************
 
                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
 
*******************************************************************************/
 
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
 
 const uint32_t n = 100000;
 const uint32_t m = n/2;//+1 - если n - нечётное
 
 
int main()
{
   
    int32_t arr[n]; 
    int32_t mem[m];
    uint32_t count_m = 0;
    uint32_t res = 0;
    uint8_t PRINT;
  //--------------------------- заполняем массив ---------------
    printf(" RAND_MAX = %d\n", RAND_MAX);//проверяем макс. значение
    srand(time(NULL));
    for(uint32_t i = 0; i < n; i++)
    arr[i] = rand();
  //--------------------------------------------------------  
    printf(" arr[%d]  mem[%d]\n", n, m);
    
     clock_t start = clock();
   // ----------------------------- старт ------------------
    for(uint32_t i = 0; i < n; i++)
    {
        PRINT = 1;
        for(uint32_t ii = i + 1; ii < n; ii++)
        {
        if(arr[i] == arr[ii] )
        {
         mem[count_m++] = arr[i]; // если совпало - запоминаем
         PRINT = 0;
        }
        for(uint32_t j = 0; j <= count_m; j++)
        {
         if(arr[i] == mem[j]) //проверяем память
         PRINT = 0;
        }
        }
        
        
        if(PRINT)
        {
       //  printf(" %d", arr[i]);
         arr[res++] = arr[i];    // складываем результат
        }                        // в тот же массив
    }
    
      clock_t end = clock();
      //----------------------------- финиш -----------------
      double elapsed_ms = ((double)(end - start) / CLOCKS_PER_SEC) * 1000.0;
 
    printf(" Время выполнения: %.2f мс\n", elapsed_ms);
 
    printf("\n Не повторяющихся значений  res = %d\n", res);
    
    printf("\n Печатаем каждое тысячное значение...");
    for(uint32_t i = 0; i < res; i++)
    {
        if(!((i + 1) % 1000))
         printf(" %d ", arr[i]);
        if(!(i % 8000))
        printf("\n");
    }
    return 0;
}
Результат огорчил - 28сек!))
Решил сравнить в вашим примером, но онлайн компилятор , ес-но, не потянул, решил сравнить с примером
Алексей1153, добавил только элементов до 100000.
Результат - 54сек. А если gen(std::random_device{}() заменить на random()(как я понял выводит максимально не повторяющиеся значения),
то 164сек(!). Может быть я где-то ошибся?
Если будет желание, можете проверить мой пример, я знаю, компиляторы С++ понимают, в основном, Си-шный код.
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
//C++20
 
#include <iostream>
#include <algorithm>
#include <random>
#include <chrono>
#include <execution>
 
int main()
{
    //политика выполнения
    constexpr auto policy =
        std::execution::seq
    //  std::execution::unseq
    //  std::execution::par
    //  std::execution::par_unseq
    ;
    
    size_t count=100000u;
    
    //генерим в пределах, сопоставимых с количеством
    std::mt19937 gen(std::random_device{}());
    std::uniform_int_distribution<unsigned int> dis(0u,count);
    
    std::vector<int> v;
    v.reserve(count);
    for(size_t i=0; i<count; ++i)
    {
        v.push_back(dis(gen));
    }
    
    auto t1=std::chrono::steady_clock::now();
    
    //для алгоритма не нужно, это для отображения результирующего количества
    size_t numbers_to_show{};
    
    //сюда копим строку с числами
    std::string s;
    s.reserve(1024);
    
    for(auto b = std::begin(v), e = std::end(v), cur=b; cur!=e; ++cur)
    {
        auto& val = *cur;
        
        //в начале - ищем, что нет нигде ДАЛЕЕ
        if(cur==b   && std::find(policy, cur+1, e, val) != e   ) [[unlikely]] {continue;}
        
        //в конце - ищем, что нет нигде ДО
        if(cur+1==e && std::find(policy, b, cur+1, val) != cur ) [[unlikely]] {continue;}
 
        //в середине - ищем отсутствие ДО и ПОСЛЕ
        if(std::find(policy, b    , cur, val) != cur) {continue;}
        if(std::find(policy, cur+1, e  , val) != e  ) {continue;}
 
        s.append(std::to_string(val)).append(",");
        ++numbers_to_show;
    }
    
    auto t2=std::chrono::steady_clock::now();
    
    //вывод чисел на экран отключил
    //std::cout << s << '\n';
    
    std::cout <<"numbers to show: "<< numbers_to_show<<'\n';
    std::cout <<"time = "<< std::chrono::duration_cast<std::chrono::duration<double,std::milli>>(t2-t1)<<'\n';
}
Миниатюры
Вывести те элементы, которые встречаются в массиве только один раз   Вывести те элементы, которые встречаются в массиве только один раз   Вывести те элементы, которые встречаются в массиве только один раз  

0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
07.06.2026, 07:09
Димон007, может, оптимизацию забыл включить ?
Вот тут твой код без изменений, с компилятором C , с оптимизацией -O3
https://onlinegdb.com/zswAdpqKX

за 10 секунд справляется. И это - в песочнице, а локально на компе должен ещё быстрее
1
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
07.06.2026, 07:16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
может, оптимизацию забыл включить ?
Да, спасибо, не включал. Думал есть по умолчанию. Но всё равно, порядок примерно тот же.
P.S. На том же сайте проверку делал
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
07.06.2026, 07:25
Димон007, если в рамках C оставаться, то придётся свою хеш-таблицу велосипедить
0
8 / 6 / 2
Регистрация: 21.02.2019
Сообщений: 110
07.06.2026, 07:36
Цитата Сообщение от Алексей1153 Посмотреть сообщение
И это - в песочнице, а локально на компе должен ещё быстрее
Если я правильно понял код от alexu_007, справляется за сотни мс при числе элементов 1000000. Или нет?

Добавлено через 3 минуты
Цитата Сообщение от Алексей1153 Посмотреть сообщение
придётся свою хеш-таблицу велосипедить
Не знаю, что это, спасибо, посмотрю.
Почему тогда твой код ещё медленней?

Добавлено через 5 минут
Увы, должен уходить. Отвечу уже позже.
0
фрилансер
 Аватар для Алексей1153
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
07.06.2026, 08:49
Цитата Сообщение от Димон007 Посмотреть сообщение
код от alexu_007, справляется за сотни мс при числе элементов 1000000.
у него массив (а точнее - список. С массивом или вектором и побыстрее было бы, наверное) на заранее известное количество элементов.

То есть, нет неожиданных реаллокаций, как при заполнении хеша, однако решение не универсальное

Добавлено через 51 секунду
Цитата Сообщение от Димон007 Посмотреть сообщение
Почему тогда твой код ещё медленней?
без хеша у меня квадратичная сложность поиска
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,095
Записей в блоге: 2
07.06.2026, 12:05
Цитата Сообщение от Алексей1153 Посмотреть сообщение
то придётся свою хеш-таблицу велосипедить
Да, и, полагаю, она даже превзойдет std::unordered_map, хотя не намного.

Не по теме:

Цитата Сообщение от Алексей1153 Посмотреть сообщение
у него массив (а точнее - список. С массивом или вектором и побыстрее было бы, наверное) на заранее известное количество элементов.
В "заранее известном" ничего плохого нет, проблема в "неадекватном" расходе памяти. Пример
C++
1
исходный массив { 1, 100 }
Вынуждается выделение памяти для 100 значений (хотя исходных 2). Конечно это будет быстрее любой мапы, но цена слишком велика. Хотя прием знать полезно, небольшой диапазон значений вполне возможен

0
32 / 26 / 7
Регистрация: 22.02.2019
Сообщений: 111
07.06.2026, 15:00
Скорее всего для этой задачи поразрядная сортировка с подсчётом будет в разы быстрее хеш-таблицы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2026, 15:00

Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз
Создать функцию, определяющую номера элементов, которые встречаются в массиве только один раз.С++

Вывести только те слова сообщения, которые встречаются в тексте один раз
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация, разделенная пробелами и знаками препинани, в конце которого...

Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Дано осмысленное текстовое сообщение (т.е. алфавитно-цифровая информация, разделенная пробелами и знаками препинани, в конце которого...

Вывести только те слова сообщения, которые встречаются в нем ровно один раз
Вывести только те слова сообщения, которые встречаются в нем ровно один раз. Помогите исправить ошибку в коде. #include...

Вывести в файл буквы исходного файла, которые встречаются только один раз
Имеются 2 файла В первом находятся все буквы русского алфавита Залкча:Сгенерировать во 2ой файл буквы из 1го файла без повтора ...


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

Или воспользуйтесь поиском по форуму:
40
Закрытая тема Создать тему
Новые блоги и статьи
интеграция 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,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru