У меня есть несколько огромных массивов (миллионы ++ членов). Все это массивы чисел, и они не отсортированы (и я не могу этого сделать). Некоторые из них uint8_t
, некоторые uint16_t/32/64
. Я хотел бы аппроксимировать подсчет различных значений в этих массивах. Условия следующие:
- скорость ОЧЕНЬ важна, мне нужно сделать это за один проход через массив, и я должен пройти через нее последовательно (не могу прыгать назад и вперед) (я делаю это на С++, если это важно)
- Мне не нужны ТОЧНЫЕ счета. Я хочу знать, что если это массив uint32_t, если есть 10 или 20 различных чисел или есть тысячи или миллионы.
- У меня довольно много памяти, которую я могу использовать, но чем меньше используется, тем лучше
- Чем меньше тип данных массива, тем более точным я должен быть
- Я не против STL, но если я смогу сделать это без него, это будет здорово (без BOOST, хотя, извините)
- если подход можно легко распараллелить, это было бы здорово (но это не обязательное условие)
Примеры идеального вывода:
ArrayA [uint32_t, 3M members]: ~128 distinct values
ArrayB [uint32_t, 9M members]: 100000+ distinct values
ArrayC [uint8_t, 50K members]: 2-5 distinct values
ArrayD [uint8_t, 700K members]: 64+ distinct values
Я понимаю, что некоторые из ограничений могут показаться нелогичными, но так оно и есть. В качестве примечания я также хочу, чтобы верхние X (3 или 10) наиболее используемые и наименее используемые значения, но это намного проще сделать, и я могу сделать это самостоятельно. Однако, если у кого-то есть мысли для этого, не стесняйтесь делиться ими!
EDIT: немного разъяснений относительно STL. Если у вас есть решение, использующее его, отправьте его. Не использование STL было бы просто бонусом для нас, мы не слишком это себе представляем. Однако, если это хорошее решение, оно будет использоваться!