Ciclo invarianteDe manera informal, ciclo invariante es algún predicado o condición que se mantiene en cada iteración de un ciclo. Por ejemplo: int j = 9;
for(int i=1; i<10; i++){
j--;
int resul=j+i;
cout<<"i: "<<i<<endl;
if(resul == 9){
cout<<"Cumple el invariente de bucle"<<endl;
}
}
En este ejemplo se cumple la invariante de ciclo para cada iteración, ya que se mantiene la condición siguiente: i + j == 9
Otra invariante más débil es: i >= 0 && i < 10 //(condición terminal)
//o bien
j <= 9 && j >= 0
Las invariantes de ciclo sirven para probar que un algoritmo esté correcto. Propiedades
EjemplosInsertion sort import java.util.Arrays;
class InsertionSort{
public static void main(String[]args){
int[]array={5,2,4,6,1,3};
String out="";
out+=Arrays.toString(array)+"\nResult:\n";
//start
for(int i=1;i<array.length;i++){
int key=array[i];
int j=i-1;
out+="array["+j+"] > key = "+array[j] +" > "+key+" = "+(array[j]>key)+"\n";
while(j>=0 && array[j]>key ){
array[j+1]=array[j];out+=" \tarray["+j+"+1]=array["+j+"]\n";
j--;
}
array[j+1]=key;
}
out+=Arrays.toString(array)+"\n";
System.out.println(out);
}
}
ReferenciasIntroduction to Algorithms. Third Edition. Thomas H. Cormen. 2009. |