8 / 8 / 2
Регистрация: 11.01.2013
Сообщений: 144
1

Самый редко встречающийся элемент в массиве

11.01.2014, 20:14. Показов 5155. Ответов 37
Метки нет (Все метки)

Всех приветствую!
Прошу помощи. Собственно идея задачи вроде бы проста нужно найти самый часто и редко встречающийся эллемент в массиве.

Вот я написал для поиска частого элемента и поиска редкого, загвостка в том что он выводит только одно вхождение, т.е. если несколько элементов встречаются одинаковое колличества раз, то он выводит только последние увиденные.
вот код, для вывода редко встречающегося ээлемента. Как сделать что бы он все выводил а не один.
Точнее куда запендюрить вывод. Вставляя в циклы он мне всякую ерись выдает. (код написан на MVS 2010)
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
void main(void)
{   int n;
    cin>>n;
    char *m=new char[n];
 
    for (int i=0;i<n; i++)
    {
      //m[i]=rand()%100;
        cin>>m[i];
 
    //  cout<<" "<<m[i];
    }
       int k=0,k1=0,kmax,kmin;int i=0,j,fi,fj=0;
      
       while(i<n)
       {
           kmax=0;
 
           for(j=i+1;j<n;j++)   
         {
             
             if(m[j]!=m[i])         
             { 
 
                 k++;
                 fi=j;       
             
             }  
            
         }
           
        i++;
        
      
       }
     
      cout<<" "<<m[fi]; 
       delete m;
        _getch();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.01.2014, 20:14
Ответы с готовыми решениями:

Самый редко встречаемый символ
Задан массив A. Найти самый редко встречаемый символ. Может быть пригодится кому, но вот...

Найти самый часто встречающийся символ в тексте
я &quot;сделал&quot; программу шифратор и дешифратор текста по методу цезаря, но теперь мне надо сделать так...

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

В заданной матрице найти самый большой отрицательный элемент и самый маленький положительный и вывести их на экран
Помогите пожалуйста с заданиями) Задание 1: Напишите программу, которая создает двухмерный массив...

37
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
12.01.2014, 00:29 21
Цитата Сообщение от Tulosba Посмотреть сообщение
минимум чего?
По коду выше, пытаюсь найти минимальный натуральный элемент массива (т.е. больше нуля). Можно было-бы через std::for_each пройтись, но там лямбду надо да и опять тоже сравнение будет, хотелось бы что-бы std::min_element как то не брал во внимание нулевые значения.

Добавлено через 1 минуту
koto_fey, п.с. надо добавить еще выход при пустой строке (:
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2014, 00:34 22
Цитата Сообщение от xoror Посмотреть сообщение
unsigned Freq[256] = {0};
C++
1
unsigned Freq[256] = {};
тоже покатит
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.01.2014, 00:51 23
Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
unsigned Freq[256] = {};
тоже покатит
Плохо только, что:
- unsigned;
- опущен int;
- размер захардкожен.

Цитата Сообщение от outoftime Посмотреть сообщение
не брал во внимание нулевые значения.
Тут уж, либо свой предикат, либо удалить неугодные элементы перед поиском. Третьего не дано.
0
║XLR8║
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,361
Записей в блоге: 5
12.01.2014, 01:21 24
koto_fey, если вопросов нет, значит вам все понятно.

Добавлено через 55 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
Плохо только, что:
- unsigned;
- опущен int;
Почему плохо то? Это ведь равносильные описание типа. (unsigned int, unsigned)
0
8 / 8 / 2
Регистрация: 11.01.2013
Сообщений: 144
12.01.2014, 09:18  [ТС] 25
Да я уж спать лег в самый разгар темыу нас то 3 ночи было.
Вопросы чуть позже буду задовать и буду рад если на них ответят.

Добавлено через 47 секунд
вопросы позже буду задавать и если на них ответят буду очень рад.
0
outoftime
12.01.2014, 09:57
  #26

Не по теме:

koto_fey, а ты вставляй ссылки на имена, к кому обращаешься, тогда этому человеку придет сообщение что его упомянули "..не злим тихим словом.." Т.Г. Шевченко (:

0
8 / 8 / 2
Регистрация: 11.01.2013
Сообщений: 144
12.01.2014, 11:16  [ТС] 27
outoftime,
q=s[i];
Freq[q]++;
можешь пояснить вот это или как так получается что мы индексируем символом. Я че то в нашей нет помойке ни чего не нашел.

Добавлено через 32 секунды
Это из второго поста

Добавлено через 3 минуты
Аааа! Кажись допер.
Получается что мы передаем массиву строку и потом как индекс ее прибавляем посимвольно, тем самым ее сканируем. Ну или вроде того.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
32451 / 17993 / 3765
Регистрация: 12.02.2012
Сообщений: 30,198
Записей в блоге: 5
12.01.2014, 12:58 28
Цитата Сообщение от xoror Посмотреть сообщение
В цикле идет только обнуление всех элементов массива. 256 итераций!
- это копейки.

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Благодаря строке 10 она у Вас как минимум квадратичная.
- с какого перепуга? Там один цикл до n...
0
31 / 31 / 4
Регистрация: 15.12.2013
Сообщений: 147
12.01.2014, 13:06 29
Цитата Сообщение от Catstail Посмотреть сообщение
с какого перепуга? Там один цикл
И на каждой итерации вызывается функция strlen() для вычисления длины этой строки

Цитата Сообщение от Catstail Посмотреть сообщение
C++
1
2
3
4
5
for (i=0; i<strlen(s); i++) 
{ 
   q=s[i]; 
   Freq[q]++; 
}
Сама функция strlen() примерно так выглядит
C++
1
2
3
4
5
6
7
8
9
int strlen(const char *s)
{
   int i = 0;
   
   while (s[i])
      ++i;
 
   return i;
}
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
32451 / 17993 / 3765
Регистрация: 12.02.2012
Сообщений: 30,198
Записей в блоге: 5
12.01.2014, 13:13 30
Цитата Сообщение от xoror Посмотреть сообщение
И на каждой итерации вызывается функция strlen() для вычисления длины этой строки
- не думаю... Компилятор не так глуп.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.01.2014, 13:15 31
Цитата Сообщение от Catstail Посмотреть сообщение
с какого перепуга? Там один цикл до n...
см. сообщение #15 Самый редко встречающийся элемент в массиве
0
31 / 31 / 4
Регистрация: 15.12.2013
Сообщений: 147
12.01.2014, 13:30 32
Catstail наверно уже пожалел о том, что помог с решением задачи Вон какую критику получил
А с другой стороны это правильно. Ведь на ошибках учатся.
0
1404 / 646 / 135
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
12.01.2014, 13:51 33
Цитата Сообщение от Catstail Посмотреть сообщение
- не думаю... Компилятор не так глуп.
Если бы вместо char* s было бы const char* s, то компилятор скорее всего соптимизировал, а так - нет
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
32451 / 17993 / 3765
Регистрация: 12.02.2012
Сообщений: 30,198
Записей в блоге: 5
12.01.2014, 14:39 34
Цитата Сообщение от xoror Посмотреть сообщение
Вон какую критику получил
- да не критика это вовсе... Мелкая придирка. Во-первых, оптимизирующий компилятор в состоянии распознать, что в цикле строка не меняется, так что нет необходимости перевычислять эту длину на каждом витке. А во-вторых, код легко чуть подправить, и база для "критики" исчезнет:

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
void PrintRare(char *s)
{
    unsigned int i,min,l,Freq[256];
    char q;
 
    l=strlen(s);
 
    /* в Freq[i] будет частота символа с кодом i */ 
 
    for (i=0; i<256; i++) Freq[i]=0; /* чистим */
 
    for (i=0; i<l; i++)
    {
        q=s[i];       /* код очередного символа */
        Freq[q]++; /* увеличиваем соотв. элемент Freq */
    }
 
    /* ищем минимум частот (отличных от нуля!) */
 
    min=l;
 
    for (i=0; i<256; i++)
        if ((Freq[i] > 0) && (Freq[i] < min)) min=Freq[i]; /* если частота символа меньше текущей
                                                                            запомним */
 
    /* печать символов (всех) у которых частота минимальна */
 
    for (i=0; i<256; i++)
        if (Freq[i] == min)
        {
            q=i;
            cout << q << endl;
        }
}
вот и все... Комментарии - по просьбе TC.
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2014, 15:37 35
Цитата Сообщение от Catstail Посмотреть сообщение
Во-первых, оптимизирующий компилятор в состоянии распознать, что в цикле строка не меняется, так что нет необходимости перевычислять эту длину на каждом витке.
вы попробуйте тест запустить, у меня вот совершенно разный результат выдает. Да даже если разница заметна лишь в дебаге, юнит тесты никто не отменял.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
32451 / 17993 / 3765
Регистрация: 12.02.2012
Сообщений: 30,198
Записей в блоге: 5
12.01.2014, 21:13 36
Цитата Сообщение от MrGluck Посмотреть сообщение
совершенно разный результат выдает
- разный с чем?
0
Форумчанин
Эксперт CЭксперт С++
8190 / 5040 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
12.01.2014, 21:17 37
Цитата Сообщение от Catstail Посмотреть сообщение
- разный с чем?
разный при использовании
C++
1
2
l=strlen(s);
for (i=0; i<l; i++)
и
C++
1
for (i=0; i < strlen(s); i++)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
32451 / 17993 / 3765
Регистрация: 12.02.2012
Сообщений: 30,198
Записей в блоге: 5
12.01.2014, 21:46 38
Вероятно, это зависит от реализации компилятора.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.01.2014, 21:46
Помогаю со студенческими работами здесь

Вывести те числа, которые наиболее редко встречаются в массиве и количество их повторений
Дан одномерный массив из 150 случайных целых чисел в диапазоне от 14 до 37 включительно. Вывести те...

Определить, какой символ наиболее редко встречается в заданном массиве(шаблоны)
Доброго времени суток, товарищи эксперты! Написал программу по следующему заданию: Задан массив...

Найти второй самый большой элемент массива и второй самый маленький элемент массива
Помогите пожалуйста: Найти второй самый большой элемент массива и второй самый маленький элемент...

Найти чаще всего встречающийся элемент массива
#include &lt;iostream&gt; using namespace std; int main(void) { const int n=10; int a = {...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru