Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

Diskuze: Triediaca analýza

C# .NET .NET (C# a Visual Basic) Triediaca analýza American English version English version

Aktivity (1)
Avatar
Štefan Pružinský:8.3.2015 19:28

Čaute, mám pole so 117 prvkami, minimom 0 a maximom 765. Chcel by som sa opýtať, ktorý triediaci algoritmus je v tomto prípade najvhodnejšie použiť. Ide mi hlavne o Counting sort vs. Insertion sort. Na tento výpočet som hľadal nejakú aplikáciu, avšak nič vhodné som nenašiel. Vopred ďakujem za odpoveď.
PS. Nie je to úloha do školy, potrebujem to do svojej aplikácie.:)

Editováno 8.3.2015 19:30
Odpovědět 8.3.2015 19:28
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:8.3.2015 20:08

Nemá cenu vybírat vhodný algoritmus pro 100 prvků. Použij normálně ten co je implementovany v .NETu.

Btw, ani jeden ze tvých algoritmů bych rozhodně nepoužil. Insertion sort je jednoduše pomalý a na counting sort je to velký rozsah čísel. V dnešní době se používa QuickSort. Popřípadě jestli máš pole, které má velikost v řádek desítek a není uvnitř jazyku už nějaký uvnitř, tak si rychle naimplementuješ bubble sort.

 
Nahoru Odpovědět 8.3.2015 20:08
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:8.3.2015 20:19

Array.Sort, použiť nemôžem, pretože tie čísla ťahám zo string poľa, kde sa jeden string skladá z 9 charov, ktoré rozdelím na 3 časti, naparsujem do int a sčítam. Následne s tým číslom pracujem.
Inak prečo práve Bubble, veď Insertion je rýchlejší než Bubble.

Nahoru Odpovědět 8.3.2015 20:19
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:8.3.2015 20:26

V jaké části toho celého procesu to pole sortuješ?

 
Nahoru Odpovědět 8.3.2015 20:26
Avatar
Štefan Pružinský:8.3.2015 20:44

Príklad.:

pole[0] = "000051255";
...
string prvok = pole[0];
string memory = "";
int sucet = 0;

//tá 000 proste vyhodí 0, 051 - 51, 255 - 255
memory += prvok[0];
memory += prvok[1];
memory += prvok[2];
sucet += int.Parse(memory);
memory = "";

memory += prvok[3];
memory += prvok[4];
memory += prvok[5];
sucet += int.Parse(memory);
memory = "";

memory += prvok[6];
memory += prvok[7];
memory += prvok[8];
sucet += int.Parse(memory);
memory = "";

Ten kód hore, je funkcia pomocou ktorej, vytvorím v potrebný okamžik súčet tých troch čísel. A teda - triedim pole stringov, na základe súčtu troch čísel nachádzajúcich sa v danom stringu.

Editováno 8.3.2015 20:47
Nahoru Odpovědět 8.3.2015 20:44
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:8.3.2015 21:39

No jasně, ale v jaké části to sortuješ?

Jinak pár připomínek k tomu kódu.

Máš string, který se skládá z 9 číslic. Ty rozdělíš po 3 číslicích a ty sečteš. Kdybych se bavil o výkonu, tak tam vytváříš snad 10 instancí úplně zbytečně, protože string je immutable.

int soucet = int.Parse(pole.Substring(0, 3)) + int.Parse(pole.Substring(3, 3)) + int.Parse(pole.Substring(6, 3));
 
Nahoru Odpovědět  +1 8.3.2015 21:39
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:8.3.2015 21:52

Máš pravdu, ale bol to len príklad. V skutočnosti som to do programu ešte neimplementoval, ale každopádne dobrá pripomienka.:)
Inak prečo ten Bubble?

Nahoru Odpovědět 8.3.2015 21:52
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:8.3.2015 22:38

Z hlediska efektivity programování ho máš napsaný za pár minut. A při třídění 100 prvků je to celkem jedno, proto :) Jinak co má být výsledkem? Ty jednotlivé součty máš, které si vypočítal?

Editováno 8.3.2015 22:38
 
Nahoru Odpovědět 8.3.2015 22:38
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:8.3.2015 23:03

Robím tohto machra: http://www.itnetwork.cz/…198e32c9c602. To zotriedenie použijem na zotriedenie palety (poľa) farieb podľa sýtosti (tmavosti). Malo by platiť - čim menší súčet, tým tmavšia farba (čierná - 0,0,0).

Nahoru Odpovědět 8.3.2015 23:03
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:10.3.2015 18:17

Vytvoříš si normálně třídu, která reprezentuje ty 3 barvy. A pak máš několik možností, jak rozsortovat nějakou kolekci. Já osobně bych použil implementaci IComparable. Viz kód níže.

public sealed class Color : IComparable<Color>
{
    public int R { get; private set; }
    public int G { get; private set; }
    public int B { get; private set; }

    internal int Value
    {
        get { return this.R + this.G + this.B; }
    }

    public Color() : this(0, 0, 0) { }

    public Color(int r, int g, int b)
    {
        this.R = r;
        this.G = g;
        this.B = b;
    }

    public int CompareTo(Color other)
    {
        int value = Value;
        int otherValue = other.Value;

        if (value > otherValue)
            return 1;
        else if (value < otherValue)
            return -1;
        else
            return 0;
    }
}

Použití

Color[] colors = new Color[]
{
    new Color(0,100,200),
    new Color(200,100,200),
    new Color(200,200,200),
    new Color(100,100,100),
    new Color(0,0,0),
    new Color(200,200,0)
};
for (int i = 0; i < colors.Length; i++)
    Debug.Write(colors[i].Value + " ");
Debug.WriteLine(null);
Array.Sort(colors);
for (int i = 0; i < colors.Length; i++)
    Debug.Write(colors[i].Value + " ");
Debug.WriteLine(null);
Akceptované řešení
+20 Zkušeností
Řešení problému
 
Nahoru Odpovědět  +1 10.3.2015 18:17
Avatar
Odpovídá na Jan Vargovský
Štefan Pružinský:12.3.2015 9:28

Mal som to už ako pole Stringov, tým pádom som to poriešil takto:

public string[] ZoradFarby()
{
    string[] poleColor = new string[poleFarieb.Length];
    Array.Copy(poleFarieb, poleColor, poleFarieb.Length);
    string temp;
    for (int i = 0; i < poleColor.Length; i++)
    {
        for (int j = i; j < poleColor.Length; j++)
        {
            if (int.Parse(poleColor[j].Substring (0, 3)) + int.Parse(poleColor[j].Substring(3, 3)) + int.Parse(poleColor[j].Substring(6,3)) < int.Parse(poleColor[i].Substring (0, 3)) + int.Parse(poleColor[i].Substring(3, 3)) + int.Parse(poleColor[i].Substring(6,3)))
            {
                temp = poleColor[j];
                poleColor[j] = poleColor[i];
                poleColor[i] = temp;
            }
        }
    }
    return poleColor;
}

Tvoje riešenie je však z programátorského hľadiska určite lepšie. Diki

Nahoru Odpovědět 12.3.2015 9:28
Najefektívnejším spôsobom debuggingu je modlitba. :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Štefan Pružinský
Jan Vargovský:12.3.2015 13:59

Np :)

David Čápka Podle čeho se určuje jestli dostanu bod nebo ne? :)

 
Nahoru Odpovědět 12.3.2015 13:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.