📑 Table of Contents

De 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

editar
  • Inicialización. Es verdadera desde la primera iteración.
  • Mantenimiento. Es verdadera después de una iteración del ciclo. Se mantiene verdadera antes de la iteración próxima.
  • Terminación. Cuando finaliza el ciclo, la invariante aporta una propiedad que indica que el algoritmo es correcto.

Ejemplos

editar

Insertion 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);
	}
}

Referencias

editar

Introduction to Algorithms. Third Edition. Thomas H. Cormen. 2009.

https://web.archive.org/web/20130721040913/http://espacio.redsaltillo.net/programacion/insertionsort-algorithm

📚 Artikel Terkait di Wikipedia

X PixMap

XFACE_ncolors 2 #define XFACE_chars_per_pixel 1 static char *XFACE_colors[] = { "a", "#ffffff", "b", "#000000" }; static char *XFACE_pixels[] = {

C Sharp

objeto. Un método static no tiene una referencia this. Un método static puede llamar solamente a otros métodos static. Un método static solamente debe tener

Haxe

precisa en Haxe: function multiplesParametros(threedimensionalarray:Array<Array<Array<Int>>>, stringval:String, boolval:Bool) {} // Valor entero opcional

XHarbour

String, Fecha, FechaHora, Lógico, Numérico, Puntero, y 4 tipos complejos: Array, Objeto, CodeBlock, y Hash. Un escalar almacena un valor sencillo, como

Destructor (informática)

print( "~foo()" ); } void print( std::string const& text ) { std::cout << static_cast< void* >( this ) << " : " << text << std::endl; } /* Deshabilitado

Paradoja del cumpleaños

365 {\displaystyle p=\left\{{\begin{array}{ll}{\frac {365!}{365^{n}(365-n)!}},&1\leq n\leq 365\\0,&n>365\end{array}}\right.} Ahora, 1 - p es la probabilidad

Sistema de todos contra todos

Rotación estilo círculo $fixed = array_shift($equipos); $last = array_pop($equipos); array_unshift($equipos, $fixed); array_splice($equipos, 1, 0, $last);

Bibliotecas Boost

libros sobre C++, Nicolai Josuttis también ha contribuido la biblioteca array de Boost en 2001. Alrededor de 3.000 personas están suscritas a la lista