Удаление дубликатов из массива

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Удаление дубликатов из массива

Сообщение xolod » 05.04.2005 (Вт) 14:24

Вот столкнулся с проблемой. Нужен более оптимальный, чем мой алгоритм удаление элементов из массива.
На данный момент удаляю самым "дубовым" способом:
1) Создаю цикл в цикле, в первом прохожусь по всем элементам, во втором, прохожусь по всем элементам начиная с элемента больше на 1, чем в первом цикле и сравниваю. Если одинаковые - помечаю их к удалению.
2) Удаляю все помеченные элементы в цикле

Алгоритм тупой, но на ум приходят только еще более глупые реализации.
Что посоветуете?

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 05.04.2005 (Вт) 14:29

А что у тебя в массиве? Если элементы можно сравнивать (в смысле, "больше - меньше"), проще отсортировать и дальше проверять только соседние элементы.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.04.2005 (Вт) 14:41

Элементы строковые, переменной длины.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

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

Сообщение alibek » 05.04.2005 (Вт) 14:51

Ничего более оптимального, чем обработка сортированного массива, я не знаю. Лучше всего изначально сортировать массив, тогда накладные расходы на сортировку будут очень маленькими.
Lasciate ogni speranza, voi ch'entrate.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 05.04.2005 (Вт) 14:57

Ну, по идее, в некоторых задачках еще более эффективно хранение массивов в виде дерева... Но я что-то не уверен, что здесь это в тему...

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.04.2005 (Вт) 14:59

Дело в том, что отсортированный массив теряет актуальность. Мне важно сохранять порядок данных.
Забил бы на это дело, сославшись на специфичность задачи и невозможность реализации. Но в foobar2k из массива в 5000 элементов удаляются дубликаты за 2-3 секунды.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 05.04.2005 (Вт) 15:06

А если создать еще один массив, отсортировать его и уже в отсортированном искать совпадения - так поможет? Или создать допустим двумерный массив, первое поле - оригинальный номер, второе - строка из оригинального массива. Сортируешь, затем по номеру находишь задвоенные записи и...
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 05.04.2005 (Вт) 15:06

Сортируй не массив, а индекс. И изначальный порядок сохранишь, и сортированный список будет.
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 05.04.2005 (Вт) 15:07

alibek, я так понял что человек имеет дело с массивом, а не с БД? Разве у массивов есть индекс?
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.04.2005 (Вт) 15:11

2 ZlydenGL
Ты не понял задачи. Создам отсортиртированный массив (допустим, QuickSort'ом, уже даже это долго), удалю дубликаты. Как я потом узнаю, в каком порядке они были до сортировки/удаления?
Второй вариант вообще не из той области. Многомерные массивы VB - тормоз страшнейший.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 05.04.2005 (Вт) 15:19

Все же еще зависит от размерности массива. "Тупой" алгоритм требует время порядка N*N, быстрые сортировки - N*ln(N) (Quicksort, кстати, если я правильно помню, требует в худшем случае как раз N*N :) ), но есть еще фиксированные временные издержки на создание доп. массива. При не очень больших размерностях "тупой" алгоритм может оказаться самым быстрым...

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 05.04.2005 (Вт) 15:19

xolod, то есть как? Допустим ты обнаружил что строковая переменная "Здесь был Вася" в твоем массиве повторяется. Скользишь по своему ОРИГИНАЛЬНОМУ массиву и после первого нахождения этой фразы остальные совпадения удаляешь - не вариант?

Многомерные массивы... Могу только сказать (на своем опыте) что двумерный массив (10000х2) обрабатывается (по части сортировки) секунд за пять максимум - у меня 1.6 Гц и 1 Гб могзов. Массив как раз строковый.

Но если уж жаться на двумерный массив... Используй одномерный, а оригинальный номер сохрани где-нить допустим в конце переменной. Допустим в переменной хранится та же фраза "Здесь был Вася", оригинальный номер ее 256... Ну и запихни ее в массив как "Здесь был Вася {256}" и сравнивай только то, что идет ДО фигурных скобок.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 05.04.2005 (Вт) 16:02

А зачем вообще многомерный массив?
Создаешь массив idx(), в котором хранятся ссылки на номер элемента в основном массиве.
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 05.04.2005 (Вт) 16:03

alibek, что я и предлагал выше :lol:
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

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

Сообщение alibek » 05.04.2005 (Вт) 16:05

Не совсем. Операции со строками отнимут любые преимущества сортированного массива, надо использовать именно отдельный индексный массив. Вдобавок, ты предлагаешь физически переупорядочить элементы (хотя изначальный порядок и можно восстановить). Чтобы отобразить список в первоначальном порядке, потребуется много машинного времени.
Lasciate ogni speranza, voi ch'entrate.

kif
Постоялец
Постоялец
 
Сообщения: 736
Зарегистрирован: 10.12.2001 (Пн) 18:06
Откуда: Украина, Одесса

Сообщение kif » 05.04.2005 (Вт) 17:02

может, если это возможно в данной задаче, контролировать дубликаты при добавлении элементов в массив :?:
Братья и сестры, что вы делаете???
Ведь вы же братья и сестры.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.04.2005 (Вт) 17:07

(c) "Всем спасибо, все свободны"
Задача решена.
Написал библиотеку на MSVC, в STL::Algorithm есть возможность удаления дубликатов из массивов. Не знаю, как он там что делает, но скорость на высшем уровне :)

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 05.04.2005 (Вт) 17:08

2 kif
Представь себе добавление элемента 6740. Будешь бегать по всему массиву с вопросом, есть элемент или нет? :)

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

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

Сообщение alibek » 05.04.2005 (Вт) 17:10

Опять таки, при сортированном массиве проверить наличие элемента в массиве из 6000 записей займет максимум 8 (9) итераций.
Lasciate ogni speranza, voi ch'entrate.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 05.04.2005 (Вт) 18:01

а тут ничё не придумаешь, единственно, помечать не надо, надо сразу удалять, дабы последующие проходы не трафили время на помеченный элемент.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru


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

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

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

    TopList