Вы делаете это правильно, используя сортировку ведра . Не может быть более быстрого (непараллельного) алгоритма для подсчета элементов в конечной вселенной (например, символов).
Если вы используете только символы ASCII, вы можете использовать простой массив int table[256]
, чтобы избежать накладных расходов на контейнеры C ++.
Использование устройства Даффа (которое на самом деле медленнее на некоторых процессорах в настоящее время):
int table[256];
memset(table, 0, sizeof(table));
int iterations = (text_length+7) / 8;
switch(count % 8){
case 0: do { table[ *(text++) ]++;
case 7: table[ *(text++) ]++;
case 6: table[ *(text++) ]++;
case 5: table[ *(text++) ]++;
case 4: table[ *(text++) ]++;
case 3: table[ *(text++) ]++;
case 2: table[ *(text++) ]++;
case 1: table[ *(text++) ]++;
} while(--iterations > 0);
}
Обновление: Как заметил MRAB, параллельная обработка фрагментов текста может повысить производительность. Но имейте в виду, что создание потока довольно дорого, поэтому вы должны измерить, каково наименьшее количество символов, что оправдывает время создания потока.