Выборка элементов массива

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Аватара пользователя
Alex_Burn
Сообщения: 147
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

Здравствуйте, уважаемые участники форума! Меня интересует как из 2-мерного массива выбрать (ну и записать в одномерный) только те элементы, которые встречаются в нем более одного раза. Прошу прощения за тупой вопрос. Заранее спасибо.
F-R-O-S-T
Сообщения: 29
Зарегистрирован: 01 июл 2008, 16:09
Откуда: SPBi
Контактная информация:

если диапазон значений в массиве от 0 до n-1 ну или если он хотя бы известен,
то можно сделать так:

Код: Выделить всё

int massiv[n] //Вспомогательный массив
int matrix[k][l] //Массив который перебираем
int i,j;

 for(i=0;i<k;i++)
  for(j=0;j<l;j++)
   massiv[matrix[i,j]]++;

for(i=0;i<n;i++)
  if (massiv[i]>1) //значит число i повторяется больше одного раза.
Аватара пользователя
Alex_Burn
Сообщения: 147
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

Спасибо за подсказку.
Но почему-то в строке massiv[matrix[i,j]]++; пишет ошибку "индекс за границами массива". Что бы это значило?
F-R-O-S-T
Сообщения: 29
Зарегистрирован: 01 июл 2008, 16:09
Откуда: SPBi
Контактная информация:

А вы уверены что числа в массиве входят в дипазон от 0 до n-1? потому что ошибка именно в этом.
Аватара пользователя
Alex_Burn
Сообщения: 147
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

Пардон, с ошибкой разобрался. F-R-O-S-T, то есть ваш алгоритм работает только для матрицы с положительными элементами? а с отрицательными никак?
F-R-O-S-T
Сообщения: 29
Зарегистрирован: 01 июл 2008, 16:09
Откуда: SPBi
Контактная информация:

Можно и отрицательными , но тогда надо корректировать диапазон например:
Если диапазон от -10 до 10 тогда мы объявляем так :

Код: Выделить всё

int massiv[21] //Вспомогательный массив
int matrix[k][l] //Массив который перебираем
int i,j;

 for(i=0;i<k;i++)
  for(j=0;j<l;j++)
   massiv[matrix[i,j]+10]++;

for(i=0;i<21;i++)
  if (massiv[i]>1) //значит число i-10 повторяется больше одного раза.
п.с. это не мой алгоритм :)
Аватара пользователя
Alex_Burn
Сообщения: 147
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

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

Код: Выделить всё


for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
            {
                massive[matrix[i, j]+10]++;  
            }
        }

        bool find = false;
        j = 0;

        for (i = 0; i < 21; i++)
        {
            if (massive[i] > 1) { vektor[j] = i - 10; find = true; }
            j++;
        }

        int max = vektor[0];

        for (i = 0; i < m; i++)
        {
            if (vektor[i] > max) max = vektor[i];                
        }

        if (find) Console.WriteLine("Максимальное из чисел, повторяющихся более одного раза  " + max);
        else {Console.WriteLine("Элементов, повторяющихся более одного раза, нет");}

Но почему-то если искомых элементов нет, то выводится 0.

P. S. Хм... Что-то синтаксическая подсветка не работает.
F-R-O-S-T
Сообщения: 29
Зарегистрирован: 01 июл 2008, 16:09
Откуда: SPBi
Контактная информация:

1)
for (i = 0; i < 21; i++)
{
if (massive > 1) { vektor[j] = i - 10; find = true; }
j++;
}
Вы увеличивает j даже в любом случае , тоесть в вашем массиве vector будут 0 там где число
повторяется не больше 1 раза , а так как вы максимальное ищете именно в этом массиве , то
если не было повторяющихся элементов то максимальное число в этом массиве будет именно
0 и именно его он и выведет .
Если тебе роют яму - не мешай, закончат, сделаешь бассейн.
Аватара пользователя
Alex_Burn
Сообщения: 147
Зарегистрирован: 13 апр 2007, 17:49
Контактная информация:

Да я в принципе, понял это. Но проблема еще и в том, что даже если есть отрицательные элементы, повторяющиеся более одного раза, все равно выводится 0, потому что 0 в vektor все равно есть (т. к. я размерность беру с запасом). Можете поделиться мыслями по этому поводу?
F-R-O-S-T
Сообщения: 29
Зарегистрирован: 01 июл 2008, 16:09
Откуда: SPBi
Контактная информация:

сделайте так:

Код: Выделить всё

bool find = false;
        j = 0;

        for (i = 0; i < 21; i++)
            if (massive[i] > 1) { vektor[j] = i - 10; find = true; j++ }
           

        int max = vektor[0]; // эта строчка нужна только если j больше 0
        //а поиск будет производится если были числа которые повторялись более одного раза
        for (i = 0; i < j ; i++)
        {
            if (vektor[i] > max) max = vektor[i];                
        }
тогда будем искать только среди чисел которые повторялись более одного раза и если
среди них будет 0 значит он повторялся два раза и если остальные числа отрицательные
то 0 наш ответ :)
Если тебе роют яму - не мешай, закончат, сделаешь бассейн.
Ответить