Mi az optimális algoritmus tömbben egyszer előforduló elem megkeresésére?
Ha van egy elem a tömbben, ami csak egyszer fordul elő és minden más elem kétszer.
Pl. [1, 2, 3, 1, 3] tömb esetén a 2 lesz az eredmény, [8, 8, 5, 5, 6] esetén pedig a 6.
A számok 0-9 intervallumban vannak.
Menjek végig a tömbön és számoljam az egyes elemek előfordulását, aztán utána menjek végig az előfordulásokon és az 1-es előfordulással térjek vissza?
Vagy van ennél jobb megoldás?
(Pythonban csinálom, de mindegy a nyelv igazából)
az hogy egy elem szerepel-e egy rendezetlen tömbben az O(n) (legrosszabb eset)
, de mivel nem egy elemet kell nézni ezért jóval rosszabb futásidejű lesz
"minden más elem kétszer"
Sztem elsiklott mindenki e-felett? Hát így baromi egyszerű, csak XOR-old össze mind egymás után.
Épp meg akartam kérdezni, hogy tudjuk-e a többször előforduló elemekből hogy páros vagy páratlan darabszámú van-e... mert ha mind páros, vagy pl mindegyikből 3 van, akkor gyorsan meg lehet oldani.
Azt kell kihasználnod, hogy minden más elem kétszer fordul elő.
Könnyen érthető O(n)/O(n) (time/space) megoldás:
- definiálsz egy Setet (azért Set, mert O(1) add, contains és remove műveleteket akarunk)
- végig iterálsz a tömbön, ha adott elem már benne van a Setben, akkor törlöd belőle, ha nincs, bele rakod
- a végén egy elem marad a Setben, az egyszer előforduló
O(n)/O(1) bit manipuláció:
Simán össze XORzod az elemeket, kihasználva, hogy a XOR asszociatív és kommutatív.
Pythonban valami ilyesmi:
def findSingle(nums):
s = 0
for num in nums:
s ^= num
return s
Utóbbinál nem érhető el jobb komplexitás, hiszen minden elemet érinteni kell, tehát ez az optimális megoldás.
Bit manipulációra nem is gondoltam volna :)
Aki lepontozta a 16-ost, az leírja, hogy miért tette?
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!