Anders Wegge Keller
2012-09-30 18:29:03 UTC
Jeg har en hel masse data, bestående af en kort tekststreng der
starter med GC, efterfulgt af en værdi på 2 til 5 base31[1] kodede
tegn. Hver tekststreng er også fosynet med en dato:
GC3VRBT,02-09-2012
GC3VRCQ,02-09-2012
GC3VRFN,02-09-2012
GC3VRME,02-09-2012
GC3VRN8,02-09-2012
Opgaven er at finde en kombination af tekststrenge, hvor hver af de
31 tegn i base-31 er repræsenteret netop 1 gang, og hvor mindst to af
tekststrengene har samme dato.
Det forholder sig så heldigt at disse strenge lige netop kan klemmes
ind i en 32 bit integer, så det kræver kun en enkelt and at se om en
streng overlapper med en anden, men det tager alligevel sin tid at
lave de her ca. 3^6*10^18/2 sammenligninger jeg skal ud i, for at lave
en exhaustive search af udfaldsrummet.
Den eneste umiddelbare mulighed for at reducere search space er
bundet op på partitioneringen af mine inddata, hvor jeg måske kan
hente en faktor 2000 på O(), ved at lave en udvælgelse på de
strenglængder der sammenlagt giver 31. Det er dog en rimelig
specialiseret løsning, der i høj grad læner sig op af det præcise
inddatasæt jeg har at teste med, og jeg er noget i tvivl om hvorvidt
det vil være en brugbar generel løsning.
Så spørgsmålet er, om der er nogen der kan se en snedigere
algoritme. Jeg kan sagtens leve med en pladskompleksitet i
størrelsesordenen O(n²), hvis det bringer tidskompleksiteten
tilsvarende ned. Med de test jeg indtil videre har lavet på et
reduceret datasæt, regner jeg med at den fulde udsøgning vil tage
noget i retning af en 4-5 dage at køre. Det er lige til den høje side,
selv hvis jeg kaster mig ud i noget parallellisering.
1. 0123456789ABCDEFGHJKMNPQRTVWXYZ
starter med GC, efterfulgt af en værdi på 2 til 5 base31[1] kodede
tegn. Hver tekststreng er også fosynet med en dato:
GC3VRBT,02-09-2012
GC3VRCQ,02-09-2012
GC3VRFN,02-09-2012
GC3VRME,02-09-2012
GC3VRN8,02-09-2012
Opgaven er at finde en kombination af tekststrenge, hvor hver af de
31 tegn i base-31 er repræsenteret netop 1 gang, og hvor mindst to af
tekststrengene har samme dato.
Det forholder sig så heldigt at disse strenge lige netop kan klemmes
ind i en 32 bit integer, så det kræver kun en enkelt and at se om en
streng overlapper med en anden, men det tager alligevel sin tid at
lave de her ca. 3^6*10^18/2 sammenligninger jeg skal ud i, for at lave
en exhaustive search af udfaldsrummet.
Den eneste umiddelbare mulighed for at reducere search space er
bundet op på partitioneringen af mine inddata, hvor jeg måske kan
hente en faktor 2000 på O(), ved at lave en udvælgelse på de
strenglængder der sammenlagt giver 31. Det er dog en rimelig
specialiseret løsning, der i høj grad læner sig op af det præcise
inddatasæt jeg har at teste med, og jeg er noget i tvivl om hvorvidt
det vil være en brugbar generel løsning.
Så spørgsmålet er, om der er nogen der kan se en snedigere
algoritme. Jeg kan sagtens leve med en pladskompleksitet i
størrelsesordenen O(n²), hvis det bringer tidskompleksiteten
tilsvarende ned. Med de test jeg indtil videre har lavet på et
reduceret datasæt, regner jeg med at den fulde udsøgning vil tage
noget i retning af en 4-5 dage at køre. Det er lige til den høje side,
selv hvis jeg kaster mig ud i noget parallellisering.
1. 0123456789ABCDEFGHJKMNPQRTVWXYZ
--
/Wegge
Leder efter redundant peering af dk.*,linux.debian.*
/Wegge
Leder efter redundant peering af dk.*,linux.debian.*