[Ответить в тред] Ответить в тред

16/08/16 - Запущен Двач Трекер
01/08/16 - Вернули возможность создавать юзердоски
09/07/16 - Новое API для капчи - внимание разработчикам приложений



Новые доски: /obr/ - Offline Battle Rap • /hv/ - Халява в интернете • /2d/ - Аниме/Беседка • /wwe/ - WorldWide Wrestling Universe • /ch/ - Чатики и конфочки • Создай свою

[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 75 | 6 | 32
Назад Вниз Каталог Обновить

ПЫХЫПЫ Обезьяны проходят мимо. Осторожно! Алгоритмические задачи. Аноним 20/08/16 Суб 01:23:13  823606  
14716453934180.jpg (376Кб, 1600x900)
Итак мамкины погромисты. Есть n отсортированных массивов 32-битных интов, достаточно большого размера. Как их наиболее эффективно слить в один отсортированный массив, используя по возможности O(1) памяти, приоритет в скорости работы алгоритма. Жду ваших решений. Язык С++.
Аноним 20/08/16 Суб 02:17:18  823622
>>823606 (OP)
>достаточно большого размера
Достаточно для чего?
Аноним 20/08/16 Суб 02:21:08  823624
>>823622
Достаточно для того чтобы пхп-обезьяным, которые переспрашивают элементарные COMPUTER SCIENCE вещи, шли мимо.
Аноним 20/08/16 Суб 02:22:26  823625
>>823606 (OP)
Сливай как есть и потом сортируй
Аноним 20/08/16 Суб 02:26:16  823626
Почему-то только петушиной (chiken) схеме есть foldr из коробки.

https://ideone.com/pMRc78
Аноним 20/08/16 Суб 02:27:21  823627
>>823624
Слыш ты потише будь в этой категории.
Аноним 20/08/16 Суб 02:32:16  823628
>>823606 (OP)
слушай сюда внимательно.

Заводишь массив длинной равный количеству сортируемых массивов умножить на их количество элементов. И чтобы там были одни нулики.

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

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

Соответственно это будет возврастающая сортировка, для убывающей рассматриваешь индексацию относительно конца массива как нулевого элемента.

Я бы мог тебе написать алгоритм, но ты выебываешься, поэтому лучше я пошлю тебя на хуй, кек.
Аноним 20/08/16 Суб 02:43:26  823629
Ничего умнее того, чтобы в каком-то порядке все эти массивы склеить, думаю придумать нельзя. Только нужно оптимально выбрать этот порядок: на каждом шаге будем брать два массива с наименьшими из присутствующих размеров и склеивать(функция merge, но в плане O(1) памяти, если это так критично, может найдешь нужный метод здесь http://www.dcs.kcl.ac.uk/technical-reports/papers/TR-04-05.pdf, написать тогда придется естественно самому). Реализовать для наибольшей скорости можно так: пусть мы храним какую-нибудь heap из этих массивов(можно set, но по времени лишний логарифм), в качестве ключа размер массива, в корне элемент с минимальным ключом. На каждом шаге достаем из корня пирамиды элемент, затем второй, склеиваем их и добавляем обратно в пирамиду, и все это продолжаем пока не останется один элемент, который будет результатом.
Аноним 20/08/16 Суб 02:44:20  823630
>>823627
>>823625
Мы подумаем и вам перезвоним.

>>823628
> O(1) памяти
> Заводишь массив длинной равный количеству сортируемых массивов умножить на их количество элементов
Мы подумаем и вам перезвоним.

Аноним 20/08/16 Суб 02:46:45  823632
>>823606 (OP)
http://pastebin.com/8RKChWHA
только для 32-бит интов
</thread>
Аноним 20/08/16 Суб 02:47:33  823633
>>823632
Уноси отсюда свое вырвиглазное говно, ебаный олимпиадник.
Аноним 20/08/16 Суб 02:53:55  823634
Байтоебы с некомпозабельными структурами данных в очередной раз борются с уебищностью своего недоязыка.
Аноним 20/08/16 Суб 02:54:35  823635
>>823633
Но если моего вырвиглазного гавна не будет, то ты пойдешь работать на завод с 6 утра, и не будешь говнокодить на пхп........
Аноним 20/08/16 Суб 02:56:05  823636
>>823634
:) и попивают кристал на берегу западного побережья
Аноним 20/08/16 Суб 02:57:07  823637
>>823636
Потреблядство для быдла, а мне и за ноутом со слакой заебись.
Аноним 20/08/16 Суб 03:03:13  823640
14716513940950.jpg (44Кб, 299x260)
>>823637
Аноним 20/08/16 Суб 03:10:25  823642
>>823606 (OP)
>Есть n отсортированных массивов 32-битных интов

массивы read-only или можно модифицировать?
Аноним 20/08/16 Суб 04:37:07  823653
Самый тупой алгоритм даёт O(n) памяти и столько же скорость работы (где n - кол-во элементов во всех массивах). Куда уж эффективней?
Аноним 20/08/16 Суб 06:46:04  823665
>>823630
>Мы подумаем и вам перезвоним.
ПоХаПе манька даже и не знает, что такое О(1), лул.
Аноним 20/08/16 Суб 07:33:55  823672
>>823606 (OP)
Модифицируй сортировку слиянием. /тред
Аноним 20/08/16 Суб 07:37:06  823674
>>823672
А вообще ОП даун. Круче метод не придумаешь
Аноним 20/08/16 Суб 10:01:44  823703
Пиздец, чмошу опустили на собеседовании, а он теперь тут пытается чет узнать. Найс трай, алсо любое пхпбыдло будет получше такого чсв скама как ты.
Аноним 20/08/16 Суб 10:06:28  823704
>>823653
>>823606 (OP)
Минимальная сложность у такого алгоритма будет O(nln(n)) иначе вы решили бы задачу сортировки на O(1)

Т.е имея массивы [[17],[11],[47],[23],[0]] вы не сможете создать новый, отсортированный быстрее чем за О(n*ln(n))
Аноним 20/08/16 Суб 11:17:19  823730
>>823704
Используя дополнительные данные задачи (там инты 32-битные) можно решить быстрее.
Аноним # OP  20/08/16 Суб 11:45:49  823741
>>823628
Ты мне предлагаешь решение за О(n) доп. памяти и среднем временем работы n log n? А теперь представь что у нас 256 массивов по 1гб каждыйдопустим мы все это делаем в памяти, хотя на деле я подгружаю части из этих чанков в массиве равномерно распределенные 32 битные инты, то есть твой алгоритм превращается в говно и работает не лучше других известных мне, а то и хуже.

>>823629
>>823632
>>823672
В общем, я пробовал слудующие алгоритмы:
- Слияние через очередь с приоритетом
- Различные варианты сортировки k слитых массивов в один ( quicksort, merge sort, msd/lsd radix sort, in-place heap sort ) все они дают не достаточную скорость работы и основанны на тупой сортировке уже отсортированных массивов. Хотя распаралеливание merge sort дает чуть лучшие результаты, но требует доп. O(n) памяти.

Так же пробовал стандартные std::inplace_merge, и распаралеленные варианты с divide-and-conquer алгоритмом.

Все это работает не так быстро как хотелось бы.

>>823704
Двачую. Но вообще теоритически можно за O(n*log(k)) где k - кол-во массивов, через очередь с приоритетом, дело в том что при больших k операции вставки и удаление в очередь становятся слишком дорогостоищими.
Аноним 20/08/16 Суб 11:49:17  823744
>>823730
Может и можно быстрее, но за О(1) по времени отсортировать нельзя, ОП нас наебывает.
Аноним 20/08/16 Суб 12:06:29  823751
>>823741
Слияние будет работать за n * Σ, где n - кол-во массивов, а Σ - суммарное кол-во элементов
Аноним 20/08/16 Суб 12:07:15  823753
14716840353970.gif (900Кб, 500x280)
>>823741
Есть K массивов размером N.
Сортируем каждый из них за KN log N.
Создаём PriorityQueue размером K и заполняем её структурами состоящими из ссылки на массив и текущего указателя в массиве, по которому происходит сравнение структур.
Достаём минимальную структуру из PQ, кладём в новый KN массив элемент по указателю из структуры, увеличиваем указатель на 1 и если он не покинул массив, то кладём структуру обратно в PQ.
Повторяем до истощения PQ (K^2 N log K)

ИТОГО: O(KN(log N + K log K))
О(NK log K), если массивы уже отсортированы
Аноним 20/08/16 Суб 12:09:17  823755
>>823753
>О(K^2 N log K)
fix
Аноним 20/08/16 Суб 12:09:51  823757
А вообще у тебя просто промежуточный этап сортировки слиянием. Ничего круче, чем закончить эту сортировку тем же слиянием не придумаешь. Мое скромное мнение
Аноним # OP  20/08/16 Суб 12:11:21  823758
>>823753
Ты читал, что я написал вообще?
>Достаём минимальную структуру из PQ
>кладём структуру обратно в PQ
Я говорю при больших K этот алгоритм уступает банальным сортировкам, потому что аперации удаления/вставки из кучи занимают суммарно слишком много времени.
Аноним 20/08/16 Суб 12:14:33  823759
>>823758
>O(log n) performance for inserts and removals
Не шибко-то много я полагаю.
Аноним # OP  20/08/16 Суб 12:16:49  823760
>>823759
Асимптотика тут обманчива. На деле, в профайлере, в такой сортировке, такие операции занимают до 50% общего времени сортировки.
Аноним # OP  20/08/16 Суб 12:18:18  823762
>>823760
add. при большом кол-ве К.
Аноним 20/08/16 Суб 12:20:26  823763
>>823606 (OP)
Битоническое слияние.
Аноним 20/08/16 Суб 12:22:50  823764
>>823760
Может ты через жопу реализовал, кто ж тебя знает.
Вот тут аналогичный подход использован:
http://stackoverflow.com/a/37944473/6112474
Аноним 20/08/16 Суб 12:23:00  823765
>>823744
Он просит O(1) по памяти. Правда, решения, опережающие O(n*log(n)) будут прожорливые по памяти очень.
Аноним # OP  20/08/16 Суб 12:41:00  823776
>>823763
Я уже думал в эту сторону, попробовать задействовать GPU. Если у нас в оперативной памяти будет дополнительный буффер размером с буффер в памяти GPU, то это подходит по заданным критериям по расходу памяти.

>>823764
Вот мой http://pastebin.com/4Yg4SFZb
Все просто, Есть класс FileChunk - ck который постепенно подгружает k-файл с отсортированными данными, мы вставляем его в PQ где сравнивается указатель на текущее значение в чанке, и помещается в top наименьшее т.к. у нас min-heap затем это наименьшее вытаскивается из PQ ( что занимает дохуя времени, когда у нас много чанков ) и кладется в буффер, который потом записывается на диск по достижению лимита, затем указатель в чанке инкрементируется на след. значение и почещается обратно в PQ, если мы достигли конца файла и больше данных в чанке нет, мы просто пропускаем шаг вставки обратно в очередь, и вся эта байда длится пока очередь не окажется пустой.
Аноним 20/08/16 Суб 13:27:02  823810
14716888225480.jpg (27Кб, 704x528)
>>823776
> Я уже думал в эту сторону, попробовать задействовать GPU
Соснёшь 100% с проглотом, сортировка это синоним GPU-непригодного алгоритма. Только если гранты мелкие пилить на публикациях в этом направлении.
Не забывай постить в тред отчёты о прогрессе.
Аноним 20/08/16 Суб 13:59:52  823831
>>823606 (OP)
external bucket merge sort
Аноним 20/08/16 Суб 14:10:37  823843
>>823703
>Пиздец, чмошу опустили на собеседовании, а он теперь тут пытается чет узнать
/thread
Переходим в тред обсуждения кластеров метапарадигм.
Аноним 20/08/16 Суб 15:11:41  823883
Алгоритмоебы, объясните, почему однопоточный merge sort сортирует 100 000 элементов быстрее, чем многопоточный?
49 мс (однопоточный) против 1000 мс (многопоточный)
Аноним 20/08/16 Суб 15:11:58  823884
>>823883
Забыл код.
https://ideone.com/jALSNb
Аноним 20/08/16 Суб 15:34:29  823891
>>823884
Двачую, что у тебя 2 ядра. Тебе доступно 1 и ты НА ОДНОМ ЯДРЕ ПИШИШЬ МНОГОПОТОЧНОСТЬ!!!!!!
Аноним 20/08/16 Суб 15:35:02  823892
>>823884
>WINAPI
Аноним 20/08/16 Суб 15:52:12  823898
>>823884
Код не изучал, возможно криво реализована синхронизация, либо у тебя потоков намного больше чем вычислительных ядер, что создает задержку на переключение контекста процессора.
Аноним 20/08/16 Суб 16:12:59  823912
>>823898
Удали, слышь. Олимпиадники умеют только гавно на паскале писать. Какое переключение контекста. Ты что ИНЖЕНЕР???
Аноним 20/08/16 Суб 17:35:48  823971
>>823606 (OP)
Ты забыл указать цену, а вообще можно решить за O(nk), как было сказано выше.
Аноним # OP  20/08/16 Суб 20:14:11  824084
>>823763
Хуйня это битоническое слияние, распаралелленая версия с помощью Intel TBB которая загружает все 8 ядер моего i7 4770k, работает в дохуища раз медленнее обычного паралельного merge sort'a. Если и реализовать его, то на GPU.

>>823971
С меня как всегда нихуя же. Решение за O(nk) это какое именно?
Аноним # OP  20/08/16 Суб 20:22:43  824093
Короче? пока тупая повторная сортировка в лоб с помощью tbb::parallel_sort работает быстрее всех.
Аноним 20/08/16 Суб 21:53:09  824168
>>824084
O(nk) - тупо сливать
Аноним 20/08/16 Суб 22:27:11  824207
>>823606 (OP)
Что значит O(1) памяти? Где хранить результат?
Аноним 20/08/16 Суб 22:41:29  824221
>>823630
сажа скрыл
Аноним 20/08/16 Суб 23:01:17  824244
>>823606 (OP)
Ты сначала сравни диапазоны у массивов, сливать надо только те, у которых диапазоны пересекаются. Потому бинарным поиском ищещь с какого по какой элемент делать слияние, их и мерджишь.
Аноним # OP  22/08/16 Пнд 22:58:41  825412
Короче решил заюзать SIMD инструкции для параллельного мерджа щас колупаюсь с SSE и AVX.
Аноним 22/08/16 Пнд 23:18:02  825425
>>825412
> заюзать SIMD
у тебя мемори-баунд! у тебя памяти не хватает на всё. какое саймди
Аноним 22/08/16 Пнд 23:45:39  825433
Накидайте манов по SIMD мне за щеку, хочу разобраться в этом.
Аноним # OP  22/08/16 Пнд 23:48:02  825434
>>825425
Так при чем здесь память? Я юзаю 256 битные регисты для мерджа, их так же можно заюзать в in-place алгоритме.
Аноним # OP  22/08/16 Пнд 23:48:39  825435
>>825433
https://software.intel.com/sites/landingpage/IntrinsicsGuide/
Аноним # OP  22/08/16 Пнд 23:51:39  825436
Вообще еще в планах написать сортировку на SIMD, сейчас изучаю сортировочные сети и как их лучше заюзать с SIMD и распаралелить.
Аноним # OP  23/08/16 Втр 01:22:42  825457
Принес первые результаты моего simd мерджа по сравнению с стл.

-sequential_simd_merge has finished for 10.4963 sec.
-std::merge has finished for 26.8874 sec.

То есть, мы получаем х2.6 увелечение производительности по сравнению с стл мерджем. Для начала не плохо, еще есть место для оптимизации и распараллеливания.
Аноним 23/08/16 Втр 01:59:38  825461
>>825457
>SIMD
Покажи код.
Аноним 23/08/16 Втр 02:03:46  825462
>>823884
Что там thread_L в оба _beginthread передается, так и должно?

Код не смог запустить, если что. О приведении указателей ругается.
Аноним 23/08/16 Втр 02:16:39  825468
14719077990550.png (75Кб, 1427x1126)
14719077990561.jpg (17Кб, 472x472)
>>823884
Аноним 23/08/16 Втр 02:26:47  825476
>>823741
ОП-хуй, если у тебя 256 массивов по 1гб, то решение вот этого господина >>823628 лучшее. Тебе потребуется всего 4гб памяти при условии равномерного распределения чисел.

Эта хуйня, кстати элементарно пилится на gpu при наличии достаточного количества памяти.

Так же хочу тебе сказать, что ты слишком много выёбываешься для своего уровня знаний.
Аноним 23/08/16 Втр 02:36:30  825484
>>824207
Видать оп сразу на винт хочет хуйарить
Аноним 23/08/16 Втр 02:38:41  825485
14719091211870.jpg (39Кб, 600x756)
>>823606 (OP)
>>823606 (OP)
Для того чтобы просто склеить n массивов в один большой
>используя по возможности O(1) памяти
надо будет сделать дохуя реаллокейтов, что убьёт производительность.
Как ты собираешься решать эту проблему?

Скорее всего столкнувшись с этим ты пойдёшь на компромис в плане использования дополнительной памяти, а значит и ограничения на O(1) для сортировки надуманы.

Кстати, скажи, ты сильно преувеличивал, когда писал про
>А теперь представь что у нас 256 массивов по 1гб каждый
?
При таких объёмах можно создать массив, в котором будут храниться тупо количества вхождений каждого возможного инта. Я бы сделал массив из 2^32 байтов (4 гб), и мапу для случаев переполнения байтов.
Если твои объёмы данных позволяют такое, то ничего эффективнее не придумаешь.
Аноним 23/08/16 Втр 02:39:09  825486
>>823606 (OP)
>Есть n отсортированных массивов 32-битных интов
>Как их наиболее эффективно слить в один отсортированный массив,
Проходишь по первому и последнему элементу каждого массива, сортируешь любой удобной тебе сортировкой, сливаешь. Памяти минимум (если ты не даун, который все массивы будет в память загонять), скорость работы в приоритете.
/thread
Аноним 23/08/16 Втр 02:39:29  825487
>>825485
Бля, опоздал.
Аноним 23/08/16 Втр 02:53:08  825495
>>823741
Не выёбуйся, и делай как написал >>823628.

>Ты мне предлагаешь решение за О(n) доп. памяти
Нет, 4 гб это константа, то есть O(1).
>среднем временем работы n log n?
Нет, O(n).
>в массиве равномерно распределенные 32 битные инты
>256 массивов по 1гб
Идеальный случай. Значит каждое значение будет встречаться в среднем 16 раз. Отсортированный массив будет выглядеть примерно так:
-2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483648, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, -2147483647, ...
Аноним 23/08/16 Втр 02:57:22  825498
>>823883
Всё упирается в пропускную способность оперативки. Даже одного ядра достаточно, чтобы занять весь её канал на такое вычислительно простой операции как сравнение.
Добавление других ядер только портит кеш и добавляет нелокальности в обращения к оперативке.
Аноним 23/08/16 Втр 05:55:13  825517
>>823606 (OP)
>Осторожно! Алгоритмические задачи.
А на деле хуита.
Аноним # OP  23/08/16 Втр 22:16:14  826057
>>825461
Merge kernel сливает за пару циклов массив 8х8, использую его в гибридном DAC мердже.

http://pastebin.com/CbySfUv3

>>825476
>всего 4гб памяти
>>825495
Не на каждой машине есть 4гб лишней памяти, без учета того, что программа еще сама по себе какую-то память использует.
>>825485
О(1) памяти не значит что не использовать вообще дополнительную память, но 4гб это через чур, как мне предлагали выше с Counting Sort'ом.
>>825486
Диванные эксперты подъехали. Это был мой самый первый способ слияния, тупой пересортировкой по мелким блокам.

В общем-то, написание своего мерджа дало ~20 кратное увеличение производительности, что меня устраивает. Теперь все упирается в disk IO, для подгрузки и записи блоков, а из процессора я выжал максимум. При слияние, на моей машине, загружаются все 8 ядер на 100% + некоторое колдовство над организацией памяти дало нехилый выигрышь.
Аноним 24/08/16 Срд 06:35:02  826158
>>826057
>Это был мой самый первый способ слияния,
Ах, да, извините, я должен был прочитать ваши мысли и понять это.
> тупой пересортировкой по мелким блокам.
У тебя в условии уже есть пункт где массивы уже отсортированы. Стало быть тебе всего-то и надо составить в ряд кучку больших массивов.
Аноним 26/08/16 Птн 02:02:28  827464
>>823606 (OP)
Так что в итоге то? ОП обосрался?
Аноним 26/08/16 Птн 09:32:20  827538
>>824207
Очевидно, имеется в виду, что можно использовать только ту память, что уже занята исходными данными, плюс какой-то константный оверхед.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 75 | 6 | 32
Назад Вверх Каталог Обновить

Топ тредов
Избранное