ich habe gerade einen kleinen Auftrag angenommen, bei dem es für ein Wort-Puzzle-Spiel nötig ist, aus einer Liste von 300k Wörtern alle anagram-fähigen Wörter rauszusuchen. Mir ist dazu erstmal nix Schlaueres eingefallen als von jedem Wort alle Permutationen zu bilden und zu testen, ob die in der Wortliste auftauchen.
Wie ihr euch vielleicht vorstellen könnt, dauert das Zeit. Eine knappe halbe Stunde. Empfehlungen algorithmischer Natur nehme ich auch gern entgegen, aber nur zu Lernzwecken - dieser Teil des Auftrags ist damit eigentlich durch und ich möchte vermeiden, da noch viel Optimierungsarbeit reinzustecken. Primär brauche ich eure Fachkenntnis aber zur Bewertung meiner Parallelisierung.
Und die sieht so aus:
Code: Alles auswählen
#pragma omp parallel
for( const std::string& word : allWords )
GenerateAnagramsAndStoreIfFound( word, allWords, targetStorageVector);
Code: Alles auswählen
template <typename T>
struct ConcurrentVector
{
std::atomic<size_t> mCount;
std::vector<T> mBuffer;
public:
ConcurrentVector( size_t pCapacity)
: mCount( 0), mBuffer( pCapacity, T())
{ }
void push_back( T&& val)
{
size_t slot = mCount.fetch_add( 1);
if( slot >= mBuffer.capacity() )
return;
mBuffer[slot] = std::move( val);
}
};
Geht das so? Oder habe ich da irgendwo einen groben Denkfehler drin?
PS: ich sehe gerade, der Debugger meint, ich hätte viele doppelte Einträge. Irgendwo ist da wohl noch der Wurm drin, aber das dürfte mit dem parallel beschreibbaren Vector nix zu tun haben.