Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление серии одинаковых элементов матрицы, Алгоритм удаления одинаковых элементов 
:(
    Опции темы
NAGGANO
Дата 5.5.2012, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.10.2010
Где: Донецк

Репутация: нет
Всего: нет



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

1 0 0 1 1 1
1 1 1 0 0 0
1 2 2 1 1 0
1 0 1 0 1 0
1 1 1 1 0 0
0 2 2 2 2 2

Надо пройтись по матрице и удалить одинаковые элементы, количество которых в строке ( или столбце ) больше 3.
То есть, я как думаю, надо пройтись по матрице и как-то запомнить все подряд идущие элементы и в конце их все удалить. Но никак не могу придумать алгоритм. Помогите пожалуйста!
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.5.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Что должно остаться после удаления? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Akina
Дата 5.5.2012, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Код

count=0
prev=mass(1)
pointer=0
for i = 1 to N
  if mass(i)=prev then
    count=count+1
    if count<3 then
      pointer=pointer+1
    end if
  else
    prev=mass(i)
    count=1
    pointer=pointer+1
  end if
  mass(pointer)=mass(i)
next



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
NAGGANO
Дата 5.5.2012, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.10.2010
Где: Донецк

Репутация: нет
Всего: нет



Можно удаляемые просто на null (n) заменить. Например, получится должно так:

n 0 0 n n n
n n n n n n
n 2 2 1 1 n
n 0 1 0 1 n
n n n n 0 n
0 n n n n n

Добавлено через 3 минуты и 7 секунд
Цитата(Akina @ 5.5.2012,  18:49)
Код

count=0
prev=mass(1)
pointer=0
for i = 1 to N
  if mass(i)=prev then
    count=count+1
    if count<3 then
      pointer=pointer+1
    end if
  else
    prev=mass(i)
    count=1
    pointer=pointer+1
  end if
  mass(pointer)=mass(i)
next

Это ж для одномерного массива, а мне для матрицы надо
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.5.2012, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Матрицы то какого размера? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
NAGGANO
Дата 5.5.2012, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.10.2010
Где: Донецк

Репутация: нет
Всего: нет



Ну как в примере, например, 6х6 размер.
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.5.2012, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Ну в общем вы никаких ограничений на сложность алгоритма не поставили. Почему бы тогда не реализовать простейший перебор всех элементов (сложность будет О(N^2), N -- кол-во элементов матрицы)? На каком языке вы пишете?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
NAGGANO
Дата 5.5.2012, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.10.2010
Где: Донецк

Репутация: нет
Всего: нет



Мне кажется слишком уж фпс нервничать будет - в двойном цикле еще вложенных два цикла. Пишу на Actionscript 3.0
Возможно если обойтись только тремя циклами то нормально будет:
Код

for ( var i:int = 0; i < 6; i++ )
{
    for ( var j:int = 0; j < 6; j++ )
    {
         for ( var k:int = 0; k < 6; k++ )
        {
            ....
        }
    }
}


Канешна очень так делать не хочется) Каждый элемент в матрице - это объект класса. Может как-то сделать, чтобы каждый элемент смотрел, что возле него есть такой, как он и говорил это главному классу, который потом бы обрабатывал эти данные. Вот не знаю как сделать лучше(
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.5.2012, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



Преждевременная оптимизация -- зло)
Реализуйте простейший вариант, будет тормозить тогда уже надо думать как оптимизировать. 

Для перебора потребуется 36^2 сравнений. Если сравнение двух объектов вашей матрицы операция быстрая (можно сравнивать указатели или хеши для сложных объектов), то 1300 сравнений это немного. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
NAGGANO
Дата 5.5.2012, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.10.2010
Где: Донецк

Репутация: нет
Всего: нет



У меня вообще в игре матрица 10х10 smile
Ну попробую сделать сейчас такой перебор - может сильно и не будет тормозить)
Но если есть еще какие-нить предложения - очень жду)
PM MAIL ICQ   Вверх
W4FhLF
Дата 5.5.2012, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 5
Всего: 121



А сколько возможных состояний может принять каждый элемент матрицы? 
Если число небольшое, то можно хранить количество объектов определённого значения в каждой строке и столбце и обновлять эти значения при добавлении/удалении объекта. Когда понадобится выполнить замену всех элементов встречающихся более трёх раз вы уже будете знать какие элементы в каких строках и столбцах надо заменить.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
NAGGANO
  Дата 5.5.2012, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 21.10.2010
Где: Донецк

Репутация: нет
Всего: нет



Он может либо существовать либо нет. Других состояний нет.У него есть переменная type - и вот именно эти поля мне и надо сравнивать.
Спасибо за идею - опробую и ее smile 

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1133 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.