Hirdetés

Keresés

Új hozzászólás Aktív témák

  • pmonitor

    aktív tag

    válasz sztanozs #15629 üzenetére

    >Alapvetően ez nem egy programozási fórum, vsz nem fogsz találni túl sok fórumozót, akit ez különösképp megmozgatná

    Igazad van. De azért úgy néz ki, hogy olvassák(nem tudom, csak gondolom). Abból gondolom, hogy azért a google az első oldalon hozza az oldalam az "1D vágás" kulcsszóra(ezúton is szeretném megköszönni azoknak, akik meglátogatták az oldalam). Igaz, nem csak ezen a fórumon vagyok, de azért a legaktívabb itt vagyok.
    Mondjuk azt látom, hogy itt a rendszeres válaszadók nagyon nagy többségét nem érdekli a konkrét problémák kóddal, vagy legalább pszeudokóddal való megoldása). Ez nem feltétlenül baj. Ráadásul azért van kivétel is. Egyébként az "ország legnagyobb fejlesztői portál"-jának nevezett fórumon sem volt szokásban a kód/algoritmus adása a rendszeres válaszadók között. Én kivétel voltam. Amire tudtam válaszolni, arra válaszoltam. Csak a moderátor ott is a "rizsázást" tartotta "a priori"-nak. Mondjuk részben meg lehet érteni olyan helyen, mint ez a fórum, ahol alapvetően nem a programozás a fő irányvonal. De sajnos ott is csak ez megy. Mondjuk abból a szempontból meg lehet érteni, hogy ha valaki viszonylag hosszabb kódot ad, akkor egyrészt abból ki lehet venni, hogy valóban van-e köze a programozáshoz(tehát gyakorló programozó-e). Lásd joysefke-t, aki viszonylag rövid idő alatt összeállított 1 kódot, OOP elven. Másrészt viszont az is kijön, ha valakinek lövése sincs az egészhez. Ezért nem adnak kódot/pszeudokódot, még ha tudják is a választ. Meg amúgy is könnyebb a rizsázás. De ez a felfogás szerintem nem lenne megengedhető egy magát fejlesztői oldalnak tituláló oldalon. Itt még azért jobban elfogadható.
    Ugyanakkor nem tagadom, hogy az esetleges olvasók miatt linkeltem be az oldalam ide többször is. De gondolom ez nem bűncselemény. :U A fórumozásnak van rossz és jó oldala is.

  • Marky18

    aktív tag

    válasz sztanozs #15629 üzenetére

    egyetemi jegyzet vs optimalizált kód.
    Szerintem a legfontosabb az, hogy ellassa a kod a feladatat. Hiaba irod meg a leheto legoptimalisabb low-level eljarast egy adott problemara, ha az egesz feladat 1%-at oldottad meg a rendelkezesre allo ido nagy resze alatt, illetve hiaba irnak brutalgyors peldakat az egyetemi jegyzetben, ha egy tapasztalt fejlesztonek is orakba telik kibogozni, hogy mi tortenik. Az OOP valahol ennek menten jott letre, hogy olvashato, ujrahasznalhato kodot irjunk es ne csak egy szakallas szaki tudja, hogy mukodik az adott kodreszlet.

    Azt sem szabad elfelejteni, hogy a low-level problemak nagy resze mar meg lett oldva evtizedekkel ezelott, nekunk csak hasznalni kell a megirt kodokat, hogy user kozeli problemakat oldjunk meg veluk. Hardverkozeli kodot C-ben is ASM-ben irnak, webalkalmazast pedig C#-ban, Javaban, mert nem akarunk az OSI modellben turkalni, hogy egy GET requestet lefuttassunk. Mas retegbeli problema, mas retegbeli eszkozoket kivan.

  • pmonitor

    aktív tag

    válasz sztanozs #15629 üzenetére

    Ez a kód:
    static void Teszt_5(char[] arr)
    {
    char[] arr2 = (char[])arr.Clone();
    int size = arr.Length;
    QuickSort(arr2, 0, size - 1);
    //Array.Sort(arr2);
    int n = arr2.Length;
    int i, j;
    char temp;
    //for (i = 0; i < n; ++i) arr2[i] = i + 1;
    while (true)
    {
    // kiirjuk az aktualis permutaciot
    /*for (i = 0; i < n; ++i) Console.Write("{0} ", arr2[i]);
    Console.WriteLine("");*/

    // megkeressuk, hol kezdodik az utolso monoton csokkeno reszsorozat
    for (i = n - 2; i >= 0 && arr2[i] >= arr2[i + 1]; --i) ;

    // ha a teljes sorozat monoton csokkeno, akkor vegeztunk
    if (i < 0) break;

    // a csokkeno reszsorozat elotti elemet ki kell cserelnunk a reszsorozatban nagysag szerint rakovetkezovel
    for (j = n - 1; arr2[j] <= arr2[i]; --j) ;

    temp = arr2[i]; arr2[i] = arr2[j]; arr2[j] = temp;

    // tovabbra is monoton csokkeno a reszsorozatunk, forditsuk meg, hogy monoton novekedo legyen
    for (j = i + 1; j < n + i - j; ++j)
    {
    temp = arr2[j]; arr2[j] = arr2[n + i - j]; arr2[n + i - j] = temp;
    }
    }
    }

    Ennek a kódnak:
    static void IsmPermutacio(char[] tomb2, int[] N, int n, int[] W1, int s, int i)
    {
    int[] V = new int[n];
    int[] W = new int[n];
    CopyMemory(W, W1, (uint)(n * intSize));
    //Array.Copy(W1, W, n);
    if (i == 0)
    {
    for (int l = 0; l < s; ++l) W[l] = -1;
    }
    if (s != 0)
    {
    bool ind = true;
    do
    {
    Kombinacio(V, s, N[i], ref ind);
    if (!ind)
    {
    Betesz(N[i], n, V, W, i);
    IsmPermutacio(tomb2, N, n, W, s - N[i], i + 1);
    Kivesz(W, n, i);
    }
    } while (!ind);
    }
    else
    {
    Betesz(N[i], n, V, W, i);
    //*****************************************************
    /*for (int q = 0; q < n; ++q) Console.Write(tomb2[W[q]]);
    Console.WriteLine("");*/
    //*****************************************************
    for (int l = 0; l < n; ++l) W[l] = -1;
    }
    }

    static void Kombinacio(int[] V, int n, int k, ref bool ind)
    {
    if (ind)
    {
    for (int i = 0; i < k; ++i) V[i] = i;
    ind = false;
    return;
    }
    for (int i = k - 1; i > -1; --i)
    {
    if (V[i] < n - k + i)
    {
    ++V[i];
    for (int j = i + 1; j < k; ++j) V[j] = V[j - 1] + 1;
    return;
    }
    }
    ind = true;
    }

    static void Betesz(int ni, int n, int[] V, int[] W, int i)
    {
    int j = -1, l = 0;
    for (int p = 0; p < ni; ++p)
    {
    while (l < n)
    {
    if (W[l] == -1) ++j;
    if (j == V[p])
    {
    W[l] = i;
    break;
    }
    ++l;
    }
    }
    }
    static void Kivesz(int[] W, int n, int i)
    {
    for (int l = 0; l < n; ++l) if (W[l] == i) W[l] = -1;
    }

    Nem az optimalizálása, hanem teljesen más(egyszerűbb) algoritmus.

    És sztem az első algoritmus érthetőbb is.

Új hozzászólás Aktív témák