Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.04.2009, 23:35   #1
sauron99
Пользователь
 
Регистрация: 29.10.2008
Сообщений: 20
По умолчанию удаление одинаковых элементов из массива

я их находил и обнулял
Код:
For k:=1 to realM+realN-1 do
For z:=k+1 to realM+realN do
If k<>z Then
If (c[k]=c[z]) and (c[k]>0) Then
begin
c[z]:=0;(** dublikat obnulyaetsya **)
end;
а как их удалить можно?
sauron99 вне форума Ответить с цитированием
Старый 12.04.2009, 00:30   #2
Warnes
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 23
По умолчанию

Ты имеешь ввиду с последующим смещением элементов в лево? А какой тип массива?
Warnes вне форума Ответить с цитированием
Старый 12.04.2009, 00:42   #3
Ntlegend
Форумчанин
 
Аватар для Ntlegend
 
Регистрация: 12.05.2007
Сообщений: 373
По умолчанию

для такого дела нада юзать динамические массивы.. и тогда алгоритм такой..
1) находим элемент который повторяется (его номер n);
2) смещаем все элементы массива начиная с n+1 до конца на 1 позицыю в лево (c[n]:=c[n+1]);
3) уменьшаем размер массива ( SetLength(c, Length(c)-1) );
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен:
"Перемен!Мы ждем перемен!"
Ntlegend вне форума Ответить с цитированием
Старый 12.04.2009, 00:46   #4
Warnes
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 23
По умолчанию

Согласен с Ntlegend. Увы в делфях не предусмотрена такая функция (удаление элемента с последующим смещением элементов).

P.S. Ну насколько я знаю не предусмотрена.
Warnes вне форума Ответить с цитированием
Старый 13.04.2009, 13:36   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Зато есть чудесная процедура move которая смещает блок данных, соответственно место куда смещение идет заменяетмя новыми данными. )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2009, 19:16   #6
CahekG
Пользователь
 
Регистрация: 25.02.2009
Сообщений: 28
Стрелка

Цитата:
Сообщение от Warnes Посмотреть сообщение
Согласен с Ntlegend. Увы в делфях не предусмотрена такая функция (удаление элемента с последующим смещением элементов).

P.S. Ну насколько я знаю не предусмотрена.
Если написать такую функцию самому, скорость её выполнения при использовании move = возможной скорости копирования памяти вашей ситемой и не один язык программирования не сделает этого быстрей, а только в лучшем случае так-же.

Такие функции могут иметь еще реализацию для типов с элементов>4 байт, когда есть отдельный массив ссылок(4 байтных например) на каждый элемент вашего. Тогда все операции перемещений уже с этим массивом ссылок. А основной массив неизменен.
Это может быть выгодно когда его размер на порядок больше размера массива ссылок.

А по алгоритму - копировать надо не все элементы полсле каждого удаления(например всего при 1000000 элементов(Integer) для удаления среди первых 10000 придётся перемещать около 40 ГГб).
А сделать примерно так:
1.Находим повторяющийся, запоминаем его номер
2.Находим следующий повторяющийся или достигаем конца =текущий, и копируем от запомненного номера до текущего.
3.Если конец не достигнут, то перехоим к п.2

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

Последний раз редактировалось CahekG; 15.04.2009 в 19:23.
CahekG вне форума Ответить с цитированием
Старый 15.04.2009, 21:27   #7
Warnes
Пользователь
 
Регистрация: 11.04.2009
Сообщений: 23
По умолчанию

Согласен, еще можно вставить ассемлеровские вставки, чем увеличить скорость выполнения функции.
Warnes вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод элементов массива.Изменение элементов массива. Vesnushka18 Помощь студентам 6 09.06.2011 13:05
поиск одинаковых элементов одномерного массива и их количества MyQwErTy Помощь студентам 2 28.02.2009 17:17
Поиск одинаковых элементов Expected } Общие вопросы C/C++ 0 08.01.2009 15:54
удаление одинаковых слов (С/С++) jewel Помощь студентам 1 12.12.2008 15:14
Удаление элементов из динамического массива dashulka Общие вопросы Delphi 4 31.10.2008 14:03