![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Имеются массив размера n, каждый элемент, которого состоят из m чисел типа double. n может быть очень большим, около 10^7. m от 2 до 5. Нужно создать уникальный массив, не содержащий повторяющие элементы.
Пробовал сделать прямым способом добавлять в лист проверяя есть ли там этот элемент. Но даже при распараллеривании на 12 потоков выходит очень долго времени ждать. Есть ли какие-какие нибудь способы ускорить расчет ? |
|||
|
||||
Voyager |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 532 Регистрация: 8.2.2005 Репутация: 3 Всего: 18 |
Можно попробовать использовать Dictionary, где значения будут ключами dict[a[i]] = 0; на выходе получите уникальную коллекцию элементов в ключах.
|
|||
|
||||
agitprop |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: 9 Всего: 62 |
А что с повторяющимися элементами? Выкинуть их? Думаю решение тривиально. Немного модифицировать merge sort. Делим массив на куски помещающиеся в оперативку, сортируем tim sort и пишем в файлы. Затем сливаем файлы не допуская дубликаты. Потянет любой компьютер даже при космическом размере n, лишь бы места на диске хватило. ![]() Это сообщение отредактировал(а) Ch0bits - 24.5.2012, 21:59 |
|||
|
||||
Mormishka |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Ch0bits
С повторяющимися элементами ничего делать не надо. |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |