Branimir_Maksimovic
Well-known member
- Joined
- Nov 22, 2018
- Messages
- 928
- Reaction score
- 370
Ne radis sa jednom listom nego podelis tu jednu u n chunkova, pa onda pustas svaki thread da radi sa vojom listom.
Ali neces nista dobiti time, zato sto je vreme izvrsavanja u single threadu previse kratko da bi threadovi dosli do izrazaja.
Pre ce biti da ako regex zamenis sa prostom proverom da ces dobiti bolje rezultate
Inace evo C++ resenja koje ce ujedno raditi najbrze (c++11 kompajler potreban):
Ali neces nista dobiti time, zato sto je vreme izvrsavanja u single threadu previse kratko da bi threadovi dosli do izrazaja.
Pre ce biti da ako regex zamenis sa prostom proverom da ces dobiti bolje rezultate
Inace evo C++ resenja koje ce ujedno raditi najbrze (c++11 kompajler potreban):
Code:
#include
#include <unordered_map>
#include
#include
#include
#include
using namespace std;
using Pairs = unordered_map<string,int>;
void fill( Pairs& pairs, char c )
{
static string word;
if( ispunct© ) return;
if( isspace© )
{
if( word.size() )
{
pairs[word]++;
word.clear();
}
}
else
{
word += tolower©;
}
}
int main()
{
ifstream bible {“bible.txt”};
using citerator = istreambuf_iterator;
Pairs pairs;
for_each( citerator(bible.rdbuf()), citerator(),
[&pairs]( char c ){ fill( pairs, c ); } );
multimap<unsigned,string> sorted;
// Sort the {word, count} pairs.
//
for_each( pairs.begin(), pairs.end(),
[&sorted]( const Pairs::value_type& p )
{ sorted.insert(make_pair(p.second,p.first)); } );
// Print the top 20.
//
auto item = sorted.rbegin();
for( auto n = 0; n < 20; ++n, ++item )
{
cout << "Position " << setw(2) << n+1
<< ": count = " << setw(6) << item->first
<< " " << item->second << ‘\n’;
}
return 0;
}
Last edited: