Gå til innhold

PHP challenge 6: Leksikon sortering (update 2)


Anbefalte innlegg

Trikset som ble brukt heter dynamisk programmering, man bygger opp mange små løsninger underveis.. La oss ta et enkelt eksempel..

 

 

1 2 3 4

5 6 7 8

9 1 2 3

4 5 6 7

 

La oss begynne på andre rad og ta for oss hvert element..

Vi begynner med 5.. hva er beste måten vi kan nå 5 på? Vi kan nå 5 fra 1 og 2 på raden ovenfor.. Med andre ord, beste oppsamlet verdi til 5 er til nå 5+2.. Så nå vet vi at i første rute på andre rad kan vi få totalt 7.

 

6 kan nås fra 1,2,3.. 3 er klart best.. 6+3 er maks verdi vi kan nå denne ruten på. 7 kan nås fra 2,3,4.. best er 4+7=11.. 8 kan nås fra 3 og 4.. best er 4+8=12..

 

Vi har nå samlet opp verdiene.

 

1 2 3 4

7 9 11 12

 

Neste rad.. 9.. hva er beste mulig oppsamlede sum man kan få til nå. Jo, 9 + max(7,9) fra raden ovenfor.. Neste element er 1.. kan nås fra 7,9,11.. osv..

 

1 2 3 4

7 9 11 12

18 12 14 15 <-- beste sum vi kan oppnå på elementene på 3. rad, vi vet ikke hvordan i kommer oss dit, men vi vet det er mulig..

 

Siste rad:

1 2 3 4

7 9 11 12

18 12 14 15

22 23 21 22

 

Beste rute igjennom kvadratet har sum 23.. Vi vet ikke hvor ruten går, men vi vet den finnes og at den har denne verdien.

 

Som en liten ekstra, det går an å regne ut ruten fra resultatet vi nettopp fant, ved hjelp av:


// $data er opprinnelig 2d-array..
// $values er utregnet max for hvert nivå som over..
function findroute($data, $values) {

$row = count($values) - 1;
$elem = array_search(max($values[$row]), $values[$row--]);

$path[] = $elem;

while ($row >= 0) {
	foreach (array(-1,0,1) as $offset) {
		if (($values[$row][$elem-$offset] + $data[$row+1][$elem])  == $values[$row+1][$elem]) {
			$elem = $elem - $offset;
			$path[] = $elem;
			$row--;
		}
	}
}

print_r(array_reverse($path));

}

Endret av peros2k
Lenke til kommentar
Videoannonse
Annonse

Hvis det blir enda en oppgave snart så kan jeg dessverre ikke benke den heller. Jeg skal hjem å feire jul med familien, så noen får overta.

 

Men hva med en liten (enkel) oppgave i mellomtiden? Feks. leksikon sortering av lange arrays bestående av strenger? De fleste algoritmene som da ble utivklet i første sorteringsoppgaven vil være ganske ueffektive på lange arrays, og de fleste av de vil ikke fungere på strenger heller. God ide? Dårlig ide?

Lenke til kommentar
er det meningen at funksjonen skal printe ut resultatet men beholde key->value assosiasjon som natsort? eller skal funksjonen returnere et array med sorterte elementer i form av naturlig sortering?

Sånn, det var noe jeg hadde glemt å spesifisere. Jeg synes at vi kan droppe key-value assosiasjonene, ellers burde funksjonen returnere den sorterte arrayen, sortert etter natural order reglene.

Lenke til kommentar
Så eksempler på ting vi skal sortere er f.eks

123
abc123
AB12cd
ab1dcd

 

Skal de da sorteres aB3, Ab3 eller ... ?

Det er bare å sortere de slik som natsort sorterer de, borsett fra at du slipper å bry deg om key-value relasjoner.

 

Jeg anbefaler at dere graver litt i php manualen :) (finnes mange fancy funksjoner som kommer at spare dere masse tid)

Endret av MC2
Lenke til kommentar
  • 2 uker senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...