Kezdőoldal » Számítástechnika » Programozás » Mi az optimális algoritmus...

Mi az optimális algoritmus tömbben egyszer előforduló elem megkeresésére?

Figyelt kérdés

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)



2020. jan. 13. 10:23
1 2 3 4
 11/34 anonim ***** válasza:
0%
Ha a rendezés megoldás, akkor rendezés után logaritmikus kereséssel keresd azt az egy elemet. Persze feladattól függően lehet kevesebb lépéssel is megoldható de a logaritmikus is elég gyors.
2020. jan. 13. 11:27
Hasznos számodra ez a válasz?
 12/34 anonim ***** válasza:
63%
Hogy keresel meg logaritmikus kereséssel oylan elemet egy rendezett listában ami csak 1x szerepel? Sztem nem igazán lehet.... végig kell menni a listán, de az is csak O(n)... itt a rendezés a "lassu"
2020. jan. 13. 11:31
Hasznos számodra ez a válasz?
 13/34 anonim ***** válasza:
54%

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

2020. jan. 13. 11:45
Hasznos számodra ez a válasz?
 14/34 anonim ***** válasza:
20%

"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.

2020. jan. 13. 11:51
Hasznos számodra ez a válasz?
 15/34 anonim ***** válasza:
54%
Sztem azért siklottunk el ezen a feltételen, mert először azt írtad, hogy 0-9 között... akkor nem lett volna értelme, hisz max 19 elemű lehetett volna a tömb.
2020. jan. 13. 11:53
Hasznos számodra ez a válasz?
 16/34 anonim ***** válasza:
37%

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.

2020. jan. 13. 11:54
Hasznos számodra ez a válasz?
 17/34 anonim ***** válasza:
54%
#14 való igaz, ott a pont!
2020. jan. 13. 12:10
Hasznos számodra ez a válasz?
 18/34 A kérdező kommentje:

Bit manipulációra nem is gondoltam volna :)

Aki lepontozta a 16-ost, az leírja, hogy miért tette?

2020. jan. 13. 12:10
 19/34 A kérdező kommentje:
Ja, úgy látom minden választ lepontoznak, akkor mindegy.
2020. jan. 13. 12:19
 20/34 anonim ***** válasza:
40%
Házi feladat, vagy szorgalmi? Mert ez esetben valaki úgy gondolja (lehet éppen a tanár), hogy neked kellene elgondolkodni rajta, nem itt másokkal megoldatni.
2020. jan. 13. 12:24
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!