Próbuję obliczyć entropię i wzajemne informacje ogromną liczbę razy w kodzie krytycznym pod względem wydajności. Jako etap pośredni muszę policzyć liczbę wystąpień każdej wartości. Na przykład:Najbardziej skuteczny sposób zliczania wystąpień?
uint[] myArray = [1,1,2,1,4,5,2];
uint[] occurrences = countOccurrences(myArray);
// Occurrences == [3, 2, 1, 1] or some permutation of that.
// 3 occurrences of 1, 2 occurrences of 2, one each of 4 and 5.
oczywiście oczywistych sposobów, aby to zrobić albo są za pomocą tablicy asocjacyjnej lub sortując tablicę wejściowego używając „standard” jak algorytm sortowania szybkiego sortowania. W przypadku małych liczb całkowitych, takich jak bajty, kod jest obecnie wyspecjalizowany w używaniu zwykłej starej tablicy.
Czy istnieje inteligentny algorytm do wykonania tej czynności wydajniej niż tablica skrótów lub "standardowy" algorytm sortowania, taki jak asocjacyjna implementacja macierzy, która zdecydowanie faworyzuje aktualizacje względem wstawień lub algorytm sortowania, który świeci, gdy dane mają dużo więzi?
Uwaga: Nie rozseparowane liczby całkowite są tylko jednym przykładem możliwego typu danych. Zamierzam wdrożyć tutaj dość ogólne rozwiązanie, chociaż ponieważ liczby całkowite i struktury zawierające tylko liczby całkowite są częstymi przypadkami, chciałbym być zainteresowany rozwiązaniami specyficznymi dla nich, jeśli są one wyjątkowo wydajne.
Nie mogę myśleć o niczym więcej niż wspomniałeś powyżej. Sortuj tablicę, a następnie przechodź kolejno w kolejności. –
Być może możesz użyć jakiegoś Hadoop lub Map/Reduce, aby przyspieszyć swój algorytm? Poza tym nic nie widzę. – kgrad
@kgrad: Już w pełni wykorzystuję wszystkie moje rdzenie, równolegle do zewnętrznej pętli, więc nie ma sensu równoległego wykonywania poszczególnych funkcji. – dsimcha