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

Pszeudokód vagy algoritmus a legegyedibb értékkel rendelkező „n” halmazok megtalálására?

Tegyük fel, hogy sok egész számkészletem van. Az egész számok száma halmazonként változhat. Olyan 'n' számú halmazt keresek, amelyek között a legtöbb egyedi egész szám van. Ha n=4, akkor az összes elérhető halmaz közül 4 olyan halmazt keresek, amelyek között a lehető legtöbb egyedi egész szám található (tehát nem számítva a duplikátumokat).


  • Tehát a kiválasztott halmazok egyesülésének kardinalitása a lehető legnagyobb legyen? Azért kérdezem, mert nem teljesen világos, hogy mit értesz a lehető legtöbb egyedi egész szám alatt 01.04.2014
  • Amint megértettem, össze akarja vonni az n készletet, majd eltávolítani a duplikációkat, és az új tömbnek a lehető legnagyobb méretűnek kell lennie. 01.04.2014
  • @NiklasB. Nem tudom, mit kell érteni az unió kardinalitása alatt, de Programozó megfelelően leírja. n=4 esetén meg kell találnom azt a 4 készletet, amelyek egyesítésekor a legnagyobb méretűek (feltételezve, hogy az alapértelmezett halmaz viselkedése úgy történik, hogy az összes duplikációt figyelmen kívül hagyja). 01.04.2014
  • Biztos vagyok benne, hogy a problémád NP-nehéz, ha az n nincs javítva 02.04.2014

Válaszok:


1

Ha a halmazok összszáma = N nem túl nagy: a nyers erő megközelítés a következő lenne: vegye figyelembe az (N válasszon n) lehetséges halmazkombinációt, és értékelje ki az általuk alkotott egyedi egész számok számát a "duplikátumok egyesítésével és eltávolításával vektorban, majd ellenőrizze a méretet", amíg minden kiértékelés után a maximumot nem kapja. ebből kiindulva egyre hatékonyabb algoritmusokat készíthet dinamikus programozással vagy sok (N válasszon n) kiiktatásával, például miután talált néhány MAX=K értéket, akkor ha ebben az n halmazban az int-ek teljes száma kisebb, mint K nem értékeli...stb ez egy durva vázlat az induláshoz

01.04.2014
  • n választani k általában rekurzív megközelítés? Van valami forrás az elmém felfrissítésére ezzel kapcsolatban? Emlékszem, valami ilyesmit csináltam valamikor régen... Ha n=3, akkor az első készletet választanám, a másodikat, és a maradékon át ismételném a harmadikat, majd tárolnám a maximumot? Ezután törölje a 2. kijelölést, és válassza ki a következőt, majd ismételje meg a többit a 3. számára? Ha valamelyiknek nagyobb a max, tárolja. Ellenkező esetben törölje a 2. kijelölést, és folytassa lefelé a listát, amíg az összeset ki nem választotta, majd mozgassa le az első kijelölést, és ismételje meg? 02.04.2014
  • A rekurzív módszer az egyik módja ennek, ha jól értem, amit mondtál, annak jónak kell lennie. Egy másik módszer az lenne, ha beágyazott ciklusokkal kemény kódolnád, én a rekurzív módot választanám, mivel ez engedékenyebbé teszi a kódot, ha Ha problémája van vele, próbáljon meg konkrét és pontos kérdést kezdeni ezzel kapcsolatban =) 02.04.2014

  • 2

    Megcímkézted a C++-t. Ha jól értem, akkor az alábbiak azt teszik, amit leírtál. Mivel az std::set amúgy is egyedi értékeket tárol, a C++ kódmegoldás egyszerűvé válik.

    #include <vector>
    #include <set>
    #include <algorithm>
    #include <iostream>
    
    typedef std::set<int> IntSet;
    typedef std::vector<IntSet> IntSetV;
    
    // sort the sets in ascending order, by size
    bool SortBySetSize(const IntSet& s1, const IntSet& s2)
    { return s1.size() > s2.size(); }
    
    void OutputResults(const IntSet& s)
    {  std::cout << "There are " << s.size() << " unique integers in this set" << std::endl; }
    
    void InputData(IntSet& s)
    {
       // routine to input data into s
    }
    
    using namespace std;
    int main()
    {
       size_t nSets;
       cout << "Enter number of sets: ";
       cin >> nSets;
    
       IntSetV VSets(nSets);
       //...  input to fill in the sets in the vector
       for_each(VSets.begin(), VSets.end(), InputData);
    
       // sort the sets by size
       std::sort(VSets.begin(), VSets.end(), SortBySetSize);
    
       // VSets now contains the N largest set of unique integers.
       for_each(VSets.begin(), VSets.end(), OutputResults);
    }
    

    Ha emlékeznie kell az eredetileg bevitt értékekre, tárolja

    std::pair<std::vector<int>, IntSet> PairSet;
    std::vector<PairSet> IntSetV;
    

    A pár első értéke az eredeti vektor, a második az a halmaz, amely a vektorban szereplő számokat reprezentálja. Ezután az általános kódmegoldás használható a szükséges változtatásokkal.

    01.04.2014
  • De lehet, hogy a legnagyobb N kiválasztása nem az optimális megoldás, ezért ez nem működik. Például N=2 és VSets = [{1,2,3},{1,2,3},{1,2},{3,4}]. Jobb a {1,2,3} és a {3,4} kiválasztása 02.04.2014
  • I am looking for 'n' number of sets that has the most unique integers between them. Kódoltam, hogy mit is értettem ez mit jelent. N halmazod van (vektorban tárolva), és mivel a halmazok amúgy is egyedi számokat tárolnak, csak a size() hívásra van szükséged. Vagy hiányzik valami? 02.04.2014
  • egyedi egész számok között, fogalmazhattam volna jobban is, de nem tudom, hogyan kell ezt csinálni. Alapvetően Niklas fenti megjegyzése megmagyarázza. Míg az első 2 halmaz a legnagyobb, mindkettő pontosan ugyanazt a számot tartalmazza: 1, 2, 3. Tehát összesen 3 egyedi egész szám van. De ha az utolsó 2 halmazt választja, akkor 4 egyedi egész számod lesz: 1, 2, 3, 4 02.04.2014
  • Ezután írja be az összes számot egy szuper készletbe, és ez a válasz. Nem? 02.04.2014
  • Bizonyos értelemben igen, de nyomon kell követnem a maximális méretet és a hozzájáruló készleteket. 02.04.2014
  • Úgy gondolom, hogy az általam írt kód nagy részét kihasználhatja a maximális méret, az eredeti értékek, az új készletek és a maximális készlet nyomon követésére. A probléma az, hogy több memóriát használ. 02.04.2014

  • 3

    Ez az NP-nehéz maximális lefedettségi probléma. A mohó algoritmus (az unió növelése a legtöbb új elemet tartalmazó halmazzal) olyan megoldást ér el, amely az optimum 1-1/e (~ 63%) tényezőjén belül van. Bár a maximális lefedettség NP-nehéz, az egészszámú programozás gyakran talál optimális megoldást a „természetes” példányokra (szemben az intelligensen megtervezett NP-keménységcsökkentéssel). A fő kihívás egy megoldó integrálása lenne; konkrétan a megoldó megvalósítja az összes releváns algoritmust. A legegyszerűbb készítmény a maximális fedés érdekében ez.

    maximize sum_{elements e} x_e
    subject to
    for all elements e, x_e - sum_{input sets S such that e in S} y_S <= 0
    sum_{input sets S} y_S <= n
    for all elements e, 0 <= x_e <= 1
    for all input sets S, y_S in {0, 1}
    

    A x_e változó jelentése az, hogy a x_e megjelenik-e az unióban. A y_S jelentése 1, ha S szerepel az unióban, és 0 egyébként.

    02.04.2014
    Ú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..