Если стоит задача только обнаружить небольшое количество повторяющихся чисел, то можно обойтись и без сортировки, но за два прохода по исходному массиву. Придумываем хеш-функцию (например остаток от деления на простое втрое большее количества чисел), проходим по массиву и увеличиваем число встреч числа с данным значением хеш-функции в отдельном массиве размера множества значений хеш-функции, при повторном проходе в Map добавляем только те элементы, которые встретились более одного раза, их будет лишь немногим больше реального количества повторяющихся строк (из-за коллизий хеш-функции).
Массив количества повторов можно попробовать объявить как vectorsmall, под gp32 его элементы всего по 4 байта.
Размер можно брать и менее чем втрое больше, даже и менее количества исходных чисел, но тогда растёт количество коллизий.
-- 02.05.2024, 15:23 --По поводу накладных расходов в Map под gp32:
Код:
? m=Map(); mapput(m,x="123456789012345678901234567890123456789012345",0); mapput(m,eval(x)+4,0); mapput(m,1,0);
? foreach(m,x, print(x[1][1],": bytes=",sizebyte(x)); );
123456789012345678901234567890123456789012349: bytes=76
123456789012345678901234567890123456789012345: bytes=100
1: bytes=60
? sizebyte(m)
%1 = 264
Т.е. длинное число заняло 76 байтов (не само число, а элемент Map), строка с таким же числом заняла 100 байтов, короткое число занимает 60 байтов, накладные расходы на саму Map составили 264-100-76-60=28 байтов. Так что преобразование строки в число позволяет засунуть в Map в 100/76=1.3 раза больше элементов.