Kezdőoldal » Számítástechnika » Programozás » Milyen algoritmussal lehetne...

Milyen algoritmussal lehetne a leghatékonyabban megoldani a következő problémát?

Figyelt kérdés
Ha van nekem 500 darab számhármasom (pl: { {1: x=20, y=50, z=30 }, {2: x=80, y=40, z=20} ... {500: x= 44, y= 11, z= 99}} és én megadok egy számhármast (pl: {x= 210, y= 300, z=180}) akkor megtalálni azt a kombinációját (ismétléssel és anélkül is) az 500 számhármasomnak, amelyben a számok x y és z helyen álló számok összege a kívánt értékhez a legközelebbi? Tehát a fenti példában olyan számhármasokat keresk ahol az x-ek összege 210 az y-ok összege 300, a Z-k összege 180. Ha ilyen nincs akkor a legközelebbit megtalálni.

2023. jan. 19. 20:34
1 2 3
 21/25 anonim ***** válasza:

Átgondoltam : "Vagy ( abs(x) , abs(y) , abs(z) ) számhármas lexikografikus rendezési relációja szerint?"

Ez nem is helyes, mert nemnegatív számot kell kapni mindig. E helyett pl lehetne az hogy mondjuk lexikografikusan rendezve az 500 db számhármas. A listába hogy hanyadik elemű egy számot rendelni hozzá és két elem távolsága a listában hanyadik elem ezen indexek különbsége.


"megtalálni azt a kombinációját (ismétléssel és anélkül is)"

Vagyis gondolom úgy érted, hogy egy elemet többször is ki lehet választani , másik esetben pedig nem.

Ha nem ismétléses akkor kiválasztható e 2x ha 2x ugyanolyan értékű elem létezik a listába?


"A jelenlegi megközelítés itt az, hogy random kiválasztok egyet az 500-ból, ismételgetem addig amíg még nem lépi át a paraméterben megadott limitet,"[...]

A brute force-nál gyorsabb a backtrack algoritmus,azaz visszalépéses keresés. Így egy csomó keresési teret kihagysz amit a brute force bejárna feleslegesen.

Az egyetemista hozzászólónk gondolom jobban tudja, én már sokat felejtettem, de van olyan is hogy A* algortimus.

Van a szimulált hűtés nevű algoritmus, ahol kezdetben nagy kitérések vannak az optimumhoz képest az egyes iterációs lépéseknél. Majd egyre tovább futtatva egyre kisebb eltérések lesznek. Az elnevezés analóg a fizikában a részecskék "nyüzsgésével", ha forró az anyag jobban "nyüzögnek" a részecskék, ha hül akkor egyre kevesebb lesz a "nyüzgés".

2023. jan. 20. 18:32
Hasznos számodra ez a válasz?
 22/25 A kérdező kommentje:

Köszönöm a hozzászólást.


"Ha nem ismétléses akkor kiválasztható e 2x ha 2x ugyanolyan értékű elem létezik a listába?"


Igen, kiválasztható. Ezekre úgy kell tekinteni mint különálló objektumokra, tehát nem is az értéken van a hangsúly ismétlés szempontjából hanem az objektumon magán [{x = 10, y = 10, z = 10},{x = 10, y = 10, z = 10}]. Ez két objektum ugyanazokkal az értékekkel, tehát nem számít ismétlésnek ha mindkettőt felhasználom.


Utána néztem a backtracknek, nagyon izgalmasan hangzik. Így ránézésre nem mondanám az ordóját hatékonyabbnak mint a brute forcenak, de nálam lehet a gond :)


Az egyenlő távolság kérdése nagyon jó, én azt mondanám, hogy az van a legközelebb, ahol (xp-x) + (yp-y) + (zp-z) a legközelebb van a nullához, ahol xp yp zp azok az általam várt paraméter értékek, és az

x = kiválasztott objektumok x értékének az összege

y = kiválasztott objektumok y értékének az összege

z = kiválasztott objektumok z értékének az összege


(btw zseniálisak vagytok :) )

2023. jan. 20. 20:18
 23/25 anonim ***** válasza:

"Utána néztem a backtracknek, nagyon izgalmasan hangzik. Így ránézésre nem mondanám az ordóját hatékonyabbnak mint a brute forcenak, de nálam lehet a gond :)"

Így ordóba nem lehet megmondani,de a legrosszabb esetbe meg lehet határozni az meg pont annyi mint brute force-ba. Konkrét esettől függ, hogy a keresési térből mennyit vág le. Ezzel szemben az N királynő problémája esetében jobban meghatározható a backtrack és a brute force különbsége.

Ugyanakkor az ordó sem minden esetben irányadó. Például a gyorsrendezés futási időben legjobb és átlagos esetében O(n*log(n)) , legrosszabb esetben O(n^2). Az összefésülő rendezés pedig legjobb, átlagos és legrosszabb esetben is O(n*log(n)). Mégis általában a gyorsrendezés a leggyorsabb az összehasonlító rendezések közül.

Egy hack hogy ne lehessen konkrét legrosszabb esetet mondani a gyorsrendezésre, rendezés előtt random összekeverni az elemeket, ez O(n) idejű, így O(n)+O(n*log(n)) = O(n*log(n)) .

2023. jan. 21. 11:55
Hasznos számodra ez a válasz?
 24/25 A kérdező kommentje:

bocs a kicsit offtopic-ért, de mi a különbség az ordó és a legrosszabb eset között?


nagyon érdekes volt amit írtál, köszönöm.

2023. jan. 21. 14:48
 25/25 anonim ***** válasza:

"bocs a kicsit offtopic-ért, de mi a különbség az ordó és a legrosszabb eset között?"

Legrosszabb idő bonyolultság, legjobb idő bonyolultság és átlagos idő bonyolultság esetében írtam ordóban.

A gyorsrendezés példánál maradva, tudjuk hogy az egy önrekurzív algoritmus. A rekurzív híváskor ketté vágja a tömböt, bal és jobb oldalra. Az algoritmus rekurzívan kap egy pivot index-et, melynél kisebb elemek balra, a többi elem jobb oldalra kerül. Majd ezen bal és jobb oldal tömbre is kiszámolja a pivot index-eket, majd rekurzívan meghívja önmagát. Egésszen addig olyan hívási mélységig tart a hívási lánc míg 3-nál kevesebb elem van.

Átlagos esetben O(n*log(n)) idő bonyolultságú, de gondoljuk végig hogy legrosszabb esetben ez nem így lesz. Legrosszabb esetben a bal-jobb kettévágáskor és minden rekurzív híváskor az egyik oldalt mindig csak egyel csökken, azaz a bal, jobb oldal közül mindig egy elemű lesz az egyik. Ekkor kaptál egy négyzetes idejű rendezést O(n^2).

Egyébként hogy precízebb legyek a gyorsrendezés átlagos esetben theta n*log(n) azaz θ(n*log(n)). Viszont amire igaz hogy θ(n*log(n)) arra igaz, hogy O(n*log(n)). Fordítva nem minden esetben igaz.

[link]

[link]

[link]

2023. jan. 21. 17:40
Hasznos számodra ez a válasz?
1 2 3

További 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!