loop invariáns

A programozók gyakran képviselnek ciklusok általában konkrét célja: megtalálni az elemet a kívánt tulajdonságokkal, sort, stb De hogyan győződjön meg róla, hogy a cél elérhető végrehajtása nélkül a ciklus maga ..? Ez segít nekünk, hogy hurok invariáns.

Hurok változatlan - ezt a kijelentést, utalva a változókat a program, amely továbbra is igaz az elején és a végén a végrehajtás egyes iteráció.

Tekintsük használata hurok invariáns példája a keresési index a legkisebb eleme egy egész tömb.

Tegyük fel, hogy egy tömb a. álló N elemek. Bemutatjuk a változó TemporarySmallest (az index az adott pillanatban a legkisebb), és állítsa értéke 0 a vizsgálat megkezdése előtt. Ezután fogjuk összehasonlítani a [TemporarySmallest] sorba kötött [1], a [2]. egy [n-1]. Ha úgy találja, hogy a [TemporarySmallest] több, mint bármelyik a [k]. majd frissítse az értéket TemporarySmallest. Jelöljük a változás nextToCheck index a tétel kell ellenőrizni.

Hurok invariáns fog kinézni:

  1. TemporarySmallest belül van [0, nextToCheck),
  2. minden k a [0, nextToCheck) hajtjuk [K]> = A [TemporarySmallest].

[A, B) minden olyan egész számok, hogy az intervallumon tól b-ig. beleértve a. de ide nem értve a b.

Más szavakkal, azt a legkisebb elemet a tömb egy ismert index TemporarySmallest vizsgáljuk a tartományon belül [0, nextToCheck). Ez az állítás igaznak kell lennie az elején és a végén minden iterációban.

Inicializáljon változókat egy változatlan, úgy, hogy igaz volt, mielőtt a hurok:

-- indexe 0. legkisebb elem és az egyetlen elem a vizsgált [0,1). Amíg az invariáns megmarad.

Minden lépésnél nextToCheck ciklus 1-gyel nõ, és ha szükséges, módosítja TemporarySmallest:

-- úgy, hogy a hurok invariáns igaz marad a végén minden iteráció. Következésképpen, a végén a ciklus változatlan marad - a legkisebb eleme a tömb egy ismert index TemporarySmallest Meg kell vizsgálni a tartományon belül [0, nextToCheck).

Az a feltétel, lezárás ciklus hiánya a tömb elemeinek vizsgálandó: nextToCheck == n. Így, a hurok invariáns megőrzését biztosítja számunkra, hogy a végén a ciklus (a kimerültség a elemek vizsgálandó) található az index a legkisebb elem TemporarySmallest - elért a cél egy ciklus. Ez felírható

loop invariáns Uslovie_okonchaniya_tsikla => A cél a ciklus

Ahelyett, hogy a végén feltételeket, akkor a feltétel a hurok. A mi esetünkben ez: nextToCheck

loop invariáns ! (Uslovie_vypolneniya_tsikla) ​​=> A cél a ciklus

Így választja invariáns ciklus, és biztosítja annak megőrzésére, tudjuk garantálni a cél elérésének végrehajtása nélkül a hurokban.

Megjegyezzük, hogy a használata hurok invariáns külön lehet vizsgálni ismétlés, mivel mindegyikük kezdődik ugyanazon állapotban - az igazság hurok marad, és ebben az értelemben nem tartalmaz „nyom” a korábbi iteráció. Ennek eredményeként az az érv, hogy vajon a ciklus fut rendesen, csökken annak ellenőrzésére, hogy a hurok invariáns igazság helyreáll végén egy iteráció.

Tesztelje tudását a készítési ciklusok:

  • A hurok invariáns igaz ciklus előtt (ha inicializálni nextToCheck és TemporarySmallest)?
  • Bármely iterációs ha a hurok invariáns igazi belépő a test a hurok, és kilép belőle?
  • Vajon a mozgás vége felé a hurok (ha nextToCheck indexet növeljük a hurok test)?
  • Akár hurok invariáns megőrzése vezet, és véget feltételeket a cél elérése érdekében?

Összeállításakor a ciklus kényelmes lehet a koncepció bizonytalan területek. számítási módszerek alkalmazott matematika. A tartomány a paraméterek változása a probléma (ebben a példában: [0, n)) lehet két részre osztható: a vizsgált régió (amelyre talált TemporarySmallest [0, nextToCheck)) és a régió a bizonytalanság ([nextToCheck, n)) .. Meg kell lennie egy ciklust, hogy mindegyik ismétlésnél a bizonytalanság tartományban csökkent.

Térjünk vissza a példa. Elején az első iteráció a vizsgált régió egy pont 0, és a terület a bizonytalanság [1, n). A második lépésben a régió a bizonytalanság csökken [2, n). - A harmadik .. a [3, n), stb, míg végül kiderült, hogy az üres halmaz, amely nem jár pont.

Vegyünk egy másik példát - Válogatás Rendezd növekvő sorrendbe. Tegyük fel, hogy szeretné rendezni a tömb egy n egész számok. Mi található a legkisebb elemet, és helyezze be a végén a tömb, a helyzet az n-1. Ezután a megmaradt elemek újra választhat a legkisebb, és tegyük N-2 helyzetben, és így tovább. D. A i-edik iteráció rendezve elemek fogja elfoglalni pozíciókat i-től n-1. és a fennmaradó nem kiválasztott - 0 és i-1.

Ahhoz, hogy megtalálja azt a legkisebb elemet FindMin használatra funkciót (int a [], int n). Visszaadja az index a legkisebb elemet, és van írva alapján a fenti példában. Bemutatjuk a változó numSorted. számát jelző rendezett tömbben elemek.

Hurok invariáns van:

  1. numSorted legkisebb tömb elemeit csökkenő sorrendbe rendezettek intervallumon [N-numSorted, n),
  2. a fennmaradó elemeit a tömb a [0, n-numSorted).

Közvetlenül azelőtt, hogy inicializálja a ciklus érték numSorted:

így hurok invariáns igaz.

Minden iterációszámot numSorted növekszik. Ahhoz, hogy ezt elérjük, a legalacsonyabb az első kiválasztott [0, n-numSorted) szelektálatlan elemek és cserélték (a swap függvény ()) c N-numSorted elem

Így a rendezve „farok” a tömb minden egyes alkalommal meg van hosszabbítva egy elem, és a rendezetlen „fej” csökken.

A ciklus befejeződik elérésekor numSorted == n.

Mi olvasni

Kapcsolódó cikkek