Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
1

Найти количество уникальных чисел в матрице

15.03.2018, 13:16. Показов 2131. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Найти количество уникальных чисел в 2д массиве С++ 98/03 199711
Есть готовые функции? Или подскажите велик.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2018, 13:16
Ответы с готовыми решениями:

Как найти количество уникальных чисел?
А вот допустим если мне нужно найти кол-во уникальных, то как нужно изменить код из темы? Я в...

Определить количество уникальных элементов в матрице
Есть ли команда для подсчета ун. элементов матрицы?или это возможно подсчитать только через цикл.

Найти сумму чисел находящихся в диапазоне [-2,5] и количество нечетных чисел в матрице
Дана матрица A(n,n). Найти сумму чисел находящихся в диапазоне и количество нечетных чисел в...

Найти количество отрицательных чисел в матрице
помоги написать матрицу 3х3,количество отрицательных чисел! Добавлено через 1 час 0 минут...

14
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
15.03.2018, 14:33 2
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <set>
 
 
int main()
{
    int const row = 3, col = 2;
    int mtx[row][col] = { {1, 2}, {3, 4}, {2, 5} };
    std::set<int> st(*mtx, *mtx + row * col);
    std::cout << st.size() << std::endl;
}
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
15.03.2018, 14:41 3
igorrr37, то есть массив рассматривается как линейный? Это хорошо для статически объявленного массива. А вот для такого
C++
1
2
int **mtx = new (int *)[row];
for(i=0; i<col; i++) *mtx = new (int) [col];
может не прокатить.
ЗЫ. Если я ошибся в операторах new, прошу меня поправить...
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
15.03.2018, 15:13  [ТС] 4
Массив квадратный row=col тип double.
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <set>
using namespace std;
int const row = 3, col = 3;
    
double array[row][col] = { {1.1, 2.1}, {3.1, 4.1}, {5.1, 6.1} };
set<int> st(*array, * array + row * col);
cout << st.size() << endl; // это размер? Нужно количество уникальных не повторяющихся чисел. 
                                   //Вида: cout << "Uniuqae numbers=" <<…  << '\n';
Кстати размер выдает 7 а он 6.
“warning C4244: аргумент: преобразование 'double' в 'const int', возможна потеря данных”
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
15.03.2018, 15:45 5
Байт, придётся добавлять каждую строку отдельно через std::set<int>::insert
Excalibur921, я перепутал "различных" и "уникальных". У тебя массив 3Х3, а инициализируется как 3Х2, поэтому 7 вместо 6

Добавлено через 16 минут
уникальные числа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <algorithm>
#include <map>
 
 
int main()
{
    int const row = 3, col = 2;
    double arr[row][col] = { { 1.1, 2.1 }, { 3.1, 4.1 }, { 1.1, 6.1 } };
    std::map<double, int> mp;
    std::for_each(*arr, *arr + row * col, [&](auto val) {++mp[val]; });
    int cnt = std::count_if(mp.begin(), mp.end(), [](auto const& pr) {return pr.second == 1; });
    std::cout << cnt << std::endl;
 
}
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
15.03.2018, 16:23  [ТС] 6
Цитата Сообщение от igorrr37 Посмотреть сообщение
я перепутал "различных" и "уникальных".
Омг...это не синонимы?
Может я путаю термины… я в шоке, куча тем на форуме какая то куча букв…

Нужно так: {1,2,2,3,4,5,5,5,6} уникальных 6 штук. Повтор не учитывается.

Ругается…может это стиль С++ 11 или 14 ?
У меня VisualStudio 2008 Express С++ 98 и 03.
Придется искать на For для old school…
Найти количество уникальных чисел в  матрице
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
15.03.2018, 16:40 7
Цитата Сообщение от Excalibur921 Посмотреть сообщение
Нужно так: {1,2,2,3,4,5,5,5,6} уникальных 6 штук. Повтор не учитывается.
Небольшие замечания по терминологии. Уникальных всего 4 (1, 3, 4, 6). То есть, это такие, которых больше нет. По одному экземпляру.
Различных действительно 6

Не по теме:

Вспомнилась байка. Компания подвыпивших поэтов. Один говорит - "таких как я, очень мало". Другой - "А таких как я, всего один". Третий - "А таких, как я, вообще нет!":)

1
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
15.03.2018, 17:51  [ТС] 8
Цитата Сообщение от Байт Посмотреть сообщение
Различных действительно 6
Значит переименовать тему.

“Найти количество различных чисел double в 2d массиве C++”
Я думал типа такого:
C++
1
2
double data2[3][3]={{1.,2.,2.},{3.,4.,5.},{5.,5.,6.}}; 
double data2Copy[3][3];

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//=======находим количество различных чисел в data2
//---копируем data2 в data2Copy
for( int x = 0; x < 3; x++ )
{
    for( int y = 0; y < 3; y++ )
    {
        data2Copy[x][y]=data2[x][y];
        //cout << "data2Copy[x][y]=" << data2Copy[x][y]<<'\n';
    }
}
//---копируем data2 в data2Copy
 
 
//---
int UniqueNumberCounter=0; //Счетик для кол-ва уникальных чисел
double UniqueNumber=0;  //хранит текущее число 
for( int x = 0; x < 3; x++ )
{
    int y=0;    
    while(y < 3)
    {
Metka1:
//-------------------       
        UniqueNumber=data2[x][y]; // читаем  UniqueNumber из data2
        if(data2Copy[x][y]==0) //было в анализе?
        {
            //да
            y++;
            goto Metka1;// берем следующее число из data2
        }
//нет,пробегаем весь data2Copy и записываем нули если попались равные UniqueNumber
            for( int x1 = 0; x1 < 3; x1++ )
            {
                for( int y1 = 0; y1 < 3; y1++ )
                {
            //-------------------
                    if(data2Copy[x1][y1]==UniqueNumber)
                    {
                        UniqueNumberCounter++;
                        data2Copy[x1][y1]=0;
                    }
            //-------------------   
                }
            }
//-------------------   
y++;
    }
}
//---
//=======находим количество различных чисел в data2
cout << "UniqueNumberCounter=" << UniqueNumberCounter<<'\n';
UniqueNumberCounter показывает 9…
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
15.03.2018, 17:56 9
вот, для массива любого типа
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <set>
 
// возвращает количество различных элементов в матрице
template<typename T, int row, int col>
auto dn(T(&mtx)[row][col])
{
    std::set<T> st(*mtx, *mtx + row * col);
    return st.size();
}
 
// печать матрицы
template<typename T, int row, int col>
void print(T(&mtx)[row][col])
{
    for (int i = 0; i < row; ++i)
    {
        std::copy(*mtx + i * col, *mtx + (i + 1) * col, std::ostream_iterator<T>(std::cout, "  "));
        std::cout << '\n';
    }
    std::cout << '\n';
}
 
 
int main()
{
    int const row = 3, col = 2;
    int mtx[row][col] = { { 1, 2 }, { 3, 4 }, { 2, 5 } }; // матрица может быть любого типа: int, double и т.д.
    print(mtx); // чтобы не перепутать размерность
    std::cout << dn(mtx) << std::endl;
}
1
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
15.03.2018, 18:10  [ТС] 10
igorrr37, А не глянете мой код? Где-то подправить и будет летать =). Зато он мне понятный.
Я думал эта hello world задачка в 2018 году давно есть готовая в 1 строку.
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
15.03.2018, 18:31 11
Лучший ответ Сообщение было отмечено Excalibur921 как решение

Решение

написал с нуля на циклах
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
#include <iostream>
 
 
int main()
{
    int const row = 3, col = 3;
    double mtx[row][col] = { { 1., 2., 2. },{ 3., 4., 5. },{ 5., 5., 6. } };
    int cnt = 0;
    for (int i = 0; i < row * col; ++i)
    {
        int j = i - 1;
        for ( ; j >= 0; --j)
        {
            if ((*mtx)[i] == (*mtx)[j])
            {
                break;
            }
        }
        if (-1 == j)
        {
            ++cnt;
        }
    }
 
    std::cout << cnt << std::endl;
}
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
15.03.2018, 21:41  [ТС] 12
Цитата Сообщение от igorrr37 Посмотреть сообщение
for ( ; j >= 0; --j)
что это...

Сделал такой велик. Работает.
C++
1
2
3
const int Size=3;
double data2[Size][Size]={{ 1., 2., 2. },{ 3., 4., 5. },{ 5., 5., 6.}};
double data2Copy[Size][Size];
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
//=======находим количество различных чисел в data2
//---копируем data2 в data2Copy
for(int x=0;x<Size;x++)
{
    for(int y=0;y<Size;y++)
    {
        data2Copy[x][y]=data2[x][y];
    }
}
 
int UniqueNumberCounter=0;  //Счетик для кол-ва уникальных чисел
double UniqueNumber=0;      //хранит текущее число 
for( int x = 0; x < Size; x++ )
{
    int y=0;    
        while(y < Size)
        {
            if(data2Copy[x][y]!=0) // по такому адресу во втором массиве не ноль?
            {
            bool BlokRazsres=0; //блокирует разрешение на запись уник числа
                for(int x1=0;x1<Size;x1++)
                {
                    for(int y1=0;y1<Size;y1++)
                    {                   
                        if(data2Copy[x1][y1]==data2[x][y]) // по такому адресу во втором массиве это число?  
                        {
                            data2Copy[x1][y1]=0;//да,записать туда ноль                       
                                if(!BlokRazsres)
                                {
                                    UniqueNumberCounter++;//увеличить счетчик уникальных чисел на 1.
                                    BlokRazsres=1; // заблокировать счетчик
                                }
                        }
                    }
                 }
             }
        y++;
        }
}
//=======находим количество различных чисел в data2
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
15.03.2018, 21:54 13
Цитата Сообщение от Excalibur921 Посмотреть сообщение
что это...
Ничего страшного. j уже имеет значение. Можно было написать и так
C++
1
2
int j;
for(j=i-1; j>=0; j--) ...
Но дела это не на секунду не меняет...
Не делайте культа из заголовка цикла. (Если я, конечно, правильно понял ваше недоумение)
0
1471 / 826 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
16.03.2018, 01:03  [ТС] 14
Чисто из интерса:
как просто замерять сколько тактов\ времени считает мой код? Для стиля старого С++ 98/03 года. Подскажете моему коду hello world оптимизацию? Или смысла нет ради 30% прироста…

В идеале вставку бы на ASM, чтобы С++ не писал свой флуд..Но я неумею…или даже векторизацию. Просто там будет массив 500 на 500 double. Анализ простой, однотипный и тяжелый для CPU.

Мандельброт для которого я и делал этот анализ размером 200 на 200 пикселей оказалось запросил 15 000 цветов..а я давал 255 и чегото хотел.

Добавлено через 2 часа 56 минут
igorrr37, Замерял скорость кода через:
C++
1
2
3
4
5
6
7
8
#include <time.h> 
#include <stdio.h> 
 
clock_t start, end;
start = clock();
...
end = clock();
printf("time %.4f second(s)\n", ((double) end - start) / ((double) CLOCKS_PER_SEC));
Пост 9. Не получилось собрать.
warning C4042: dn: имеет недопустимый класс хранения
error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
error C3861: st: идентификатор не найден

Пост 11.
value 15136 time 0.9210

Пост 12 мой велик.
value 15135 time 3.78
Одно значение потерялось.
В 4 раза медленней. Я в шоке...
0
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
16.03.2018, 05:09 15
Тоже померял скорость для матрицы 500Х500 и для простоты взял int вместо double'а. Замерял через clock(), заполнял через random()%10000.
Код из поста № 2 (сложность N*log(N)): clocks 2526
Код из поста № 11(сложность N^2): clocks 4880
Всё ожидаемо.
0
16.03.2018, 05:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.03.2018, 05:09
Помогаю со студенческими работами здесь

Найти количество её отрицательных чисел в матрице
Ввести матрицу действительных чисел размерностью 3x5 и найти количество её отрицательных чисел...

В матрице найти количество различных чисел
Нужна помощь.Задана матрица размером N*M. Определить количество различных значений матрицы, т.е....

Найти количество отрицательных чисел в матрице
Дана таблица размера 5 х 10 заполненная целыми чмслами. Сообщить сколько в этой таблице...

Найти количество чисел в матрице 10 на 10 меньших 3
Нужна программа в паскале :&quot;Найти количество чисел в матрице 10 на 10 меньших 3&quot;


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

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