Вы пытаетесь получить количество уникальных сообщений в S
? Например, в данном примере для N = 2
вы получите 2 сообщения (00
и 11
), для N = 4
вы получите 2 сообщения (0000
и 1111
) и для N = 8
Вы получаете 1 сообщение (00001111
). Если это так, то словарный подход, предложенный tzaman , является одним из способов. Другой - сначала отсортировать список, затем просмотреть его и найти каждое сообщение. Третий, наивный подход заключается в том, чтобы использовать сторожевое сообщение, например, все 0, и выполнять поиск сообщений, не являющихся сторожевым. Когда вы найдете один, уничтожьте все его копии, установив их на страже. Например:
int CountMessages(char[] S, int SLen, int N) {
int rslt = 0;
int i, j;
char *sentinel;
sentinel = calloc((N+1)*sizeof(char));
for (i = 0; i < N; i ++)
sentinel[i] = '0';
//first, is there a sentinel message?
for (i = 0; ((i < SLen) && (rslt == 0)); i += N) {
if (strncmp(S[i], sentinel, N) == 0)
rslt++;
}
//now destroy the list and get only the unique messages
for (i = 0; i < SLen; i += N) {
if (strncmp(S[i], sentinel, N) != 0) { //first instance of given message
rslt++;
for (j = i+N; j < SLen; j += N) { //look for all remaining instances of this message and destroy them
if (strncmp(S[i], S[j], N) == 0)
strncpy(S[j], sentinel, N); //destroy message
}
}
}
return rslt;
}
Первый означает использование заранее написанного словаря или написание собственного. Второй и третий уничтожают список, то есть вы должны использовать копию для каждого «N», которое вы хотите проверить, но это довольно просто. Что касается распараллеливания, то словарь является самым простым, поскольку вы можете разбить строку на столько разделов, сколько у вас есть потоков, создать словарь для каждого, а затем объединить сами словари, чтобы получить окончательные значения. Во-вторых, я полагаю, что сама сортировка может быть легко сделана параллельной, тогда есть последний проход для подсчета. Третий требует, чтобы вы выполняли дозорную строку для каждой подстроки, а затем переделывали ее для последней рекомбинированной строки.
Обратите внимание на важную идею: вместо того, чтобы перебирать все возможные ответы, вы только перебираете все данные!