Evenredig verdelen?

Heb je een leuke wiskunde puzzel of een mooi vraagstuk gevonden en wil je die met ons delen? Post het hier.
Plaats reactie
marcelk1607
Nieuw lid
Nieuw lid
Berichten: 3
Lid geworden op: 07 mei 2009, 21:02

Evenredig verdelen?

Bericht door marcelk1607 » 07 mei 2009, 21:06

Stel ik heb een bestand met een bepaalde grootte.
Nu wil ik dit bestand verdelen in x stukken.

Hoe kan ik dat het beste doen? Ik wil een optimale verdeling over x.

MIsschien wel een hele simpele puzzel, maar ik heb al tijden geen wiskunde meer gebruikt. :oops:
Iemand tips?

arie
Moderator
Moderator
Berichten: 3558
Lid geworden op: 09 mei 2008, 09:19

Re: Evenredig verdelen?

Bericht door arie » 07 mei 2009, 21:39

Wat versta je onder een "optimale verdeling"??
Als het gaat om gelijke verdeling is het een kwestie van delen, bijvoorbeeld:
bestand van 6 MB verdelen in 3 gelijke stukken:
elk stuk wordt 6 MB / 3 = 2 MB.
Maar heb je misschien ook nog aanvullende voorwaarden??

marcelk1607
Nieuw lid
Nieuw lid
Berichten: 3
Lid geworden op: 07 mei 2009, 21:02

Re: Evenredig verdelen?

Bericht door marcelk1607 » 08 mei 2009, 06:35

Sorry ik was niet duidelijk.

Bestandgrootte is altijd een natuurlijk getal.

Als de bestandsgrootte 400 kilobytes is, en je hebt 4 cpu's, dan verdeel ik elk deel in 100 kilobyte.
Is de bestandsgrootte 410 kilobytes, met 4 cpu's, dan verdeel ik 100, 100, 100 en 110.

Ik kan natuurlijk x modulus 4 doen en de eventuele rest bij het vierde deel doen.

arie
Moderator
Moderator
Berichten: 3558
Lid geworden op: 09 mei 2008, 09:19

Re: Evenredig verdelen?

Bericht door arie » 08 mei 2009, 09:34

Als je n cpu's gelijkmatig wilt vullen met veelvouden=blokken van B bytes (bijvoorbeeld B=1024, of in jouw voorbeeld B=100) + een eventuele rest, kan je de grootte G van het bestand delen door B, je krijgt dan iets in de vorm
G = q*B + r
waarbij
r = rest bij deling van G door B (0 <= r < B)
q = aantal complete blokken van B bytes.
Als r=0, dan moet je Q=q blokken wegzetten over de n cpu's,
als r>0, dan moet je Q=q+1 blokken verdelen over de n cpu's.
Als Q een veelvoud is van n, dan heb je Q/n blokken per cpu nodig,
als Q geen veelvoud is van n, dan krijgen een aantal cpu's 1 blok meer.

Bijvoorbeeld:
n=4 cpu's
blokgrootte B=100
Bestand = 1040
G = 10*100 + 40
r=40>0 => 11 blokken weg te zetten
de 4 cpu's krijgen elk in ieder geval 11/4 = 2 blokken (afronden naar beneden),
de overige 11-2*4 = 3 blokken moeten we over 3 van de 4 cpu's verdelen.
Merk op dat deze 3 blokken 2 blokken van 100 en 1 blok van 40 zijn.

Bedoelde je zoiets?

marcelk1607
Nieuw lid
Nieuw lid
Berichten: 3
Lid geworden op: 07 mei 2009, 21:02

Re: Evenredig verdelen?

Bericht door marcelk1607 » 08 mei 2009, 21:03

Zoiets inderdaad maar ik wil de blokgrootte laten berekenen.
Ik wil een bestand in 4 delen splitsen, zo evenredig mogelijk.
Dit om elke cpu-core een gelijke workload te geven.

tsagld
Vergevorderde
Vergevorderde
Berichten: 341
Lid geworden op: 23 mar 2009, 12:07
Contacteer:

Re: Evenredig verdelen?

Bericht door tsagld » 18 mei 2009, 13:57

Grootte n, evenredig verdelen in m blokken:

Stel k = n/m
Stel l = n mod m

Er zijn nu m - l blokken die k groot zijn, en l blokken die k+1 groot zijn.

Bijvoorbeeld:

Grootte 1000, verdelen in 7 blokken:
k = 1000 / 7 = 142
l = 1000 mod 7 = 6

Er zijn nu 7 - 6 = 1 blok van 142, en 6 blokken van 143.

That's it.

Plaats reactie