|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
11.04.2009, 23:35 | #1 |
Пользователь
Регистрация: 29.10.2008
Сообщений: 20
|
удаление одинаковых элементов из массива
я их находил и обнулял
Код:
|
12.04.2009, 00:30 | #2 |
Пользователь
Регистрация: 11.04.2009
Сообщений: 23
|
Ты имеешь ввиду с последующим смещением элементов в лево? А какой тип массива?
|
12.04.2009, 00:42 | #3 |
Форумчанин
Регистрация: 12.05.2007
Сообщений: 373
|
для такого дела нада юзать динамические массивы.. и тогда алгоритм такой..
1) находим элемент который повторяется (его номер n); 2) смещаем все элементы массива начиная с n+1 до конца на 1 позицыю в лево (c[n]:=c[n+1]); 3) уменьшаем размер массива ( SetLength(c, Length(c)-1) );
Перемен! - требуют наши сердца. Перемен! - требуют наши глаза.
В нашем смехе и в наших слезах, И в пульсации вен: "Перемен!Мы ждем перемен!" |
12.04.2009, 00:46 | #4 |
Пользователь
Регистрация: 11.04.2009
Сообщений: 23
|
Согласен с Ntlegend. Увы в делфях не предусмотрена такая функция (удаление элемента с последующим смещением элементов).
P.S. Ну насколько я знаю не предусмотрена. |
13.04.2009, 13:36 | #5 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Зато есть чудесная процедура move которая смещает блок данных, соответственно место куда смещение идет заменяетмя новыми данными. )
I'm learning to live...
|
15.04.2009, 19:16 | #6 | |
Пользователь
Регистрация: 25.02.2009
Сообщений: 28
|
Цитата:
Такие функции могут иметь еще реализацию для типов с элементов>4 байт, когда есть отдельный массив ссылок(4 байтных например) на каждый элемент вашего. Тогда все операции перемещений уже с этим массивом ссылок. А основной массив неизменен. Это может быть выгодно когда его размер на порядок больше размера массива ссылок. А по алгоритму - копировать надо не все элементы полсле каждого удаления(например всего при 1000000 элементов(Integer) для удаления среди первых 10000 придётся перемещать около 40 ГГб). А сделать примерно так: 1.Находим повторяющийся, запоминаем его номер 2.Находим следующий повторяющийся или достигаем конца =текущий, и копируем от запомненного номера до текущего. 3.Если конец не достигнут, то перехоим к п.2 Тогда перемещать придётся объем данных равный размеру вашего массива. Выполняемый цикл из кеша будет однозначно работать быстрей, чем скорость обмена с памятью. Последний раз редактировалось CahekG; 15.04.2009 в 19:23. |
|
15.04.2009, 21:27 | #7 |
Пользователь
Регистрация: 11.04.2009
Сообщений: 23
|
Согласен, еще можно вставить ассемлеровские вставки, чем увеличить скорость выполнения функции.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вывод элементов массива.Изменение элементов массива. | 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 |