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

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

05.08.2017, 13:12. Показов 43286. Ответов 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
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,240
Записей в блоге: 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
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
06.06.2026, 00:39
Цитата Сообщение от Димон007 Посмотреть сообщение
Так скорость ещё зависит от производительности компьютера.
Это понятно. Можно (при желании) проверить на одном ПК. У меня ноутбук, не чемпион по производительности. Дело в алгоритме. 10 млн. раз проходить по массиву размером в те же 10 млн. - не хватит жизни дождаться результата. Или пройти всего 2 раза - первый раз найти требуемые числа, второй - вывод на экран (или как у меня, подсчёт количества).

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

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

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

Напр std::unordered_map не делает предположений типа какие там числа, большие, маленькие или средние. И от Вас требуется общее решение, а не частное
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
06.06.2026, 07:35
Ну и сколько времени займет ваше std::unordered_map на массиве размером 10 млн. чисел?
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
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
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,240
Записей в блоге: 2
06.06.2026, 13:24
Так что, выходит без познаний в std::unordered_map задачка вообще нормально не решается? Предлагались квадратичный перебор (визитная карточка лоха), частный случай и.. все
0
фрилансер
 Аватар для Алексей1153
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
06.06.2026, 16:20
Igor3D, а что значит - нормально?

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

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

Добавлено через 1 минуту
alexu_007, так это с мапой или без ? Я там два варианта приложил
0
738 / 705 / 110
Регистрация: 29.05.2015
Сообщений: 4,362
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
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
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,418
07.06.2026, 08:49
Цитата Сообщение от Димон007 Посмотреть сообщение
код от alexu_007, справляется за сотни мс при числе элементов 1000000.
у него массив (а точнее - список. С массивом или вектором и побыстрее было бы, наверное) на заранее известное количество элементов.

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

Добавлено через 51 секунду
Цитата Сообщение от Димон007 Посмотреть сообщение
Почему тогда твой код ещё медленней?
без хеша у меня квадратичная сложность поиска
0
1980 / 836 / 115
Регистрация: 01.10.2012
Сообщений: 5,240
Записей в блоге: 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
Закрытая тема Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru