Nothing Special   »   [go: up one dir, main page]

Hoppa till innehållet

Lyndonord

Från Wikipedia

Inom matematiken, inom områdena kombinatorik och datavetenskap, är ett Lyndonord en sträng som kommer före alla andra av sina cykliska permutationer i en lexikografisk ordning. Lyndonord är uppkallade efter den amerikanske matematikern Roger Lyndon som införde dem 1954 som "standard lexicographic sequences" ("lexikografiska standardsekvenser").[1]

Flera likvärda definitioner är möjliga. Ett k-närt Lyndonord av längden n är en sträng med n tecken över ett alfabet med storleken k och som är det minsta elementet i lexikografisk ordning av alla sina rotationer. Att vara den singulärt minsta rotationen medför att ett Lyndonord avviker från alla icke-triviala rotationer, och sålunda är icke-periodiskt.[2]

Alternativt har ett Lyndonord egenskapen att, närhelst det delas i två delsträngar, den vänstra alltid är lexikografiskt mindre än den högra. Detta innebär att om w är ett Lyndonord och uv är en faktorisering i två delsträngar u och v som underförstått inte är tomma, så är u < v. Denna definition medför att w är ett Lyndonord om och bara om det finns två Lyndonord u och v sådana att u < v och w = uv.[3] Fastän att det kan finnas mer än ett val av u och v med denna egenskap, så finns det ett speciellt val av u och v som kallas standardfaktoriseringen där v är så långt som möjligt.[4]

Lyndonorden över det binära alfabetet med två symboler {0,1}, sorterade först efter längd och sedan i lexikografisk ordning inom varje längdklass bildar en oändlig sekvens som börjar

ε, 0, 1, 01, 001, 011, 0001, 0011, 0111, 00001, 00011, 00101, 00111, 01011, 01111, ...

Här betecknar ε den tomma strängen. Den första sträng som inte ingår är "00" som utesluts därför att den är periodisk (den består av två upprepade delsträngar "0"). Nästa uteslutna sträng är "10", som är aperiodisk, men inte minimal i permutationsklassen, eftersom den kan permuteras cykliskt till "01" som är mindre.

Antalet binära Lyndonord av varje längd, med början på längden noll, bildar heltalsföljden

1, 2, 1, 2, 3, 6, 9, 18, 30, 56, 99, 186, 335, ... (talföljd A001037 i OEIS).

Lyndonord motsvarar aperiodiska halsbands klassrepresentanter och kan sålunda räknas med halsbandspolynom.[2][5]

Om vi med representanten menar en cyklisk permutation av en sträng som är lika med den lexikografiskt minsta (ej nödvändigtvis unik, men alla Lyndonord är såklart representanter) ser vi att alla representanter för periodiska strängar av längden n kan bildas genom (upprepad) sammansättning av något Lyndonord med en längd som motsvarar periodiciteten. Till exempel kan 011011, med periodiciteten tre, bildas av 011 upprepat två gånger. Vi får alltså alla periodiska representanter för en sträng av längden n om vi sätter ihop alla Lyndonorden med längderna pi, där pi är alla de tal som delar n (inklusive ett).

Exempel: Vi får alla representanter för de periodiska binära strängarna av längden sex om vi upprepar Lyndonorden av längderna 1 (000000 och 111111), 2 (010101) och 3 (001001 och 011011).

Om vi nu konstaterar att det finns kn strängar av längden n och drar ifrån de strängar som kan bildas av representanterna för de periodiska strängarna (d.v.s. antalet Lyndonord av längden pi multiplicerat med pi) är återstoden de cykliska permutationerna av Lyndonorden av längden n.

Exempel: De periodiska strängarna av längden sex i föregående exempel ger genom cyklisk permutation en (000000 och 111111), två (010101=101010) respektive tre (001001=010010=100100 och 011011=101101=110110) strängar vardera, sammanlagt 2 ⋅1 + 1 ⋅ 2 + 2 ⋅ 3 = 10 strängar som är periodiska. Totalt finns det 26 = 64 strängar. Drar vi bort de tio som är periodiska återstår 54 aperiodiska strängar som har sex unika cykliska permutationer vardera, d.v.s. representeras av nio olika Lyndonord (000001, 000011, 000111, 000101, 001011, 001101, 010111, 011101 och 0111111).
Följdexempel: För att få antalet lyndonord med längden tolv får vi förutom de tio strängar som är periodiska för längden sex (och bildas av Lyndonorden av längd ett, två respektive tre. dra bort de 9 ⋅ 6 = 54 strängarna som kan bildas av två delsträngar av längden sex och de 3 ⋅4 = 12 som kan bildas av tre delsträngar av längden fyra, det vill säga 212 - 76 = 4096 - 76 = 4020 strängar är cykliska permutationer av 4020 / 12 = 335 Lyndonord.

Särskilt ser man att antalet k-nära Lyndonord av längden p är lika med (kp - k) / p om p är ett primtal, eftersom det bara är de k upprepningarna av samma Lyndonord av längden 1, d.v.s. de som består av samma tecken som är periodiska. Till exempel finns det två binära periodiska strängar av längden fem (00000 och 11111), varför de övriga 25 - 2 = 30 strängarna är de cykliska permutationerna av sex olika Lyndonord (00001, 00011, 00101, 00111, 01101 och 01111).

Kontentan av ovanstående resonemang blir att antalet k-nära Lyndonord av längden n kan uttryckas med

där μ(x) är Möbiusfunktionen för x.

  • Lk(1) = k
  • Lk(2) = (k2 − k)/2
  • Lk(3) = (k3 − k)/3
  • Lk(4) = (k4 − k2)/4
  • Lk(5) = (k5 − k)/5
  • Lk(6) = (k6 − k3 − k2 + k)/6
  • Lk(pn) = (kpn − kpn − 1)/pn om p är ett primtal
  • Lαβ(n)=(i,j)Lα(i)Lβ(j) där (i,j) är den största gemensamma delaren till i, och j och [i,j] är deras minsta gemensamma multipel.[6]

Duval (1988) anger en effektiv algoritm för att lista Lyndonorden upp till n med ett givet alfabet av storleken k i lexikografisk ordning. Om w är ett av orden i sekvensen och har längden |w| kan det nästföljande ordet hittas genom följande steg:

  1. Repetera tecknen i w så att ett nytt ord x bildas med längden exakt n, där tecknet på plats i i ordet x är detsamma som tecknet på platsen i mod |w| i ordet w. (Det vill säga: sätt samman w med sig själv tills det bildade ordet är minst så långt som n och "klipp bort" det som blir över på högersidan så att din nya sträng har längden n.)
  2. Så länge det avslutande tecknet i x är det sista tecknet i alfabetets sorteringsordning, ta bort det så att ett kortare ord bildas. (Om sista tecknet i ditt alfabet är "ö" så ta bort alla "ö" som avslutar strängen.)
  3. Byt sedan ut det avslutande tecknet i x med dess efterföljare i alfabetets sorteringsordning. (Om din sträng nu slutar på exempelvis "g" och tecknet efter "g" i ditt alfabet är "h" så ersätt detta "g" med "h".)
Exempel: om alfabetet är (i ordning) {1,2,3,4,5} och w är 15234 och n är 7:
1. x=1523415 (d.v.s. w plus de två första tecknen i w)
2. x=152341 (bort med den avslutande femman som är alfabetets sista bokstav; notera också att detta ord har en mindre representant 115234)
3. x=152342 (ersätt den avslutande ettan med dess efterföljare i ordningen)
Exempel: om alfabetet är (i ordning) {a,b,c} och w är abc och n är 7 får vi:
(Förra Lyndonordetsteg 1steg 2steg 3, d.v.s. nästa Lyndonord)
abcabcabcaabcabcaabcabcb
abcabcbabcabcbabcabcbabcabcc
abcabccabcabccabcababcac
abcacabcacababcacababcacac
abcacacabcacacabcacaabcacb
etcetera.

I värsta fall är tiden för generation av ett ords efterföljare O(n). Men om man lagrar de producerade orden i en array med längden n och konstruktionen av x från w genomförs genom att lägga till tecken till slutet av w snarare än att göra en ny kopia av w, så är medeltiden för att generera efterföljaren till w (om vi antar att varje ord är lika troligt) konstant. Därför kan följden av alla Lyndonord av längd högst n genereras på en tid som är proportionell mot sekvensens längd.[7] En konstant andel av orden i denna följd har längden exakt n, så samma procedur kan användas för att effektivt generera ord av längden exakt n eller ord vars längd delar n, genom att filtrera bort de genererade ord som inte fyller dessa kriterier.

Standardfaktorisering

[redigera | redigera wikitext]

Enligt Chen-Fox-Lyndons sats kan varje sträng bildas på ett unikt sätt genom konkatenering (sammansättning) en sekvens av Lyndonord på ett sådant sätt att orden i sekvensen inte ökar lexikografiskt.[8] Det avslutande Lyndonordet i denna sekvens är det lexikografiskt minsta suffixet till den givna strängen.[9] En faktorisering i en inte ökande sekvens av Lyndonord (en så kallad Lyndonfaktorisering) kan åstadkommas i linjär tid (det vill säga T(n)=O(n)).[9] Lyndonfaktorizseringar kan användas som del av en bijektiv variant av Burrows-Wheeler-transformering för datakompression.[10] och i algorimer för digital geometri.[11]

Duval (1983) utvecklade en algoritm för standardfaktorisering som går i linjär tid och konstant rum. Den itererar över en sträng och försöker hitta så långa Lyndonord som möjligt. När den hittar ett lägger den till det i resultatlistan och fortsätter att söka i resten av strängen. Den resulterande listan är den givna strängens standardfaktorisering. En mer formell beskrivning av algoritmen följer nedan.

Med en given sträng S med längden N (strängen består av tecknen S[0]+S[1]+...+S[n-1]) går man igenom följande steg:

  1. Låt m vara index för teckenkandidaten till att läggas till i resultatlistan. Initialt är m = 1 (räkning av symboler i en sträng startar från noll, så när vi börjar är S[m]=S[1] strängens andra tecken).
  2. Låt k vara index för det tecken som vi jämför med. Initialt är k = 0. När vi börjar är alltså S[k]=S[0] strängens första tecken.
  3. Upprepa följande steg så länge k och m är mindre än N.
    1. Om S[k] = S[m]: lägg till S[m] till de för närvarande samlade tecknen. Öka k och m med ett.
    2. Om S[k] < S[m]: om vi lägger till S[m] till de för närvarande samlade tecknen får vi ett Lyndonord. Men vi kan inte lägga till det till listan, eftersom det kan ingå i ett större Lyndonord. Så vi ökar m med ett och sätter k till noll; härigenom kommer nästa tecken att jämföras med strängens första tecken.
    3. Om S[k] > S[m]: lägger vi till S[m] till de hittills samlade tecknen kan det inte bli ett Lyndonord eller en möjlig början på ett. Så, lägg först till m-k insamlade tecken till resultatlistan, ta bort dem från strängen och sätt m=1 och k=0 så att de pekar på det andra respektive första tecknet i strängen.
  4. Lägg till det som är kvar av S på resultatlistan.

Exempel

Antag att vi initialt har strängen S=abbabaab. Vi sätter m=1 och k=0 och börjar jämföra:

Här blev S[k] > S[m] så vi tar bort m-k=3 tecken, d.v.s. abb, och lägger detta Lyndonord till vår resultatlista. Av S återstårr nu abaab. Vi återställer m och k, och fortsätter:

Här blev S[k] > S[m] så vi tar bort m-k=2 tecken, d.v.s. ab, och lägger detta Lyndonord till vår resultatlista. Av S återstår nu bara aab och vi fortsätter:

S[k] blev inte större än S[m] innan vi nådde ordets slut, så aab är vårt sista Lyndonord. Faktoriseringen av abbabaab är alltså (abb)(ab)(aab), och vi noterar också att abb > ab > aab.

Samband med de Bruijn-sekvenser

[redigera | redigera wikitext]

Om man konkatenerar alla Lyndonord med en längd som delar ett givet tal n i lexikografisk ordning får man en de Bruijn-sekvens - en cirkulär följd av tecken sådan att varje sekvens med längden n förekommer en och endast en gång som delsekvens i följden.

Exempel: Om man konkatenerar alla de binära Lyndonorden som har en längd som delar fyra i lexikografisk ordning, d.v.s. (0)(0001)(0011)(01)(0111)(1), till en cyklisk sträng får man 0000100110101111, som innehåller alla strängar av längden fyra, d.v.s. {0000, 0001, 0010, ..., 1111}, en och endast en gång.

Denna metod tillsammans med den effektiva generationen av Lyndonord ger ett effektivt sätt att producera en de Bruijn-sekvens inom linjär tid och logaritmiskt rum.[12]

  1. ^ Lyndon (1954); Berstel & Perrin (2007); Melançon (2001).
  2. ^ [a b] Berstel & Perrin (2007); Melançon (2001).
  3. ^ Melançon (2001).
  4. ^ Berstel & Perrin (2007).
  5. ^ Ruskey (2003) erbjuder detaljer om dessa räkningar av Lyndonord och många besläktade begrepp.
  6. ^ Donald (2010).
  7. ^ Berstel & Pocchiola (1994).
  8. ^ Melançon (2001). Berstel & Perrin (2007) skriver att fastän detta attribueras till Chen, Fox & Lyndon (1958), och följer från resultaten i den artikeln, så uttalades det inte förrän i Schützenberger (1965).
  9. ^ [a b] Duval (1983).
  10. ^ Gil & Scott (2009); Kufleitner (2009).
  11. ^ Brlek et al. (2009).
  12. ^ Enligt Berstel & Perrin (2007) beskrevs sekvensen som genererades på detta sätt (med en annan metod) först av Martin (1934) och sambandet mellan den och Lyndonord observerades av Fredricksen & Maiorana (1978).