Удаление элементов массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
KPEATOP
Бывалый
Бывалый
 
Сообщения: 291
Зарегистрирован: 02.12.2002 (Пн) 16:33
Откуда: Russia

Удаление элементов массива

Сообщение KPEATOP » 24.09.2013 (Вт) 15:40

Имеется одномерный массив A(). Количество элементов массива очень большое, например 1000000. Мне нужно удалить из массива несколько элементов, например 200, 23000 и 345000. Можно конечно создать цикл от 1 до 1000000 и переставлять элементы. Может есть какой нибудь способ сделать это быстрее ? Подскажите кто знает. Заране сенкс.
Вечность пахнет нефтью

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.09.2013 (Вт) 15:53

KPEATOP писал(а):Может есть какой нибудь способ сделать это быстрее ?

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

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Удаление элементов массива

Сообщение Mikle » 24.09.2013 (Вт) 16:10

Qwertiy писал(а):Способа быстрее быть не может в принципе.

А CopyMemory?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.09.2013 (Вт) 16:11

Mikle писал(а):А CopyMemory?

Тот же цикл, только на аасемблере ;)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Удаление элементов массива

Сообщение Mikle » 24.09.2013 (Вт) 16:20

Там вполне может быть rep movsd, сомневаюсь, что компилятор VB6 до такой степени оптимизирует, даже если включить оптимизацию "не проверять выход за границы массивов".

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 24.09.2013 (Вт) 16:41

Ну и сколько ты на этом сэкономишь, особенно при том, что надо копировать не сесь массив, а куски?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Удаление элементов массива

Сообщение Mikle » 24.09.2013 (Вт) 18:45

Я как-то писал софт рендер на VB6. Сначала очистка экрана была циклом по массиву, когда заменил на очистку только первой строки, а затем построчно CopyMemory - получил выигрыш в разы.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Удаление элементов массива

Сообщение alibek » 24.09.2013 (Вт) 21:43

KPEATOP писал(а):Может есть какой нибудь способ сделать это быстрее ?

Используй не массивы, а списки.
Lasciate ogni speranza, voi ch'entrate.

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Re: Удаление элементов массива

Сообщение Wolfie » 06.10.2013 (Вс) 16:59

В порядке рассуждения... а действительно нужно именно уничтожать элемент массива?
Когда сталкиваюсь с такой проблемой, то для себя выбираю другую схему - можно ведь сохранять в уничтоженный элемент некий маркер, обозначающий, что элемент уничтожен, и в дальнейшем, при обращении к нему, переходить к следующему.
Для числовых массивов это может быть 0 или -1 (имею ввиду, то число, которое заведомо не встречается в элементах), для строк лучше всего было бы за маркер брать vbNullString...
Все это, конечно, меняет логику обращения с массивом и требует проверок, но лично для меня упрощает работу с массивом не тратя сил на перестановки...
Если массив долгоживущий и требуется дополнять его, то придется конечно в Add-процедуру вставить все же цикл, для поиска первого "несуществующего"... если требуется еще и знать сколько всего элементов в массиве (существующих), то то в Remove-процедуре и Add-процедуре понадобится увеличение\уменьшение некоего счетчика...

Но если задача именно стоит в уничтожении, то можно попробовать кроме предложенных выше способов еще и классы, и вот уже в коллекции классов уничтожать элемент set A(85)=Nothing... только проблему с определением величины такой коллекции и раздуванием массива при работе не решишь...

Т.е. все зависит от решаемой задачи - м.б. все же разумным будет и постоянная замена удаленного элемента последним... но последний элемент (пустой) будет существовать в качестве пустого, и понадобится переменная-счетчик все равно...

:cyclops: кажется я усложнил задачу нежели упростил, но тема мне показалось интересной
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

alex77755
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 97
Зарегистрирован: 24.03.2009 (Вт) 11:40

Re: Удаление элементов массива

Сообщение alex77755 » 06.10.2013 (Вс) 23:53

Может использовать словарь? Там можно удалять

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Удаление элементов массива

Сообщение Хакер » 07.10.2013 (Пн) 2:32

Wolfie писал(а):Но если задача именно стоит в уничтожении, то можно попробовать кроме предложенных выше способов еще и классы, и вот уже в коллекции классов уничтожать элемент set A(85)=Nothing... только проблему с определением величины такой коллекции и раздуванием массива при работе не решишь...

Совет глупый, потому что во-первых set A(85) = Nothing — это код, который не применим в отношении коллекций (если A — это коллекция), а во-вторых, коллекции объектов в десятки и сотни раз дороже массива. Изначальный вопрос стоит именно в эффективности. Коллекции не поддерживают массового удаления по критерию или диапазонного удаления, а итеративное удаление из миллион-элементной коллекции 23 тысяч значений — это будет супер-неэффективно и гипер-медленно. И в целом просто глупо. Потому что это как выбрасывать из дома кучку пыли, относя на помойку по одной пылинке за раз.

alex77755 писал(а):Может использовать словарь? Там можно удалять

Ты смотришь на задачу с позиции: я не знаю и даже ни малейшей идеи не имею, как написать удаление, но небожители создали словарь, который каким-то неведомым для меня образом поддерживает удаление.

А такая позиция никому (кроме тебя, разве что) в этой теме не интересна. Вопрос стоит о массовом и в то же время эффективном удалении элементов из массива/списка.

В правильную сторону уже направил alibek.

Правильное решение — блоковый список aka расширенный связный список или дерево.

Выбор подходящей структуры данных должен делаться на основе того, что это за данные и как в целом к ним осуществляется адресация.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 07.10.2013 (Пн) 9:39

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


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 25

    TopList