Kezdőoldal » Számítástechnika » Programozás » Hogyan lehetne tovább optimali...

Hogyan lehetne tovább optimalizálni ezt a megoldást?

Figyelt kérdés

Az a feladat, hogy tömbben kell megkeresni a legtöbbször előforduló elemet. A nyelv igazából mindegy, Pythonban írtam, de megértek mást is.


A tömbnek ilyen tulajdonságai vannak:

- minimum 3 elemű, maximum 10 000 elemű

- az elemek a [0, tömb mérete[ intervallumból vehetnek fel értékeket, tehát 100 elemű tömbben például 0-99 elemek lehetnek, 5000 eleműben 0-4999 stb.

- mindig van jó megoldás és mindig csak egy jó megoldás van, tehát a legtöbbször előforduló elemen kívül minden más elem kevesebbszer fordul elő


Példa és megoldás:

[4, 0, 0, 3, 1] - 0 (kétszer fordul elő)

[4, 0, 9, 2, 4, 4, 9, 0, 3, 7] - 4 (háromszor fordul elő)

[1, 1, 2] - 1 (kétszer fordul elő)



A megoldásom 2 körös, első körben végig megyek a tömbön és dictben (más nyelvekben hashmap, hashtable) letárolom az elemeket az előfordulásukkal.

A második kör pedig egy maximum keresés a dictben, tehát megkeresem a legnagyobb előfordulást és visszaadom az ahhoz tartozó elemet.


Lehet ezen a megoldáson javítani valahogy?


Ha jól gondolom ez O(n) idő és O(n) tár komplexitás ebben a formában (mert minden elemen végig kell menni, a dictbe pedig legrosszabb esetben tömb mérete - 1 elem kerül).


Nem feltétlenül kódra vagyok kíváncsi, ötletekre főleg.



2020. márc. 31. 17:28
1 2 3 4
 31/33 A kérdező kommentje:

"i = val % n

helyett val & 0xffff"


Írtam egy gyors tesztet erre Pythonban, egymilliószor lefuttattam mindkét verziót n = 1..100000-re és átlagot néztem, a modulo verzió nálam egyértelműen gyorsabb.

Mikroszekundumban mértem a futásidőt.


De lehet a benchmarkom rossz, te milyen kóddal méred és milyen nyelven? Kipróbálom úgy.

2020. ápr. 3. 15:59
 32/33 anonim ***** válasza:

C#-ban:

        private static void ModTest(int val)

        {

            var sw = Stopwatch.StartNew();

            for (int i = 1; i < 100000000; i++)

            {

                int a = val % i;

            }

        

            Console.WriteLine(sw.ElapsedMilliseconds);

        }


        private static void AndTest(int val)

        {

            var sw = Stopwatch.StartNew();

            for (int i = 1; i < 100000000; i++)

            {

                int a = val & 0xffff;

            }

        

            Console.WriteLine(sw.ElapsedMilliseconds);

        }


Majd meghívom 2x:

ModTest(1);

AndTest(1);

ModTest(6487);

AndTest(6487);


Az és-elés egyértelműen 10x gyorsabb. Eredmény:

249

27

249

27


De mint említettem a Pythont nem igazán ismerem, lehet ott az & is lassú:)


Csak kíváncsiságból 100ezer elemre neked mennyi idő alatt futott le? Én azért 100 millióval próbáltam, mert egyébként 0 idő volt.

2020. ápr. 3. 16:12
Hasznos számodra ez a válasz?
 33/33 anonim ***** válasza:
Felezd meg a tömböt és futtasd ezt az algoritmust két taskon (egyik fele egyik task, másik az masik. Várják meg egymást és végén add össze.
2020. ápr. 4. 00:45
Hasznos számodra ez a válasz?
1 2 3 4

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!