Как найти моду алгоритм


Загрузить PDF


Загрузить PDF

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

  1. Изображение с названием Find the Mode of a Set of Numbers Step 1

    1

    Запишите числа множества. Моду обычно определяют на наборе статистических данных или множестве численных значений. Таким образом, для нахождения моды вам понадобится набор чисел. Моду сложно определить в уме, если чисел достаточно много, поэтому в большинстве случаев лучше записать все числа или набрать их на компьютере. Если у вас есть карандаш и бумага, достаточно записать все числа. Если же вы работаете за компьютером, удобнее использовать Excel.

    • Метод определения моды легче понять на примере. Рассмотрим в данном разделе следующий набор чисел: {18, 21, 11, 21, 15, 19, 17, 21, 17}. В приведенных ниже шагах мы найдем моду этого множества.
  2. Изображение с названием Find the Mode of a Set of Numbers Step 2

    2

    Расположите числа в порядке возрастания. После того как вы выпишете все числа, полезно переписать их в порядке возрастания. Хотя можно обойтись и без этого, так найти моду будет проще, поскольку одинаковые числа расположатся рядом. Для больших наборов данных это просто необходимо, так как попытка просмотреть неупорядоченный список и подсчитать, сколько раз каждое число появляется в нем, довольно трудоемка и может привести к ошибкам.

    • Если вы используете карандаш и бумагу, переписывание поможет вам сэкономить время в дальнейшем. Просмотрите числа, найдите наименьшее значение, вычеркните его из первоначального множества и занесите в новый список. Повторите то же самое для второго, затем для третьего наименьшего числа и так далее, при этом записывайте каждое число столько раз, сколько оно встречается в исходном наборе данных.
    • Компьютер предоставляет больше возможностей — например, в большинстве программ для работы с электронными таблицами можно упорядочить список значений от наименьшего к наибольшему всего лишь несколькими щелчками мыши.
    • В нашем примере после упорядочения получаем следующую последовательность чисел: {11, 15, 17, 17, 18, 19, 21, 21, 21}.
  3. Изображение с названием Find the Mode of a Set of Numbers Step 3

    3

    Подсчитайте, сколько раз повторяется каждое число. После того как вы перепишете значения в порядке возрастания, подсчитайте, сколько раз встречается каждое число. Поищите число, которое чаще всего попадается в списке. Если чисел сравнительно немного и они расположены в порядке возрастания, это довольно просто: найдите самую большую группу одинаковых значений и подсчитайте, сколько раз они повторяются.

    • Если вы используете карандаш и бумагу, попробуйте записать над каждой группой одинаковых чисел, сколько раз они повторяются. Если вы пользуетесь компьютерной программой для работы с электронными таблицами, можно поступить подобным образом: запишите результаты подсчетов в соседние ячейки или используйте одну из опций для анализа данных.
    • В нашем списке ({11, 15, 17, 17, 18, 19, 21, 21, 21}) 11 и 15 встречаются по одному разу, 17 попадается дважды, 18 и 19 встречаются по одному разу, а 21 встречается три раза. Таким образом, в данном наборе значений чаще всего встречается число 21.
  4. Изображение с названием Find the Mode of a Set of Numbers Step 4

    4

    Определите значение (или значения), которые встречаются наиболее часто. После того как вы подсчитаете, сколько раз встречается каждое число, найдите значения, которые повторяются наибольшее количество раз. Это и есть мода данного множества. Помните, что набор чисел может иметь не одну, а несколько мод. Если в множестве наиболее часто встречаются два числа (то есть они повторяются одинаковое количество раз), такое множество называют бимодальным, если три числа — тримодальным и так далее.

    • В нашем множестве ({11, 15, 17, 17, 18, 19, 21, 21, 21}) наиболее часто встречается значение 21, поэтому 21 является модой.
    • Если бы кроме 21 нашлось еще одно число, которое также встречается три раза, (например, если бы множество включало еще одно число 17), то оно наряду с 21 было бы модой.
  5. Изображение с названием Find the Mode of a Set of Numbers Step 5

    5

    Не путайте моду множества чисел с его средним значением и медианой. При статистическом анализе часто рассматривают вместе такие понятия, как среднее значение, медиана и мода. Их легко спутать, так как они имеют схожие названия и иногда их значения совпадают. Однако независимо от того, совпадает или нет мода множества с его медианой или средним значением, следует помнить, что это три абсолютно разных понятия (смотрите ниже).

    • Чтобы найти среднее значение множества, следует сложить все числа и поделить на их количество. Для нашего примера ({11, 15, 17, 17, 18, 19, 21, 21, 21}) среднее значение составляет 11 + 15 + 17 + 17 + 18 + 19 + 21 + 21 + 21 = 160/9 = 17,78. Мы поделили сумму значений на 9, поскольку данное множество состоит из 9 чисел.

      Изображение с названием Find the Mode of a Set of Numbers Step 5Bullet1

    • Медиана представляет собой «среднее число», которое разделяет меньшие и бо́льшие значения множества на две равные половины. Например, для нашего набора значений ({11, 15, 17, 17, 18, 19, 21, 21, 21}) медианой является число 18, так как слева и справа от него стоит по четыре числа. Учтите, что если множество содержит четное количество чисел, оно не имеет единственной медианы. В этом случае медианой обычно считают среднее значение тех двух чисел, которые расположены посередине.

      Изображение с названием Find the Mode of a Set of Numbers Step 5Bullet2

    Реклама

  1. Изображение с названием Find the Mode of a Set of Numbers Step 6

    1

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

    • Если мы изменим набор чисел в нашем примере на {11, 15, 17, 18, 19, 21}, так чтобы каждое значение встречалось лишь один раз, то он не будет иметь моды. То же верно и для множества, в котором все числа встречаются дважды, например {11, 11, 15, 15, 17, 17, 18, 18, 19, 19, 21, 21}.
  2. Изображение с названием Find the Mode of a Set of Numbers Step 7

    2

    Помните, что моду нечислового набора данных можно определить точно так же, как для числовых множеств. Как правило, большинство наборов данных являются «количественными», то есть содержат данные в виде чисел. Тем не менее встречаются и такие множества, члены которых выражены не в виде чисел. В таких случаях можно сказать, что «мода» — это то значение, которое встречается чаще всего в наборе данных (как и для числовых множеств).[1]
    При этом определить моду будет возможно, в то время как медиану или среднее значение — нельзя.

    • Предположим, при осмотре небольшого участка земли определили вид каждого растущего на нем дерева. Получился следующий список: {кедр, ольха, кедр, сосна, кедр, кедр, ольха, ольха, сосна, кедр}. Такой набор данных называют номинальным, поскольку входящие в него члены представляют собой названия. В этом случае модой является кедр, так как данное слово встречается чаще других (пять раз), в то время как ольха и сосна встречаются соответственно три и два раза.
    • В рассмотренном выше примере невозможно найти среднее значение и медиану, так как набор данных содержит не числа, а названия.
  3. Изображение с названием Find the Mode of a Set of Numbers Step 8

    3

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

    • В качестве примера рассмотрим набор чисел {1, 2, 2, 3, 3, 3, 4, 4, 5}. Если мы отложим эти значения на графике, то получим симметричную кривую, которая достигает максимальной высоты 3 при x = 3 и опускается до 1 при x = 1 и x = 5. Значение 3 встречается чаще всего, поэтому оно является модой. Так как 3 расположено в центре и по обе стороны от него находится четыре числа, оно является также медианой. И наконец, среднее значение данного множества составляет 1 + 2 + 2 + 3 + 3 + 3 + 4 + 4 + 5 = 27/9 = 3, то есть число 3 является также средним значением.
    • Исключение из этого правила составляют симметричные множества с более чем одной модой — они имеют по одной медиане и среднему значению, с которыми не совпадают несколько мод.

    Реклама

Советы

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

Реклама

Что вам понадобится

  • Бумага, карандаш и ластик

Об этой статье

Эту страницу просматривали 47 353 раза.

Была ли эта статья полезной?

МИНОБРНАУКИ РОССИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ ЭЛЕКТРОТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ «ЛЭТИ» ИМ. В.И. УЛЬЯНОВА (ЛЕНИНА) Кафедра физической электроники и технологии

ОТЧЕТ по лабораторной работе №5

по дисциплине «Информационные технологии» Тема: Алгоритмы и программы решения задач комбинаторики

Студентка гр. 0207

Лиоско Е.П.

Преподаватель

Санкт-Петербург

2021

Цель работы.

Изучение и программирование стандартного алгоритма «поиска моды».

Блок-схема программы для сортировки выбором.

Текст программы 1.

clc;

clear all; N=8;

mt=1;

mc=1;

im=1;

i=1;

s=[4 4 4 7 7 7 7 7];

%s=[4 4 4 4 4 7 7 7];

%s=[1 2 3 4 5 6 7 8];

while i<N-1 % рассмотрим весь массив

2

j=i;

while (j<N) && (s(j)==s(j+1)) % пока элемент повторяется,

а его номер в массиве меняется, и номер этого элемента <=8 mt=mt+1;

j=j+1;

end i=i+mt;

if mt>mc % сохраняем кол-во повторений (>1) в переменной

mc

mc=mt; im=i-mt;

end mt=1;

end

if mc>1 % если номер элемента > 1 disp(‘Значение моды :’); disp(s(im));

disp(‘Индекс начала последовательности значений моды:’); disp(im);

disp(‘Количество значений mc в последовательности моды:’); disp(mc);

else disp(‘No mode’); end

Таблица 1 листингов трех версий вектора S(8).

Листинг 1

Листинг 2

Листинг 3

Значение моды :

Значение моды :

7

4

Индекс

начала

Индекс

начала

последовательности

последовательности

значений моды:

значений моды:

No mode

4

1

Количество значений mc

Количество значений mc

в

последовательности

в

последовательности

моды:

моды:

5

5

3

Текст программы 2.

clear all;

N=10^4; % N=10^5; N=10^6; N=10^7; mt=1;

mc=1;

im=1;

i=1;

s=fix(50*rand ([1 N])); tic;

y=quicksort(s);

while i<N-1 % рассмотрим весь массив j=i;

while (j<N) && (s(j)==s(j+1)) % пока элемент повторяется,

а его номер в массиве меняется, и номер этого элемента <=8 mt=mt+1;

j=j+1;

end i=i+mt;

if mt>mc % сохраняем кол-во повторений (>1) в переменной

mc

mc=mt; im=i-mt;

end mt=1;

end toc;

if mc>1 % если номер элемента > 1 disp(‘Значение моды :’); disp(s(im));

disp(‘Индекс начала последовательности значений моды:’); disp(im);

disp(‘Количество значений mc в последовательности моды:’); disp(mc);

else disp(‘No mode’); end

function[vector]=quicksort(vector)

if ~isempty(vector)% если вектор пустой, программа остановится

global cm; cm=cm+1; pivot=vector(1);

A1=quicksort(vector(vector<pivot));

A2=vector(vector==pivot);

A3=quicksort(vector(vector>pivot)); vector=[A1 A2 A3];

end end

4

Таблица 2.

i

N

t, сек

1

104

0.017666

2

105

0.032427

3

106

0.128400

4

107

1.118960

Таблица 3.

i-j

1-2

10

1,8

1-3

100

7,3

1-4

1000

63,3

KN=Nj/Ni, Kt=tj/ti

Вывод.

Временя поиска моды увеличивается с увеличением размерности вектора.

5

Соседние файлы в папке 2 сем

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

1 / 1 / 0

Регистрация: 24.04.2011

Сообщений: 24

1

Найти моду в массиве

10.07.2012, 12:08. Показов 27096. Ответов 17


Студворк — интернет-сервис помощи студентам

Найти в массиве моду. *Массив размером m, m – натурал. число.
(мода- элемент ряда, который встречается наиболее часто.)



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

10.07.2012, 12:08

17

155 / 155 / 44

Регистрация: 03.11.2010

Сообщений: 393

10.07.2012, 12:29

2

Код написан здесь
Мода массива



0



155 / 137 / 46

Регистрация: 15.02.2010

Сообщений: 750

10.07.2012, 12:31

3

Каковы максимальные значения m,n ???



0



155 / 155 / 44

Регистрация: 03.11.2010

Сообщений: 393

10.07.2012, 12:38

4

Цитата
Сообщение от LVV
Посмотреть сообщение

Каковы максимальные значения m,n ???

А откуда еще n взялось?
Массив одномерный размера m.



0



LVV

155 / 137 / 46

Регистрация: 15.02.2010

Сообщений: 750

10.07.2012, 21:25

5

В задаче не указан максимальный размер массива (m) и не указано, какие значения могут принимать элементы массива . Предположим, что речь идёт массиве натуральных чисел, максимальное из которых n<32768.

запустите программу и посмотрите сколько времени занимает поиск моды в моём варианте, и в предложенной ссылке Мода массива для массива из 30000 элементов (я объединил оба кода)
А, скажем, для 100000 элементов… не дождётесь второго результата (а мой — почти мгновенно).
Вот поэтому я и спрашивал, каков размер массива () и каково максимальное значение его элементов.

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
//moda
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
    setlocale (0,"");
    //СОЗДАНИЕ МАССИВА
    int m=30000, // размер массива
        n=10, // максимальное значение элемента массива (n<32768)
        rmax; // мода
    int *a = new int[m];
    for (int i=0; i<m; i++)
    a[i]= rand() % (n+1);
    
    //ВЫВОД МАССИВА
        //for (int i=0; i<m; i++)
        //cout << a[i]<< " ";
        //cout << endl;
    
    cout << "массив из " << m << " элементов создан,nnnn";
    
    
 
    //мой вариант
    cout << "идёт проверка предложенным мною способомnn";
    int b[32768] ={0};
    for (int i=0; i<m; i++)
        b[a[i]]++;
    
    rmax=b[0];
    int I=0;
    for (int i=0; i<n; i++)
        if (b[i]>rmax)
        {
            rmax=b[i];
            I=i;
        }
    cout << "элемент " << I 
        << "nвстречается наибольшее количество: " 
        << rmax << " разnnnn" <<endl;
    
 
    //предложенный вариант 
        cout <<"идёт проверка предложенным Inadequate способомn" ;
    rmax = 0;
    int max = a[0], cmax = 0;
        
    for (int i = 0; i < m; i++) 
    {
        if (cmax > rmax) 
        {
            rmax = cmax;            
            max = a[i - 1];    
        }
        cmax = 0;
        for (int j = i; j < m; j++)
           if (a[j] == a[i])
              cmax++;
    }
    cout << "элемент " << max 
        << "nвстречается наибольшее количество: " 
        << rmax << " разnnnn" <<endl;
    
    
system ("pause");
}

P.S. Оба кода моду ищут правильно, только мой — для наименьшего числа массива, а предложенный по ссылке — первого из нескольких.



2



155 / 155 / 44

Регистрация: 03.11.2010

Сообщений: 393

11.07.2012, 15:44

6

В своем коде вы избавились от вложенного цикла за счет второго массива и получили лучшую скорость, это хорошо. За это плюсую.



0



Vinchi

0 / 0 / 0

Регистрация: 11.07.2012

Сообщений: 3

27.08.2012, 19:09

7

Цитата
Сообщение от LVV
Посмотреть сообщение

В задаче не указан максимальный размер массива (m) и не указано, какие значения могут принимать элементы массива . Предположим, что речь идёт массиве натуральных чисел, максимальное из которых n<32768.

запустите программу и посмотрите сколько времени занимает поиск моды в моём варианте, и в предложенной ссылке Мода массива для массива из 30000 элементов (я объединил оба кода)
А, скажем, для 100000 элементов… не дождётесь второго результата (а мой — почти мгновенно).
Вот поэтому я и спрашивал, каков размер массива () и каково максимальное значение его элементов.

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
//moda
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
    srand(time(NULL));
    setlocale (0,"");
    //СОЗДАНИЕ МАССИВА
    int m=30000, // размер массива
        n=10, // максимальное значение элемента массива (n<32768)
        rmax; // мода
    int *a = new int[m];
    for (int i=0; i<m; i++)
    a[i]= rand() % (n+1);
    
    //ВЫВОД МАССИВА
        //for (int i=0; i<m; i++)
        //cout << a[i]<< " ";
        //cout << endl;
    
    cout << "массив из " << m << " элементов создан,nnnn";
    
    
 
    //мой вариант
    cout << "идёт проверка предложенным мною способомnn";
    int b[32768] ={0};
    for (int i=0; i<m; i++)
        b[a[i]]++;
    
    rmax=b[0];
    int I=0;
    for (int i=0; i<n; i++)
        if (b[i]>rmax)
        {
            rmax=b[i];
            I=i;
        }
    cout << "элемент " << I 
        << "nвстречается наибольшее количество: " 
        << rmax << " разnnnn" <<endl;
    
 
    //предложенный вариант 
        cout <<"идёт проверка предложенным Inadequate способомn" ;
    rmax = 0;
    int max = a[0], cmax = 0;
        
    for (int i = 0; i < m; i++) 
    {
        if (cmax > rmax) 
        {
            rmax = cmax;            
            max = a[i - 1];    
        }
        cmax = 0;
        for (int j = i; j < m; j++)
           if (a[j] == a[i])
              cmax++;
    }
    cout << "элемент " << max 
        << "nвстречается наибольшее количество: " 
        << rmax << " разnnnn" <<endl;
    
    
system ("pause");
}

P.S. Оба кода моду ищут правильно, только мой — для наименьшего числа массива, а предложенный по ссылке — первого из нескольких.

Спасибо!
Использовал ваш код,но немного переделал под vector.
И ещё раз большое спасибо!

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
int main()
{
    vector<int> moda;
    vector<int> number(1000,0);
    
    int num;
    int rmax;
    int n = 100;
    
    while(cin >> num)
        moda.push_back(num);
    
    for (int i = 0;i < moda.size();i++)
        number[moda[i]]++;
    
    rmax = number[0];
    int c = 0;
    
    for (int i = 0; i < n;i++)
        if(number[i] > rmax)
        {
            rmax = number[i];
            c = i;
        }
    
    cout << "Repeat numbers: " << c << endl
         << "The number of repetitions: " << rmax << endl;
    
}



0



agvk

0 / 0 / 0

Регистрация: 17.11.2014

Сообщений: 3

08.11.2015, 19:26

8

в универе написал, вроде как работает. код на Си

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
#include<stdio.h>
 
#pragma warning(disable: 4996)
 
#define N 20
system();
 
int main(void){
    int A[N];
    int i = 0,
        j = 0,
        len = 0,
        curNum = 0, //chastota vstrechanii
        maxNum = 0, //chastota modi
        curModa = 0, //tekuschaya moda
        maxModa = 0,
        flag = 0;
 
        printf("Insert array A[], a number of elements max 20: ");
        scanf("%d", &len);
 
    while(1){
        if(!scanf("%d", &A[i])){
            printf("Wrong enter!n");
            printf("Insert array A[], a number of elements = %dn", len);
            fflush(stdin);
            i = 0;
        }
        i++;
        if(i == len){
            break;
        }
    }
 
    for (i = 0; i < len; i++){
        curNum = 0;
        for(j = 0; j < len; j++){
            if(A[i]==A[j]){
                curNum++;
            }
        }
        if(curNum > maxModa){
            flag = 1;
            maxModa = curNum;
            maxNum = A[i];
        }
        else if(curNum == maxModa && A[i] != maxNum){
            flag = 0;
        }
        
        curModa = maxNum;
    }
 
    if(flag){
        printf("chastota vstrechanii: %dnmoda: %dn", maxModa, curModa);
    }
    else{
        printf("No modan");
        system("PAUSE");
        return;
    }
 
    system("PAUSE");
    return 0;
}



0



pproger

166 / 69 / 17

Регистрация: 22.03.2011

Сообщений: 196

08.11.2015, 21:52

9

Vetaliuy,

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
#include <iostream>
#include <map>
#include <vector>
 
template <typename T>
T find_mode(const std::vector<T> &v) {
    using MyMap = std::map<T, int>;
 
    MyMap m;
 
    for (const auto &i : v) {
        ++m[i];
    }
 
    typename MyMap::iterator i = std::max_element(m.begin(), m.end(),
            [](const typename MyMap::value_type &lh, const typename MyMap::value_type &rh) { return lh.second < rh.second; }
    );
 
    return i->first;
}
 
int main() {
    using std::cout;
    using std::endl;
 
    std::vector<std::string> str_arr = {
        "111",
        "111",
        "222",
        "absafasfa",
        "222",
        "111",
        "absafasfa",
        "absafasfa",
        "absafasfa",
        "333",
        "222",
        "absafasfa",
    };
 
    std::vector<int> int_arr = { 1, 2, 5, 1, 3, 2, 2, 2, 2, 1 };
 
    cout << find_mode(str_arr) << endl;
    cout << find_mode(int_arr) << endl;
}



0



Pashtets

0 / 0 / 0

Регистрация: 30.12.2016

Сообщений: 77

25.01.2017, 00:41

10

Цитата
Сообщение от LVV
Посмотреть сообщение

/

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/предложенный вариант 
 cout <<"идёт проверка предложенным Inadequate способомn" ;
 rmax = 0;
 int max = a[0], cmax = 0;
for (int i = 0; i < m; i++) 
 {
 if (cmax > rmax) 
 {
 rmax = cmax; 
 max = a[i - 1]; 
 }
 cmax = 0;
 for (int j = i; j < m; j++)
 if (a[j] == a[i])
 cmax++;
 }
 cout << "элемент " << max 
 << "nвстречается наибольшее количество: " 
 << rmax << " разnnnn" <<endl;
system ("pause");

}

как этот код вообще может чтото искать если в самом начале rmax = 0;
и cmax = 0;
а дальше ниже в цикле проверяется выражение if (cmax > rmax)
как они могут быть больше или меньше если они оба по условию равны нулю и нигде до этого момента в них не внисится изменение

Добавлено через 26 минут

Цитата
Сообщение от Vinchi
Посмотреть сообщение

C++
1
2
for (int i = 0;i < moda.size();i++)
 number[moda[i]]++;

объясните плс как работает код целиком… и зачем нам нужен такой цикл с итерацией. Что делает итерация я чет не въеду.



0



LVV

155 / 137 / 46

Регистрация: 15.02.2010

Сообщений: 750

25.01.2017, 14:10

11

Мода — это значение, которое встречается наибольшее количество раз.
Один из способов поиска моды заключается в многократном просмотре исходного массива a[] и подсчете количества повторений его одинаковых элементов.

Второй способ, заключается в использовании дополнительного целочисленного массива b[], и однократном прохождении исходного массива a[]. Этот способ удобен для целочисленного массива a[] с неотрицательными значениями элементов, поскольку эти значения будут использоваться в качестве индексов массива b[]

Например, дан целочисленный массив a[1000], значения элементов которого не отрицательны и не превышают 10. Определим и обнулим новый массив b[11], максимальный индекс которого (10) равен максимально возможному значению элемента массива a[1000]

int b[11] ={};
Просмотрим массив a[1000], увеличивая на единицу элементы массива b c индексами, равными значениям элементов массива а
for (int i=0; i<1000; i++)
b[a[i]]++;

Таким образом значения элементов массива b[11] станут счетчиками, обозначающими сколько раз встречается в массиве a[1000] любое значение от 0 до 10-ти включительно.
Например значение b[5] покажет сколько раз в массиве a[1000] повторилось число 5.
Для нахождения моды массива a[1000] достаточно будет найти индекс наибольшего элемента массива b[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
#include <iostream>
#include <map>
using namespace std;
int main()
{
//дан массив вещественных чисел
    double a[5]={1.8, 1.4, 2.9, 1.5, 2.9} ;
//находим моду
map <double,int> b;
     for(int i=0; i<5; i++)
     b[a[i]]++;
map <double, int>::iterator it = b.begin();
   double mod = (*it).first;
   int max = (*it).second;;
         for (; it!=b.end(); it++)
          if ((*it).second > max)
            {
               max = (*it).second;
               mod = (*it).first;
           }
cout << mod << endl;
return 0;
}
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 <string>
#include <map>
using namespace std;
int main()
{
//дан массив строковых элементов
    string a[5]={"abc", "abcd", "kl", "fgh", "kl"} ;
//находим моду
    map <string,int> b;
for(int i=0; i<5; i++)
b[a[i]]++;
map <string, int>::iterator it = b.begin(); 
string mod = (*it).first;
int max = (*it).second;;
    for (; it!=b.end(); it++)
        if ((*it).second > max)
        {
            max = (*it).second;
            mod = (*it).first;
        }
cout << mod << endl;
return 0;
}



0



Peoples

Эксперт С++

1623 / 953 / 782

Регистрация: 06.02.2016

Сообщений: 2,449

Записей в блоге: 30

25.01.2017, 15:21

12

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
    vector<int>v {1,2,2,3,4,4,5,5,5,5,5,6,7,8,8,8,8};
    cout<<*max_element(v.cbegin(),v.cend(),[&v](const int &x, const int &y) {
        return count(v.cbegin(),v.cend(),x)<count(v.cbegin(),v.cend(),y);
    });
}



0



Pashtets

0 / 0 / 0

Регистрация: 30.12.2016

Сообщений: 77

25.01.2017, 23:50

13

LVV, я новичок, поэтому и решил эту задачу по своему…
Ниже код моего варианта поиска моды:

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
int main() {
    setlocale(LC_ALL, "ru");
 
    vector <int> nums = {7,2,3,12,1,1,1,1,1,1,6,7,7,8,7};
    vector <int> moda;
 
    sort(nums);
    for (int i = 1; i < nums.size()-1; i++) {
        if (nums[i] == nums[i - 1]) {
            moda.push_back(nums[i]);
            if (nums[i] != nums[i + 1]) {
                moda.push_back(nums[i]);
            }
        }
    } 
    sort(moda);
    int b = moda[0],
        a = 0,
        c = 0;
    for (int i = 0; i < moda.size(); i++) {
        if (moda[i] == b) {
            a = moda[i];
            c++;
        }   
    }
    cout << "Повторяемое число " << a << " повторяется " << c << " раз(а)" << endl;
 
        /*for (int i : nums2) {
        cout << i << endl;
    }*/
        return 0;
 
}

В этом случае, такой алгоритм находит только 1 моду, ну я имею ввиду если в массиве будет 2 числа с одинаковым кол-вом повторений, то найдется только вариант число которого меньше. Но немного поковырять можно будет настроить, чтобы показывалось равенство двух или нескольких равных по количеству повторений цифр.
в этом случае нам не нужен массив размером в 1000 итд.

Сравнить время работы программ точно не смог, пробовал выполнить функцией clock(); но погрешность была очень большая.

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



0



LVV

155 / 137 / 46

Регистрация: 15.02.2010

Сообщений: 750

26.01.2017, 06:25

14

Цитата
Сообщение от Pashtets
Посмотреть сообщение

Чет вчитываюсь в ваш вариант не все понимаю…

Для целых неотрицательных чисел всё очень просто (читай описание выше):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int a[5]={10,2,0,10,5},
 b[11]={};
for(int i=0; i<5; i++}
b[a[i]]++;
 
int max=b[0],
 moda=0;
 
for(int i=0; i<11; i++)
    if(b[i]>max)
    {
        max=b[i];
        moda=i;
      }
 
cout << moda;

Для вещественного массива ниже код с комментариями:

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
#include <iostream>
#include <map>
using namespace std;
int main()
{
//дан массив вещественных чисел
    double a[5]={1.8, 1.4, 2.9, 1.5, 2.9} ;
//обьявляем контейнер b
//первое значение (first) - ключ
//второе значение (second) - счетчик
    map <double,int> b;
// просматриваем массив а
for(int i=0; i<5; i++)
// увеличиваем счетчик контейнера b
//для соответствующих ключей 
b[a[i]]++;
 
//ищем максимальный счетчик max
//и моду moda в контейнере b
map <double, int>::iterator it = b.begin();//обьявляем итератор 
//пусть искомые значения находятся в начальном элементе контейнера b 
double moda = (*it).first;
int max = (*it).second;;
 
 
for (; it!=b.end(); it++)//пока не достигли последнего указателя
{
    if ((*it).second > max)//если нашелся счетчик больше, чем сохранённый максимальный
    {
        max = (*it).second;
        moda = (*it).first;
    }
}
//выводим моду (ключ с наибольшим счетчиком)
cout << moda << endl;
 
return 0;
}

Цитата
Сообщение от Peoples
Посмотреть сообщение

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int>v {1,2,2,3,4,4,5,5,5,5,5,6,7,8,8,8,8};
cout<<*max_element(v.cbegin(),v.cend(),[&v](const int &x, const int &y) {
return count(v.cbegin(),v.cend(),x)<count(v.cbegin(),v.cend(),y);
});

}

А на Visual Studio код от Peoples пошел лишь после переделки строки инициализации вектора



0



badvik

3 / 3 / 0

Регистрация: 15.10.2015

Сообщений: 60

26.02.2017, 16:59

15

Если кому-то будет актуально или для замечаний, я дописал код, по быстрому алгоритму LVV и, чтобы выводил все варианты мод (мин. ручной ввод значений).
За критику/ошибки буду благодарен:

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
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <ctime>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "rus");
    srand(time(NULL));
 
    const int size = 32767;
    vector<int> numbers;    
    
    for (int i = 0; i < size; ++i) {
        numbers.push_back(1 + rand() % 9);          
    }
    int max = 0;                                // для поиска макс. значения и задания будущего вектора мод
    for (auto i : numbers) {                    // можно было и макс. значение вывести в cin, но пусть будет поиском в "готовом" массиве
        if (i > max) {
            max = i;
        }   
    }
        
    vector<int> counters(max+1);                    // создаем вектор счетчиков
 
    for (size_t i = 0; i < numbers.size(); ++i) {
        counters[numbers[i]]++;                     // по методу LVV включаем счетчики
    }
    
    int moda_max = counters[0];                     // макс. значение счетчика
    int moda_i = 0;                                 // для записи номера счетчика/моды
    vector<int> equal_modas;                        // вектор одинаковых мод
    
    for (size_t i = 0; i < counters.size(); ++i) {  // определяем макс. моду/счетчик
        if (counters[i] > moda_max) {
            moda_max = counters[i];
            moda_i = i;
        }
        else if (i != 0 && counters[i] == moda_max) {   // если есть совпадения, записываем  в новый вектор мод
            equal_modas.push_back(i);
        }
    }
    
    if (equal_modas.size() > 1) {                   // вывод мод если несколько значений
        for (auto i : equal_modas) {
            cout << i << " | ";
        }
        cout << endl;
    }
    else {
        cout << moda_i << endl;
    }
 
    system("pause");
}

p.s. сравнивал с массивами вместо векторов, в пределах 1-1000 значений и размером до 100 000 разницы никакой не заметил.



0



DOLINSKYI

2 / 2 / 0

Регистрация: 16.08.2015

Сообщений: 31

07.04.2017, 04:56

16

Вот мой вариант. Буду рад если кому то пригодится!

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
#include <locale>
#include <std_lib_facilities.h>
int main()
{
    std::locale::global(std::locale(""));         //Выводит кириллицу.
    vector<int> namber;                           //Вектор для простых чисел.
    int moda = 0;                                 //В эту переменную заносим первые повторяющиеся числа.
    int moda1 = 0;                                //В эту переменную заносим следующие повторяющиеся числа.
    int sum = 0;                                  //Счетчик повторений для moda.
    int sum1 = 0;                                 //Счетчик повторений для moda1.
    int n = 0;                                    //Задает максимальное значение диапазона или vector.size().
    int x = 0;                                    //Задает максимальное значение элемента, то есть в диап. не будет больше цифры чем заданная.
    cout << "Введите первое целое число (Max элементов в диапазоне) и нажмите Enter: ";         //Приглашение.
    cin >> n;
    cout << 'n' << "Введите второе целое число (Max значение элемента) и нажмите Enter: ";     //Приглашение.
    cin >> x;
    for (int i = 0; i < n; ++i)                   //Заполняем вектор используя генератор случайных чисел rand().
    {
        namber.push_back(1 + rand() % x);
    }
    sort(namber);                                 //Сортируем все элементы вектора по возрастанию, используя функцию sort().
    for (int i = 1; i < namber.size(); ++i )     //Цикл выполняет проход по вектору и за один проход найдет "моду" и количество повторений.
    {
        if (sum == 0 && namber[i] == namber[i - 1] || namber[i] == moda) moda = namber[i], ++sum;         //Находим первую группу повторяющихся чисел.
        else if (sum1 == 0 && namber[i] == namber[i - 1] || namber[i] == moda1) moda1 = namber[i], ++sum1;//Находим вторую группу повторяющихся чисел.
        else if (sum < sum1) sum = 0, moda = 0;               //Сравниваем моды по количеству повторений, там где меньше повторений, 
        else sum1 = 0, moda1 = 0;                            //инициалезируем переменные с нулем для записи в них новых повторяющихся чисел.
    }
    for (int x : namber) cout << x << ", n";
    if(sum > sum1) cout << 'n' << "Мода диапазона: " << moda << " Количество повторений в диапазоне: " << sum << 'n';
    else cout << 'n' << "Мода диапазона: " << moda1 << " Количество повторений в диапазоне: " << sum1 << 'n';
    system("Pause");
    return 0;
}



1



3 / 2 / 3

Регистрация: 07.03.2018

Сообщений: 217

07.10.2018, 20:03

17

А как сделать так,чтобы программа выводила все одинаковые моды?Например у меня сгенерировался массив из 1000 элементов и в нем есть 3 одинаковые моды.Как реализовать их вывод?



0



3 / 3 / 0

Регистрация: 28.02.2018

Сообщений: 4

14.02.2020, 14:00

18

#include<iostream>
#include»vector»
//#include»algorithm»
//#include»string»
using namespace std;
int main()
{
setlocale(LC_ALL, «Russian»);
system(«chcp 1251»);
vector<int>chisla;
vector<int>shlak;
vector<int>schet;
int x;
int razy=1;
//int u = 0;
int y=0;
int h = 0;
while (cin>>x)//наполняем векторы
{
chisla.push_back(x);
shlak.push_back(x);
}
for (int i = 0; i < chisla.size(); i++)//ищем одинаковые значения
{
for (int j = i+1; j < chisla.size(); j++)
{
if (chisla[i]&& chisla[j]== chisla[i])
{
razy++;
shlak[j] = 0;//одинаковые обнуляем,чтоб потом не мешали
}
}
schet.push_back(razy);
razy = 1;
}
for (int i = 0; i < schet.size() ; i++)//выводим количество повторов
{
if (shlak[i])//если не 0
{
cout << shlak[i] << «-» << schet[i] << «n»;
}
}
for (int i = 0; i < schet.size(); i++)//находим индекс числа с наибольшими повторами
{

if (schet[i]>=h)
{
h = schet[i];
y = i;
}

}
for (int i = 0; i < schet.size(); i++)//выводим наибольшие одинаковые числа с модой
{
if (schet[y]== schet[i])
{
cout << shlak[i] << «-мода-» << schet[i] << «n»;
}
}
}



0



У вас эти циклы

int counter = 0; 
for (int i = 0; i < numbers.size(); ++i) 
{
    for (int j = 0; j < numbers.size(); ++j) 
    {
        if (numbers[i] == numbers[j])
            ++counter;
    }
    //сколько каждое число повторяется раз
    arr.push_back(counter);
    counter = 0;
}

не эффективны. Так как вектор был уже отсортирован, то не имеет смысла начинать внутренний цикл с позиции, равной 0.

Что касается вашего вопроса, то имеется несколько подходов. Например, вы могли записывать моды также в вектор. Второй подход состоит в двух проходах по отсортированному вектору. Сначала вы находите максимальное значение повторяющихся соседних элементов, а во втором проходе выводите те элементы, которые повторяются найденное число раз.

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

#include <iostream>
#include <vector>
#include <algorithm>

int main() 
{
    std::vector<int> v = { 4, 8, 8, 4, 9 };
    std::vector<int> mods;

    std::sort( v.begin(), v.end() );

    using size_type = std::vector<int>::size_type;

    size_type max = 0;
    for ( size_type i = 0, j; i < v.size(); i = j )
    {
        j = i + 1;
        while ( v[j] == v[i] ) ++j;

        if ( max <= j - i )
        {
            if ( max != 1 )
            {
                if ( max < j - i )
                {
                    max = j - i;
                    mods.assign( 1, v[i] );
                }
                else
                {
                    mods.push_back( v[i] );
                }
            }
        }           
    }

    if ( max == 1 )
    {
        std::cout << "We dont have moden";
    }       
    else
    {
        std::cout << "Mode" << ( mods.size() == 1 ? ":" : "s:" );
        for ( int x : mods ) std::cout << ' ' << x;
        std::cout << 'n';
    }       

    return 0;
}

Ее вывод на консоль следующий

Modes: 4 8



3.1.4. Как вычислить среднюю, моду и медиану интервального ряда?

Начнём опять с ситуации, когда нам даны первичные статические данные:

Пример 10

По результатам выборочного исследования цен на ботинки в магазинах города получены следующие данные (ден. ед.):

– это в точности числа из Примера 6.  Но теперь нам нужно найти среднюю, моду и медиану.

Решение: чтобы найти среднюю по первичным данным, нужно

просуммировать все варианты и разделить полученный результат на объём совокупности:
 ден. ед.

Эти подсчёты, кстати, займут не так много времени и при использовании оффлайн калькулятора. Но если есть Эксель, то,

конечно, забиваем в любую свободную ячейку:
=СУММ(, выделяем мышкой все числа, закрываем скобку ), ставим знак деления /, вводим число 30 и жмём Enter. Готово.

Что касается моды, то её оценка по исходным данным, становится непригодна. Хоть мы и видим среди чисел

одинаковые, но среди них запросто может найтись так 5-6-7 вариант с одинаковой максимальной частотой, например, частотой 2.

Поэтому модальное значение рассчитывается по сформированному интервальному ряду (см. ниже).

Чего не скажешь о медиане: забиваем в Эксель  =МЕДИАНА(, выделяем мышью все числа, закрываем

скобку ) и жмём Enter: . Причём, здесь даже ничего

не нужно сортировать.

Но в Примере 6 я проводил сортировку совокупности по возрастанию (вспоминаем и сортируем), и это хорошая возможность

повторить формальный алгоритм отыскания медианы.

Делим объём выборки пополам:
, и поскольку она состоит из чётного

количества вариант, то медиана равна среднему арифметическому 15-й и 16-й варианты упорядоченного (!) вариационного

ряда:
 ден. ед.

Ситуация вторая. Когда даны не первичные данные, а готовый интервальный ряд (что в учебных задачах бывает чаще).

Продолжаем анализировать этот же пример с ботинками, где по исходным данным был составлен ИВР. Для вычисления средней потребуются середины  интервалов:

– чтобы воспользоваться знакомой формулой дискретного случая:

 – и это отличный результат! Расхождение с

более точным значением (), вычисленным по

первичным данным, составило всего 0,04!

Здесь мы использовали упомянутый ранее приём – приблизили интервальный ряд дискретным, и это приближение оказалось

весьма эффективным. Впрочем, с современными программами не составляет особого труда вычислить точное значение даже по

очень большому массиву первичных данных. Если они нам известны ;)

С другими центральными показателями всё занятнее.

Чтобы найти моду, нужно найти модальный интервал (с максимальной частотой) – в нашей задаче

это интервал  с частотой 11, и воспользоваться

следующей страшненькой формулой:

, где:

 – нижняя граница модального интервала;
 – длина модального интервала;
 – частота модального интервала;
 – частота предыдущего интервала;
 – частота следующего интервала.

Таким образом:
 ден. ед. – как видите, «модная» цена на

ботинки заметно отличается от среднего арифметического значения .

Не вдаваясь в геометрию формулы, просто приведу гистограмму относительных частот

и отмечу :

откуда хорошо видно, что мода смещена относительно центра модального интервала в сторону левого интервала

с бОльшей частотой. По той причине, что дешёвых ботинок больше. И, возможно, они тоже вполне себе модные.

Справочно остановлюсь на редких случаях:
– если модальный интервал крайний, то  либо ;
– если обнаружатся два смежных модальных интервала, например,  и ,

то рассматриваем модальный интервал , при этом

близлежащие интервалы (слева и справа) по возможности тоже укрупняем в два раза;
– если между модальными интервалами есть расстояние, то применяем формулу к каждому интервалу, получая тем самым две

или бОльшее количество мод.

Вот такой вот депеш мод :)

И медиана. Она рассчитывается чуть по менее страшной формуле. Для её применения

нужно найти медианный интервал – это интервал, содержащий варианту (либо 2 варианты), которая делит вариационный ряд на две

равные части.

Выше я рассказал, как определить медиану, ориентируясь на относительные накопленные частоты

,  здесь же сподручнее рассчитать

«обычные» накопленные частоты . Вычислительный

алгоритм такой же – первое значение сносим слева (красная стрелка), а каждое следующее получается как сумма

предыдущего с текущей частотой из левого столбца (зелёные обозначения в качестве примера):

Всем понятен смысл чисел в правом столбце? – это количество вариант, которые успели «накопится» на всех «пройденных»

интервалах, включая текущий.
Поскольку у нас чётное количество вариант (30 штук), то медианным будет тот интервал, который содержит -ю и 16-ю варианту. И ориентируясь по накопленным частотам, легко

прийти к выводу, что эти варианты содержатся в интервале .

Формула медианы:

, где:

 – объём статистической совокупности;
 – нижняя граница медианного

интервала;
 – длина медианного интервала;
 – частота медианного интервала;
 – накопленная частота

предыдущего интервала.

Таким образом:
 ден. ед. – заметим, что медианное

значение, в отличие от моды, оказалось смещено правее, т.к. по правую руку находится значительное количество вариант:

Справочно особые случаи:
– если медианным является крайний левый интервал, то ;
– если вариационный ряд содержит чётное количество вариант и две средние варианты попали в разные интервалы, то

объединяем эти интервалы, и по возможности удваиваем предыдущий интервал.

Ответ:  ден. ед.

По сравнению с предыдущей задачей ,

центральные показатели оказались заметно отличны друг от друга. Это говорит об асимметрии

(«скошенности») распределения цен, что хорошо видно по гистограмме и совершенно логично –

ботинок низкого и среднего ценового сегмента много, а премиального – мало.

Задание для тренировки:

Пример 11

Для изучения затрат времени на изготовление одной детали рабочими завода проведена выборка, в результате которой получено

следующее статистическое распределение:

…да, тот самый завод Петровского :) Найти среднюю, моду и медиану.

Решаем эту задачу в Экселе – все числа и инструкции уже там. Если нет Экселя, считаем на

калькуляторе, что в данном случае может оказаться даже удобнее. Образец решения, как обычно, в конце книги. Это, кстати, уже

каноничная «интервальная» задача, в которой исследуется непрерывная величина – время.

Что ещё можно сказать по теме?

Несмотря на разнообразия рассмотренных показателей, их всё равно бывает не достаточно. Существуют крайне неоднородные

совокупности, у которых варианты «кучкуются» во многих местах, и по этой причине средняя, мода и

медиана плохо характеризуют положение дел.

В таких случаях вариационный ряд дробят с помощью квартилей, децилей, а в упоротых специализированных исследованиях – и с

помощью перцентилей.

Квартили упорядоченного вариационного ряда – это варианты , которые делят его на 4 равные (по количеству вариант) части. Из чего

автоматически следует, что 2-я квартиль – есть в точности медиана: .

В тяжёлых случаях проводится разбиение на 10 частей – децилями  – это варианты, который делят упорядоченный вариационный ряд на 10 равных (по

количеству вариант) частей.

И в очень тяжелых случаях в ход пускается 99 перцентилей .

После разбиения вариационного ряда каждый участок исследуется по отдельности – рассчитываются локальные средние и другие

показатели.

В учебном курсе квартили, децили, перцентили встречаются редко, и посему я оставляю этот материал (их нахождение) для

самостоятельного изучения.

Ну а сейчас мы переходим к изучению второй группы статистических показателей:

3.2. Показатели вариации

3.1.3. Медиана

| Оглавление |



Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Fatal directx error code 2 just cause 2 windows 7 как исправить
  • Как найти владельца заблокированного айфона
  • Как найти количество байт в мегабайте
  • Как составить матрицу распределения ответственности
  • Как найти команду для апекс

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии