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:
- TemporarySmallest belül van [0, nextToCheck),
- 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: Ö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: 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