Heren,
Ik heb een beetje een probleempje met een algoritme wat ik aan het maken ben.
Het doel van het algoritme is om met behulp van Divide & Conquer een algoritme te schrijven dat uit een reeks positieve nummers het aantal significante inversies telt. Je doet dit door een variant van merge-sort te schrijven, waarbij je wat extra werk doet voor het tellen van de inversies.
Nu komt mijn probleem. Het tellen van normale inversions is geen probleem, maar ik zit een beetje in de knoei met mijn denken over significante inversies. Ik vind het moeilijk om een manier te bedenken waarmee ik (snel) die inversies kan tellen. Er moet een manier zijn waarop dat relatief snel kan, maar ik kan er niet opkomen.
Ik zal mijn probleem proberen te verduidelijken:
Ik heb de volgende getallenreeks: 10 4 2 7 3 1 5 6 0
Het aantal significante inversies in deze reeks is 16. Nu wil ik dit oplossen met divide en conquer.
Op een gegeven moment heb ik dus dit:
2 4 7 10
0 1 3 5 6
Het tellen van normale inversies in deze zou redelijk makkelijk zijn. Stel ik noem de bovenste lijst A, en de onderste lijst B. Je begint bij 2 in lijst A, en je vergelijkt dit getal met 0 in lijst B. 0 is kleiner dan 2, en dus wordt 0 het eerste getal in de gesorteerde lijst C. En aangezien 0 kleiner is dan alle getallen in A, wordt het aantal inversies opgehoogd met 4. Dan vergelijk je 1 met 2, 1 is kleiner, wordt toegevoegd aan C, en het aantal inversies wordt weer met 4 opgehoogd omdat alle getallen in A hoger zijn dan 1. Enzovoorts.
Als ik iets soortgelijks wil doen voor Significante inversies loop ik echter tegen een probleem op. Wil ik dat op dezelfde manier oplossen, zou dat in principe kunnen betekenen dat ik door een groot deel van lijst A steeds moet lopen. En dat kost heel veel tijd. (Toch?). Mijn vraag is dus of hier wat simpelers op te bedenken is, een foefje net als bij de gewone inversies. En is mijn denkwijze uberhaupt wel goed?
Is er iemand hier die me daarmee kan helpen? Ik zou het enorm waarderen!
PS: Ik weet niet zeker of mijn topic hier goed staat, ik zat een beetje te twijfelen tussen SEA en PRG, maar omdat het vooral over efficiëntie gaat, (als efficientie er niet toe doet, is dit probleem tamelijk makkelijk op te lossen, maar ik heb hier testcases klaar liggen met getallenreeksen van een paar miljoen (!) cijfers, met miljarden inversies.) Dus snelheid en efficientie is het belangrijkst..Vandaar SEA
Ik heb een beetje een probleempje met een algoritme wat ik aan het maken ben.
Het doel van het algoritme is om met behulp van Divide & Conquer een algoritme te schrijven dat uit een reeks positieve nummers het aantal significante inversies telt. Je doet dit door een variant van merge-sort te schrijven, waarbij je wat extra werk doet voor het tellen van de inversies.
Nu komt mijn probleem. Het tellen van normale inversions is geen probleem, maar ik zit een beetje in de knoei met mijn denken over significante inversies. Ik vind het moeilijk om een manier te bedenken waarmee ik (snel) die inversies kan tellen. Er moet een manier zijn waarop dat relatief snel kan, maar ik kan er niet opkomen.
Ik zal mijn probleem proberen te verduidelijken:
Ik heb de volgende getallenreeks: 10 4 2 7 3 1 5 6 0
Het aantal significante inversies in deze reeks is 16. Nu wil ik dit oplossen met divide en conquer.
Op een gegeven moment heb ik dus dit:
2 4 7 10
0 1 3 5 6
Het tellen van normale inversies in deze zou redelijk makkelijk zijn. Stel ik noem de bovenste lijst A, en de onderste lijst B. Je begint bij 2 in lijst A, en je vergelijkt dit getal met 0 in lijst B. 0 is kleiner dan 2, en dus wordt 0 het eerste getal in de gesorteerde lijst C. En aangezien 0 kleiner is dan alle getallen in A, wordt het aantal inversies opgehoogd met 4. Dan vergelijk je 1 met 2, 1 is kleiner, wordt toegevoegd aan C, en het aantal inversies wordt weer met 4 opgehoogd omdat alle getallen in A hoger zijn dan 1. Enzovoorts.
Als ik iets soortgelijks wil doen voor Significante inversies loop ik echter tegen een probleem op. Wil ik dat op dezelfde manier oplossen, zou dat in principe kunnen betekenen dat ik door een groot deel van lijst A steeds moet lopen. En dat kost heel veel tijd. (Toch?). Mijn vraag is dus of hier wat simpelers op te bedenken is, een foefje net als bij de gewone inversies. En is mijn denkwijze uberhaupt wel goed?
Is er iemand hier die me daarmee kan helpen? Ik zou het enorm waarderen!
PS: Ik weet niet zeker of mijn topic hier goed staat, ik zat een beetje te twijfelen tussen SEA en PRG, maar omdat het vooral over efficiëntie gaat, (als efficientie er niet toe doet, is dit probleem tamelijk makkelijk op te lossen, maar ik heb hier testcases klaar liggen met getallenreeksen van een paar miljoen (!) cijfers, met miljarden inversies.) Dus snelheid en efficientie is het belangrijkst..Vandaar SEA
[ Voor 33% gewijzigd door Verwijderd op 22-10-2007 23:46 ]