Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск уникальных значений 
:(
    Опции темы
Mormishka
Дата 23.5.2012, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Имеются массив размера n, каждый элемент, которого состоят из m чисел типа double. n может быть очень большим, около 10^7. m от 2 до 5. Нужно создать уникальный массив, не содержащий повторяющие элементы.  
Пробовал сделать прямым способом добавлять в лист проверяя есть ли там этот элемент. Но даже при распараллеривании на 12 потоков выходит очень долго времени ждать. Есть ли какие-какие нибудь способы ускорить расчет ?
PM MAIL   Вверх
Voyager
Дата 24.5.2012, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно попробовать использовать Dictionary, где значения будут ключами dict[a[i]] = 0; на выходе получите уникальную коллекцию элементов в ключах.
PM   Вверх
agitprop
Дата 24.5.2012, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Dictionaty так же захлебнется.

задача непростая. 
скажу сразу - тут лучше выйти за рамки C#, потому что C# не поддерживает то, что я предложу.

насчет самого алгоритма:
можно попробовать использовать индекс для этого дела. 
double - 8 байт. разбить их на четыре группы-ключа, 2+2+2+2. Тут возможны варианты, но мне так кажется самым правильным. 
делаете массив массивов массивов массивов.
размер первого - 2^16 массива, каждый элемент - это тоже массив размером 2^16, который в свою очередь содержит массивы 2^16, чего бы вы думали? правильно, массив 2^16 boolean-ов. 
(можно оптимизировать, и уменшить в 8 раз за счет использовтания не boolean как boolean, а байта полностью, но это надо думать получше. )

как проверить наличие числа?
берете первые 2 байта, смотрите по ключу, если есть такой массив, в нем смотрите по ключу из 3-4 байтов вашего числа, потом в нем по 5-6 байтам, и в нем уже по 7-8. 

памяти отожрет, конечно, немеряно, зато будет быстро.

Это сообщение отредактировал(а) agitprop - 24.5.2012, 14:34
PM MAIL   Вверх
Ch0bits
Дата 24.5.2012, 21:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Цитата(Mormishka @  23.5.2012,  13:07 Найти цитируемый пост)
Нужно создать уникальный массив, не содержащий повторяющие элементы.

А что с повторяющимися элементами? Выкинуть их?

Думаю решение тривиально. Немного модифицировать merge sort. Делим массив на куски помещающиеся в оперативку, сортируем tim sort и  пишем в файлы. Затем сливаем файлы не допуская дубликаты. Потянет любой компьютер даже при космическом размере n, лишь бы места на диске хватило.  smile 

Это сообщение отредактировал(а) Ch0bits - 24.5.2012, 21:59
PM WWW   Вверх
Mormishka
Дата 25.5.2012, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ch0bits
С повторяющимися  элементами ничего делать не надо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


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

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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