Scripsit "Jakob Nielsen" <a@b.c>
>> Jeg ville gøre følgende. Lad K være længden af svaret. En almindelig
>> hurtig strengsøgningsalgoritme (fx Boyer-Moore) kan give dig svaret på
>> "er K >= n?" for et givet n. Brug den som subrutine idet du skyder dig
>> ind på K ved bisektion.
> Så du vil eksempelvis sætte n=a og se om du kan finde et match i s1 for de a
> første tegn i s2?
> Hvis du ikke kan, så ved du at der ikke er et match som er større end a, og
> du vil derefter forsøge med a/2. Hvis det lykkes, så er der muligvis et svar
> mellem a/2 og a, og sådan søger du ned usikkerhed?
Ja.
> Det er egentlig en meget simpel og elegant metode.
Morale: En sjælden gang imellem kan det ikke betale sig at forsøge at
være smart og nå at søge efter flere præfikser i s1 i et enkelt
gennemløb.
> Ja, køretiden må vel være lineær, da strengsøgningen kan udføres lineært og
> valget af n er uafhængigt af strenglængderne.
Jeg ville bruge en helt generel bisektion hvor jeg starter med at
sætte nedre grænse til 0 og øvre grænse til længden af s2 (som du vist
kaldte s1 i første indlæg, eller er jeg forvirret). Første forsøg
bliver dermed til den halve længde.
> Den er så bare lineær med høj tidsværdi, ved nærmere eftertanke.
Egentlig ikke. Med Boyer-Moore er søgning efter lange delstrenge i
gennemsnit hurtigere end søgning efter kortere: At søge efter en
dobbelt så lang streng går dobbelt så hurtigt. Så selv om det viser
sig at det længste præfiks har længde 0 (det værste tilfælde: første
tegn i s2 forekommer slet ikke i s1), vil hele operationen ikke tage
længere tid end at lede efter første tegn i s2 i en streng der er
dobbelt så lang som s1.
Eller rettere ... der er vist klippet et par hjørner i den
asymptotiske analyse, så "dobbelt så lang" skal måske i stedet være
"fire eller fem gange så lang". Stadig ikke en kompleksitet der virker
afskrækkende.
Med forbehold for at jeg ikke kan huske hvor lang tid Boyer-Moore's
indledende tabelkonstruktion tager, men jeg tror også det er lineært
eller tæt på lineært.
--
Henning Makholm "We can hope that this serious deficiency will be
remedied in the final version of BibTeX, 1.0, which is
expected to appear when the LaTeX 3.0 development is completed."