Længste plateau En klassisk problemstilling (Gries, 1981) - og her i Java!!! Denne opgave drejer sig om at bestemme længden af det længste plateau i en sekvens. Et plateau i en sekvens er en delsekvens, hvor elementerne er ens. Det længste plateau er den længste delsekvens, hvor alle elementerne er ens. I denne opgave er sekvensen givet ved et array. Elementerne er heltal, og vi betragter kun et sorteret array. Ex.: I arrayet int[] a = {1,2,2,3,4,5,5,5,6,7,8,8,8,8,9,9}; er det længste plateau {8, 8, 8, 8}, og har længden 4. Nedenfor er angivet et lille program, som afprøver metoden longestPlateau(-).
public static void main(String[] args){ int[] a = {1,2,2,3,4,5,5,5,6,7,8,8,8,8,9,9}; int n= a.length; System.out.println("Det længste plateau har længden: ” + longestPlateau(a,n)); } public static int longestPlateau( int[] a, int n) { int p= 0; int i= 0; //etablering af invariant while(i!=n) { //Bevarelse af invarianten??? i++;//skridt mod terminering }//while return p; } Postbetingelse: p == længden af længste plateau i a[0..n-1] Invariant: (erstat konstant med var.) 0<=i<=n && p == lgd. af hidtil længste plateau i a[0..i-1]. Vagt i!=n
public static int longestPlateau(int[] a, int n){ //pre n>0 && a er sorteret (<=) //post a[0..n-1] har et plateau af lgd. p // && a[0..n-1] har ikke et plateau af lgd. p+1 int p= 0; int i= 0; while(i!=n) {//invariant: 0<=i<=n && p == lgd. af længste // plateau i a[0..i-1] if(a[i]==a[i-p]) p++; i++; }//while return p; } a: 0n-1ii-p p
Øvelse Binærsøgning - iterativ løsning: Skriv koden på den hårde måde. Kan du få det til at virke? Prøv at formulere specifikationer (anvend evt. array-billeder, så specifikationen kun bliver "halvformel"). Prøv at formulerer en invariant, og skriv så algoritmen vha. checklisten for løkker. Var det ikke meget nemmere?