WebHU - Programozási kérdések és válaszok

Rekurzió az Egg Drop Puzzle-ban

N számú tojás és épület van, amelynek k emelete van. Írjon egy algoritmust annak megállapítására, hogy hány cseppnyi minimális mennyiség szükséges ahhoz, hogy ismerje azt a padlót, ahonnan a tojás leejtése esetén eltörik.

A megoldásom az volt, hogy a padlókat sqrt(k) méretű blokkok csoportjaira bontottam. Például, ha k = 100, akkor ellenőrizni fogom, hogy a tojás eltörik-e a 10., 20., 30....100. emeletről, majd lineáris keresést fogok végezni ebben a blokkban. A megoldás O(sqrt(k)) lesz.

A dinamikus programozási megoldás, amit látok, a következő:

When we drop an egg from a floor x, there can be two cases (1) The egg breaks (2) The egg doesn’t break.

1) If the egg breaks after dropping from xth floor, then we only need to check for floors lower than x with remaining eggs; so the problem reduces to x-1 floors and n-1 eggs
2) If the egg doesn’t break after dropping from the xth floor, then we only need to check for floors higher than x; so the problem reduces to k-x floors and n eggs.

Since we need to minimize the number of trials in worst case, we take the maximum of two cases. We consider the max of above two cases for every floor and choose the floor which yields minimum number of trials. 
     k ==> Number of floors
     n ==> Number of Eggs
      eggDrop(n, k) ==> Minimum number of trials needed to find the critical
                        floor in worst case.
      eggDrop(n, k) = 1 + min{max(eggDrop(n - 1, x - 1), eggDrop(n, k - x)): 
                     x is floors in {1, 2, ..., k}}

Nem tudom, miért használjuk a eggDrop(n, k - x)-t a Floor above x with k-x kiszámításához, mivel k emeletet ad x alatt és nem pontosan X feletti szintet?
Például x = 6-on
eggDrop(10, 2) = 1 + min{max(eggDrop(2 - 1, 6 - 1), eggDrop(2, 9 - 6))
Ad,
eggDrop(10, 2) = 1 + min{max(eggDrop(1, 5), eggDrop(2, 3))
Az eggDrop(2, 3)) alapvetően egy épület 3 emelettel és 2 tojással, és nem emeletekkel a 6. emelet felett.

Köszönjük!

Forrás: https://www.geeksforgeeks.org/dynamic-programming-set-11-egg-dropping-puzzle/



Válaszok:


1

Nem számít, milyen padlók vannak. Ami számít, az az emeletek száma, amelyeket figyelembe kell vennünk. Ha 9 emeletünk van, és egy tojás túléli a 6. emeletet, akkor a 6 feletti 3 emeletet kell figyelembe vennünk: a 7., 8. és 9. emeletet. Egy másik módja ennek az, hogy a 7-9. emeletek tesztelése pontosan ugyanaz, mint az 1-3. emeletek tesztelése (legrosszabb esetben a cseppek számát tekintve).

08.08.2018
  • @Kartik Nem a teszt tényleges eredményeire gondolok. Ha már tudja, hogy a kívánt szint 7-től 9-ig lesz, akkor ez lényegében ugyanaz a probléma, mintha tudná, hogy a tojás eltörik az 1-től 3-ig. 08.08.2018

  • 2

    Nos, hány emelet van a 6. emelet felett? Ez lenne a 3 (7., 8., 9. emelet). Nem számít, milyen magasan vannak ezek az emeletek, ha megpróbálja kitalálni, ki a tettes.

    Hadd hozzak egy másik példát referenciaként. Tegyük fel, hogy egy bináris keresést próbál végrehajtani egy rendezett listán, hogy megnézze, létezik-e elem.

    Példalista: values = [0, 1, 2, 3, 4]

    Tegyük fel, hogy a 3-at keresi. Az első lépés az lenne, hogy megnézzük a középső elemet, v[2], és összehasonlítsuk a 3-mal. Mivel a 3 nagyobb, mint v[2] = 2, a binarySearch(a1) elemet rekurzívan meg kell hívnia a v[3 - 4] altömbben.

    Mi történik a rekurzív hívásban? Ezen a ponton ez alapvetően egy alapeset, tehát a1[0] = 3-nak nézhet ki. Az összehasonlítás működik, így a TRUE értéket adja vissza.

    Ebben a példában a binarySearch hívása a v[3 - 4] alrendszerben megegyezik a eggDrop(2, 3) hívásával. Amikor a a1[0]-re hivatkozik, akkor valójában a v[3]-re hivatkozik. Hasonlóképpen, az 1. emelet a eggDrop rekurzív hívásában valóban a szülőhívás 7. emeletére hivatkozik. Az indexek „reset”, de igazából ugyanarra az értékre vonatkoznak.

    08.08.2018
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..