WPC-Aufgabe (Programmierwettbewerb)
-
SEED=10 ELEMS=100 : 1509278
ich hab 1509218SEED=10 ELEMS=300 : 5041260
ich hab 5041108SEED=12 ELEMS=200 : 3132883
ich hab auch 3132883SEED=31 ELEMS=200 : 3200808
ich hab auch 3200808SEED=1000 ELEMS=100 : 1628503
ich hab 1624809SEED=1000 ELEMS=300 : bleibt hängen (ich hoffe mal auf gleiche Gewichte)
ich hab 4776964
-
Hab da ganz andere Werte raus. Kann aber am Generator liegen. Benutze den der glibc? Was habt ihr genommen?
Ich hab mal einen PRNG vorgeschaltet:
class Prng { public: Prng(unsigned int seed); void init (unsigned int seed); unsigned int getuint(); private: unsigned int a[55]; int index; }; Prng::Prng(unsigned int seed) { init(seed); } void Prng::init(unsigned int seed) { a[0] = seed; for (index = 1; index != 55; ++index) { a[index] = a[index-1]*31 + 1; } } unsigned int Prng::getuint() { index = (index + 1) % 55; a[index] = a[(index + 23) % 55] + a[(index + 54) % 55]; return a[index]; } class WeightListGenerator { std::vector<unsigned> weight_list; Prng prng; public: WeightListGenerator( size_t elems , unsigned seed = unsigned(time(0))) : weight_list(std::vector<unsigned int>(elems,0)), prng(seed) { while(elems--) weight_list[elems] = prng.getuint(); } std::vector<unsigned> const & GetList() const { return weight_list; } };
Mit den folgenden Ergebnissen:
E: 100 S: 10 228544409808 E: 300 S: 10 682663452603 E: 200 S: 12 426704698914 E: 200 S: 31 436103580650 E: 100 S: 1000 193533809787 E: 300 S: 1000 615707704331
-
Geht dein Algo auch mit gleichen Gewichten?
Ich hab den Code so geändertclass WeightListGenerator { typedef std::map<unsigned int, int,std::less<unsigned int> > WMAP; std::vector<unsigned> weight_list; WMAP wmap; public: WeightListGenerator( size_t elems , unsigned seed = unsigned(time(0))) : weight_list(std::vector<unsigned int>(elems,0)) { std::srand(seed); //while(elems--) { // weight_list[elems] = unsigned(rand()); //} while(elems>0) { unsigned int value = unsigned(rand()); if(wmap.find(value) == wmap.end()) { weight_list[elems] = value; wmap.insert(WMAP::value_type(value,0)); elems--; } else { std::cout<<"\nEQUAL\n"; } } } std::vector<unsigned> const & GetList() const { return weight_list; } };
Und er gibt mir bei SEED=1000 ELEMS=300 zweimal EQUAL aus, bleibt auch nicht mehr hängen.
Haben wir nicht immer die gleichen Zahlen?
-
Jetzt wirds lang, aber ich wills wissen.
//begin list.push_back(365); list.push_back(1216); list.push_back(5415); list.push_back(16704); list.push_back(24504); list.push_back(11254); list.push_back(24698); list.push_back(1702); list.push_back(23209); list.push_back(5629); list.push_back(23830); list.push_back(32505); list.push_back(19574); list.push_back(16513); list.push_back(11529); list.push_back(13026); list.push_back(3768); list.push_back(1031); list.push_back(22229); list.push_back(7851); list.push_back(15646); list.push_back(7121); list.push_back(15810); list.push_back(6470); list.push_back(4195); list.push_back(25857); list.push_back(29816); list.push_back(11409); list.push_back(25981); list.push_back(6401); list.push_back(7628); list.push_back(17112); list.push_back(17688); list.push_back(1825); list.push_back(20443); list.push_back(19867); list.push_back(32578); list.push_back(4482); list.push_back(11605); list.push_back(18834); list.push_back(12136); list.push_back(28980); list.push_back(10524); list.push_back(17391); list.push_back(15489); list.push_back(1435); list.push_back(10254); list.push_back(17635); list.push_back(10633); list.push_back(13079); list.push_back(29982); list.push_back(17251); list.push_back(18993); list.push_back(5347); list.push_back(15274); list.push_back(1580); list.push_back(12245); list.push_back(1598); list.push_back(31753); list.push_back(5637); list.push_back(25262); list.push_back(18121); list.push_back(11875); list.push_back(9540); list.push_back(15177); list.push_back(15921); list.push_back(1989); list.push_back(4243); list.push_back(28727); list.push_back(8973); list.push_back(5492); list.push_back(23796); list.push_back(11271); list.push_back(2314); list.push_back(8834); list.push_back(22275); list.push_back(16241); list.push_back(6725); list.push_back(7072); list.push_back(14203); list.push_back(17364); list.push_back(32760); list.push_back(25907); list.push_back(28924); list.push_back(16867); list.push_back(15961); list.push_back(22442); list.push_back(2828); list.push_back(12442); list.push_back(1983); list.push_back(22030); list.push_back(11867); list.push_back(24696); list.push_back(19207); list.push_back(13018); list.push_back(17995); list.push_back(9960); list.push_back(310); list.push_back(22286); list.push_back(23471); list.push_back(24064); list.push_back(32351); list.push_back(24447); list.push_back(3283); list.push_back(3181); list.push_back(18888); list.push_back(9329); list.push_back(18110); list.push_back(18862); list.push_back(16712); list.push_back(24423); list.push_back(9139); list.push_back(12929); list.push_back(3059); list.push_back(25402); list.push_back(4862); list.push_back(411); list.push_back(8186); list.push_back(6761); list.push_back(11757); list.push_back(8348); list.push_back(24524); list.push_back(16304); list.push_back(24092); list.push_back(17730); list.push_back(4737); list.push_back(1244); list.push_back(14581); list.push_back(28381); list.push_back(15225); list.push_back(7133); list.push_back(13432); list.push_back(22531); list.push_back(5440); list.push_back(22045); list.push_back(6456); list.push_back(12420); list.push_back(13237); list.push_back(19984); list.push_back(21926); list.push_back(13216); list.push_back(4460); list.push_back(20237); list.push_back(5778); list.push_back(28280); list.push_back(3152); list.push_back(28508); list.push_back(18671); list.push_back(19139); list.push_back(5517); list.push_back(4240); list.push_back(26839); list.push_back(12738); list.push_back(6317); list.push_back(14870); list.push_back(16847); list.push_back(23414); list.push_back(527); list.push_back(1099); list.push_back(7696); list.push_back(27714); list.push_back(30811); list.push_back(21621); list.push_back(20905); list.push_back(11640); list.push_back(18422); list.push_back(13866); list.push_back(7219); list.push_back(23323); list.push_back(648); list.push_back(31301); list.push_back(14768); list.push_back(30072); list.push_back(18999); list.push_back(4385); list.push_back(5282); list.push_back(19031); list.push_back(19904); list.push_back(26201); list.push_back(17090); list.push_back(20187); list.push_back(19142); list.push_back(10706); list.push_back(14836); list.push_back(20649); list.push_back(2666); list.push_back(10748); list.push_back(20859); list.push_back(16972); list.push_back(3099); list.push_back(9044); list.push_back(25449); list.push_back(9945); list.push_back(21167); list.push_back(10542); list.push_back(8794); list.push_back(24782); list.push_back(1971); list.push_back(2993); list.push_back(30562); list.push_back(26688); list.push_back(26880); list.push_back(24355); list.push_back(31812); list.push_back(11318); list.push_back(13455); list.push_back(2151); list.push_back(26085); list.push_back(9040); list.push_back(1679); list.push_back(29379); list.push_back(29440); list.push_back(20396); list.push_back(23988); list.push_back(21223); list.push_back(13082); list.push_back(14857); list.push_back(14801); list.push_back(6955); list.push_back(14777); list.push_back(10285); list.push_back(2217); list.push_back(1305); list.push_back(4561); list.push_back(4741); list.push_back(21763); list.push_back(21547); list.push_back(1407); list.push_back(7436); list.push_back(27644); list.push_back(13781); list.push_back(3577); list.push_back(5997); list.push_back(27809); list.push_back(25286); list.push_back(32710); list.push_back(18540); list.push_back(30141); list.push_back(25964); list.push_back(18218); list.push_back(2178); list.push_back(26096); list.push_back(10678); list.push_back(18661); list.push_back(28615); list.push_back(25089); list.push_back(14877); list.push_back(15133); list.push_back(6934); list.push_back(5493); list.push_back(19941); list.push_back(2712); list.push_back(19563); list.push_back(24929); list.push_back(3232); list.push_back(8238); list.push_back(27279); list.push_back(28028); list.push_back(10997); list.push_back(6782); list.push_back(9208); list.push_back(20344); list.push_back(17567); list.push_back(20449); list.push_back(14570); list.push_back(15507); list.push_back(6072); list.push_back(11420); list.push_back(12515); list.push_back(31081); list.push_back(1336); list.push_back(16730); list.push_back(32566); list.push_back(31756); list.push_back(31417); list.push_back(5593); list.push_back(23286); list.push_back(29782); list.push_back(10621); list.push_back(5091); list.push_back(19989); list.push_back(11902); list.push_back(11953); list.push_back(7808); list.push_back(16333); list.push_back(1002); list.push_back(4339); list.push_back(10602); list.push_back(32319); list.push_back(20036); list.push_back(14099); list.push_back(25793); list.push_back(2907); list.push_back(4304); list.push_back(15382); list.push_back(20736); list.push_back(12543); list.push_back(19453); list.push_back(17537); list.push_back(20272); list.push_back(8291); list.push_back(12090); list.push_back(14548); list.push_back(347); list.push_back(8372); list.push_back(7434); list.push_back(2388); list.push_back(3908); list.push_back(4351); list.push_back(13659); list.push_back(24333); list.push_back(9045); list.push_back(16721); list.push_back(23060); list.push_back(24088); list.push_back(13273); list.push_back(26397); list.push_back(25069); list.push_back(23834); list.push_back(27755); list.push_back(12509); list.push_back(28035); list.push_back(13837); list.push_back(19374); list.push_back(15612); list.push_back(4780); list.push_back(5187); list.push_back(18751); list.push_back(30708); list.push_back(20999); list.push_back(25511); list.push_back(6120); list.push_back(9652); list.push_back(2776); list.push_back(17735); list.push_back(22551); list.push_back(6724); list.push_back(24851); list.push_back(11535); list.push_back(20110); list.push_back(26027); list.push_back(18871); list.push_back(3287); list.push_back(29531); list.push_back(30481); list.push_back(12637); list.push_back(12449); list.push_back(27915); list.push_back(31521); list.push_back(28945); list.push_back(12315); list.push_back(19483); list.push_back(31153); list.push_back(1376); list.push_back(6508); list.push_back(6831); list.push_back(30373); list.push_back(15282); list.push_back(14636); list.push_back(5254); list.push_back(6672); list.push_back(18907); list.push_back(9140); list.push_back(6958); list.push_back(9117); list.push_back(1004); list.push_back(25497); list.push_back(14964); list.push_back(11566); list.push_back(9295); list.push_back(29043); list.push_back(20767); list.push_back(194); list.push_back(23059); list.push_back(22755); list.push_back(12766); list.push_back(1436); list.push_back(4484); list.push_back(11988); list.push_back(20606); list.push_back(2210); list.push_back(11007); list.push_back(15616); list.push_back(20320); list.push_back(25603); list.push_back(5124); list.push_back(1718); list.push_back(299); list.push_back(18972); list.push_back(30349); list.push_back(2779); list.push_back(12990); list.push_back(14237); list.push_back(29342); list.push_back(26416); list.push_back(20841); list.push_back(20711); list.push_back(5662); list.push_back(16594); list.push_back(16732); //end
Ergebnis: 6213835
-
Zuviel rumgefrickelt
Mit dem neuen Algo ist das Ergebnis 6149750
-
Hat jemand 'ne große Vergleichsliste für die Schnittpunktaufgabe? Ne 30er, am besten 50er oder am allerbesten ne 100er wäre ganz hilfreich, dann könnten wir auch mal vergleichen.
-
Hehe, ich glaub, ich hab nen Algo gefunden (meinen alten konnt ich ja jetzt in die Tonne treten
), muss ich zu Hause mal ausprobieren.
-
irgendwer schrieb:
Zuviel rumgefrickelt
Mit dem neuen Algo ist das Ergebnis 6149750hm, ich komme auf 6149588
-
Hehe, Algo mit O(n)
Komm aber heut nicht mehr nach Hause
-
Und hier noch etwas für WPC_Pro:
#include <limits> #include <cmath> #include <ctime> #include <cstdlib> #include <vector> static const double max_int = std::numeric_limits<int>::max(); #include <windows.h> #pragma once struct Point { Point(double xc, double yc) : x(xc), y(yc) {} double x, y; }; class Line { public: Line(Point const& startPoint, Point const& endPoint) : start(startPoint), end(endPoint) {} Point const& getStart() const { return start; } Point const& getEnd() const { return end; } private: Point start, end; }; size_t wpc_pro(std::vector<Line> const& lines); class WPCProHelper { enum { minLength = 20, maxLength = 100, windowWidth = 640, windowHeight = 480 }; public: WPCProHelper() { __int64 s = get_rdtsc(); Sleep(1000); __int64 e = get_rdtsc(); computer_speed = (e - s) / 1000; } size_t execute( int num , unsigned seed ) { std::vector<Line> vec = generateLines(num,seed); startMessure(); size_t erg = wpc_pro(vec); endMessure(); return erg; } __int64 getDuration() { return (( end_ticks - start_ticks ) / computer_speed); } private: __int64 computer_speed; __int64 start_ticks; __int64 end_ticks; private: void startMessure() { start_ticks = get_rdtsc(); } void endMessure() { end_ticks = get_rdtsc(); } bool invalidPoint(Point const& p) { return (p.x <= 0 || p.y <= 0 || p.x >= windowWidth || p.y >= windowHeight); } __int64 get_rdtsc() { __asm rdtsc } inline std::vector<Line> generateLines( int numLines , unsigned seed = unsigned(time(0))) { using namespace std; srand(seed); std::vector<Line> target; for(int i = 0; i < numLines; ++i) { Point start(0, 0), end(0, 0); double length, phi; start.x = random01() * windowWidth; start.y = random01() * windowHeight; do { length = random01() * (maxLength - minLength) + minLength; phi = random01() * 2 * 3.14; end.x = start.x + length * cos(phi); end.y = start.y + length * sin(phi); } while(invalidPoint(end)); target.push_back(Line(start, end)); } return target; } double random01() { return double(rand()/max_int); } };
#include "WPCProHelper.h" #include <iostream> int main() { WPCProHelper h; size_t erg = h.execute(10000,333); std::cout << erg << "\t" << h.getDuration() << std::endl; }
Mein ergebnis für die verwendete Einstellung ( seed = 333 / linien = 10000 )
4052812 Schnittpunkte
Mein AMD Athlon XP 2600+ mit 1024 MB RAM braucht dafür ca. 2.9 Sekunden
Ich hab den Code mit dem VC8 als Release compiliert mit eingeschalteten Optimierungen.
Da mein Algorithmus noch O(n^2) ist lässt sich da bestimmt noch was drehen. Mal schauen ob mir noch ne Idee kommt
BR
evilissimoPS: Ich bitte um eine Anpassung des obigen Codes für vergleichbare tests, muss aber dazu sagen das die Generierung der Linien mit Prng mir persönlich viel zu lange dauert. *g* Vielleicht kann das ja jemand mal anpassen
( Vorallem eine evtl portablere Version beitragen )
-
evilissimo schrieb:
Da mein Algorithmus noch O(n^2) ist lässt sich da bestimmt noch was drehen. Mal schauen ob mir noch ne Idee kommt
Viel besser kann es nicht gehen, da im Worst Case O(n^2) Schnittpunkte exisitieren.
-
du meinst wohl eher 2 * n
gib mir mal ein beispiel für n^2 falls du eins hast, wäre interessant.
BR
evilissimo
-
schau Dir mal ein kariertes Blatt Papier an.
-
Ponto schrieb:
Viel besser kann es nicht gehen, da im Worst Case O(n^2) Schnittpunkte exisitieren.
das stimmt.
aber jester hat extra angeküdigt, daß viele kurze srecken dabei sind. da könnte doch was unterquadratisches gehen.
-
Jester schrieb:
schau Dir mal ein kariertes Blatt Papier an.
naja ein Kariertes Blatt hat glaub ich dann n * ( n / 4 ) Schnittpunkte.
-
womit bewiesen wäre das es nicht schneller als O(n^2) geht
-
borg schrieb:
womit bewiesen wäre das es nicht schneller als O(n^2) geht
Deshalb unterteilt man die Laufzeit solcher Algorithmen gerne:
O(nlogn + Ergebnis) ist dann besser als O(n^2 + Ergebnis) obwohl beide zu O(n^2) werden, wenn das Ergebnis wie hier gezeigt O(n^2) ist.
-
Um Gottes willen! Ihr macht hier komplexitätsanalysen und riesige tests und ich hab mir mal eben in nen paar stunden was gebastelt???
Naja, hab glaub ich O(n^2), bin mir aber nicht sicher (manchmal kann ich schneller ausschließen, dass sich 2 Strecken net schneiden (parallel), dafür berechne ich aber auf kosten der übersichtlichkeit was doppelt)...
-
Was will er uns nur sagen?
-
Brutus schrieb:
Was will er uns nur sagen?
er will, daß alle denken, er würde was voll lahmes abgeben, damit sie noch schnell zur streckenaufgabe wechseln, und er dann alle plattmacht.