Hódító / Queosia forum
Hódító / Queosia forum
http://queosia.com
http://hodito.hu

Go Back   Hódító / Queosia forum > Hódító / Queosia forum > Általános beszélgetések > PC (hardver, szoftver, játékok stb.)
Register Stats Members List Today's Posts

PC (hardver, szoftver, játékok stb.) Minden, ami számítógép. Kedvenc játékod megbeszélése, segítségkérés hardverügyben stb.

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 11-01-2011, 20:15
Redback's Avatar
Redback Redback is offline
Member
 
Join Date: Jun 2007
Location: Nyíregyháza
Posts: 2,975
Activity: 0%
Longevity: 92%
Default

adott egy m*n-es tomb. minden eleme csak 1 vagy 0 lehet. Az 1 jelenti a feketet, 0 a feheret. Hogyan lehet megkeresni leggyorsabban a legnagyobb csak feher (0) mezoket tartalmazó téglalapot? Én úgy gondolkoztam, hogy minden mezőhöz hozzárendeltem egy számot, mégpedig hogy a terület bal felső sarkával alkotott téglalapban hány fekete mező van. Ekkor bármely téglalapban lévő fekete mezők meghatározhatóak mindenféle ciklus nélkül. Ezután meghatározom a terület "területét" (m*n).Mindig csökkentem eggyel a terület értékét, és megkeresem mekkora téglalapoknak annyi a területe, aztán megnézem hogy az eredeti területben belefér-e magassága és szélessége, ha igen, akkor végignézem az összes olyan téglalapot az eredeti területben, és ha csak fehér mezők vannak benne, akkor győzelem. De ez túl lassú 500*500-ra 60 mp alatt kéne lefutni, de csak 3-4 perc alatt fut le
__________________
Redológia (#455305) [1/A] [SZK]

Non omnis moriar (#701164) [3/G]

Last edited by Redback; 11-01-2011 at 20:39..
Reply With Quote
Sponsored Links
  #2  
Old 11-01-2011, 20:39
Redback's Avatar
Redback Redback is offline
Member
 
Join Date: Jun 2007
Location: Nyíregyháza
Posts: 2,975
Activity: 0%
Longevity: 92%
Default

A lényeg lemaradt, szóval aki tud segíteni, akár csak sejtése van, szívesen fogadom
__________________
Redológia (#455305) [1/A] [SZK]

Non omnis moriar (#701164) [3/G]
Reply With Quote
  #3  
Old 11-11-2011, 12:04
Cpt Balu Cpt Balu is offline
Junior Member
 
Join Date: Mar 2011
Posts: 47
Activity: 0%
Longevity: 73%
Default

Mekkora területeket kell keresni? kész van egy algoritmus, mindjárt közlöm az eredményeket...
Reply With Quote
  #4  
Old 11-11-2011, 14:19
Dus Dus is offline
Member
 
Join Date: Apr 2007
Location: Budapest
Posts: 2,382
Activity: 0%
Longevity: 93%
Default

Én kíváncsi lennék erre az algoritmusra, ha szabad. Érdekelne, mert agyaltam rajta, de nem sok sikerrel.
Reply With Quote
  #5  
Old 11-11-2011, 16:38
Cpt Balu Cpt Balu is offline
Junior Member
 
Join Date: Mar 2011
Posts: 47
Activity: 0%
Longevity: 73%
Default

Quote:
Originally Posted by Dus View Post
Én kíváncsi lennék erre az algoritmusra, ha szabad. Érdekelne, mert agyaltam rajta, de nem sok sikerrel.
Addig leírom a jelenlegi algoritmus lényegét:
Elindulok a tábla elején, szépen sorfolytonosan haladok. Ha találok egy aktív területet (1) akkor van legalább egy 1x1-es megoldás.

Ezután megnézem, hogy adott irányban (mondjuk X mentén, tehát vízszintesen) meddig találok aktív területet, legyen ez X, utána másik irányban Y. Így tehát van lehetőségem egy maximum X*Y eredményre. Ezt összehasonlítom a korábbi eltárolt legjobb eredménnyel (ha van). Ha az eredményem nagyobb, fölösleges tovább vizsgálni, nem lesz belőle új eredmény. Ezután esetleg végzek még gyorsteszteket (átellenes sarok, oldalak ellenőrzése), amik érvényteleníthetik a jelenlegi keresést, és a legvégén csinálok teljes vizsgálatot (vagyis hogy teljes-e a téglalapom), mivel ez az legidőigényesebb munka. Ha stimmel, és a téglalap nagyobb mint az eddigiek, akkor végeredményként eltárolom, és legközelebb már csak az ennél nagyobb esélyesek vizsgálata történik meg, ami jelentősen csökkenti a futási időt.
Sok helyen lehet ignore feltételeket alkalmazni, pl. ha van egy 10x10-e eredményem, akkor a 491. sor 491. oszlopnál legjobb esetben egy másik 10x10-est találhatok, az ez utáni oszlopokban meg sokkal kisebbeket, ilyenkor ki lehet hagyni a keresést, és következő sorral folytatni (ahol már az utolsó 11 oszlop elhagyható, mivel az is csak 11x9=99 lehetne)

Egyenes rekurzió helyett ajánlott while ciklusokat használni stack műveletek spórolása miatt, sokszor nagyságrendekkel gyorsabb lehet a progi.

Ez a módszer hasonló a tiédhez, vagyis végignézem a táblát, kiszedek belőle max méretű téglalapokat, és feljegyzem a legjobbat, a többi nagy részét pedig keresés előtt is el tudom vetni. De akad más megközelítés is, a reklám után folytatom...
Reply With Quote
The Following User Says Thank You to Cpt Balu For This Useful Post:
  #6  
Old 11-11-2011, 20:17
Redback's Avatar
Redback Redback is offline
Member
 
Join Date: Jun 2007
Location: Nyíregyháza
Posts: 2,975
Activity: 0%
Longevity: 92%
Default

Quote:
Originally Posted by Cpt Balu View Post
Addig leírom a jelenlegi algoritmus lényegét:
Elindulok a tábla elején, szépen sorfolytonosan haladok. Ha találok egy aktív területet (1) akkor van legalább egy 1x1-es megoldás.

Ezután megnézem, hogy adott irányban (mondjuk X mentén, tehát vízszintesen) meddig találok aktív területet, legyen ez X, utána másik irányban Y. Így tehát van lehetőségem egy maximum X*Y eredményre. Ezt összehasonlítom a korábbi eltárolt legjobb eredménnyel (ha van). Ha az eredményem nagyobb, fölösleges tovább vizsgálni, nem lesz belőle új eredmény. Ezután esetleg végzek még gyorsteszteket (átellenes sarok, oldalak ellenőrzése), amik érvényteleníthetik a jelenlegi keresést, és a legvégén csinálok teljes vizsgálatot (vagyis hogy teljes-e a téglalapom), mivel ez az legidőigényesebb munka. Ha stimmel, és a téglalap nagyobb mint az eddigiek, akkor végeredményként eltárolom, és legközelebb már csak az ennél nagyobb esélyesek vizsgálata történik meg, ami jelentősen csökkenti a futási időt.
Sok helyen lehet ignore feltételeket alkalmazni, pl. ha van egy 10x10-e eredményem, akkor a 491. sor 491. oszlopnál legjobb esetben egy másik 10x10-est találhatok, az ez utáni oszlopokban meg sokkal kisebbeket, ilyenkor ki lehet hagyni a keresést, és következő sorral folytatni (ahol már az utolsó 11 oszlop elhagyható, mivel az is csak 11x9=99 lehetne)

Egyenes rekurzió helyett ajánlott while ciklusokat használni stack műveletek spórolása miatt, sokszor nagyságrendekkel gyorsabb lehet a progi.

Ez a módszer hasonló a tiédhez, vagyis végignézem a táblát, kiszedek belőle max méretű téglalapokat, és feljegyzem a legjobbat, a többi nagy részét pedig keresés előtt is el tudom vetni. De akad más megközelítés is, a reklám után folytatom...
A megírt programodra kíváncsi vagyok, tesztelnék egy párat
__________________
Redológia (#455305) [1/A] [SZK]

Non omnis moriar (#701164) [3/G]
Reply With Quote
  #7  
Old 11-11-2011, 23:20
Cpt Balu Cpt Balu is offline
Junior Member
 
Join Date: Mar 2011
Posts: 47
Activity: 0%
Longevity: 73%
Default

Quote:
Originally Posted by Redback View Post
A megírt programodra kíváncsi vagyok, tesztelnék egy párat
Nos, a legtisztább az lenne, ha generálnál néhány alakzatot, megmondanád mennyi idő alatt keresel, és ugyanazt megpróbálom én is megtalálni keveseb idő alatt.

Elkészült a program, még próbálom értelmezni, mit is találtam ki És érthetően beszámolni róla, röviden annyit a teljesítményről, hogy vegyes sűrűségű próbákkal nem tudtam 400ms fölé(!) menni Remélem ez már megteszi, ha érdekel a progi, esetleg elkészíthetem egy kis alkalmazással, mondjuk bittérkép rajzolóval, elkészíted az ábrát, és ráereszted a keresőt...
Reply With Quote
  #8  
Old 11-11-2011, 16:00
Redback's Avatar
Redback Redback is offline
Member
 
Join Date: Jun 2007
Location: Nyíregyháza
Posts: 2,975
Activity: 0%
Longevity: 92%
Default

Quote:
Originally Posted by Cpt Balu View Post
Mekkora területeket kell keresni? kész van egy algoritmus, mindjárt közlöm az eredményeket...
A legnagyobb területet keressük Kíváncsi lennénk az algoritmusra
__________________
Redológia (#455305) [1/A] [SZK]

Non omnis moriar (#701164) [3/G]
Reply With Quote
  #9  
Old 11-11-2011, 16:18
Cpt Balu Cpt Balu is offline
Junior Member
 
Join Date: Mar 2011
Posts: 47
Activity: 0%
Longevity: 73%
Default

Quote:
Originally Posted by Redback View Post
A legnagyobb területet keressük Kíváncsi lennénk az algoritmusra
Úgy értem h a várható legnagyobb terület mekkora? majdnem az egészet befedi, vagy ritább területen keresünk? mert van jó algoritmus arra, ha mondjuk 50x50 körüli eredményeket várunk vagy kisebbet (akkor az átlag futási idő olyan 500ms körüli), de nagy eredményeknél nem valami gyors, egy másik pedig pont a nagy eredményeket találja meg hamar, de ha ritkább a kitöltöttség az sok fölösleges kört futtat vele
Viszont most eszembe jutott még valami, máris kipróbálom...
Egyébként egy 15x15-ös területet most átlag 90msec alatt találok meg Sztem ez jó eredmény lesz
Reply With Quote
  #10  
Old 11-11-2011, 16:27
Redback's Avatar
Redback Redback is offline
Member
 
Join Date: Jun 2007
Location: Nyíregyháza
Posts: 2,975
Activity: 0%
Longevity: 92%
Default

Quote:
Originally Posted by Cpt Balu View Post
Úgy értem h a várható legnagyobb terület mekkora? majdnem az egészet befedi, vagy ritább területen keresünk? mert van jó algoritmus arra, ha mondjuk 50x50 körüli eredményeket várunk vagy kisebbet (akkor az átlag futási idő olyan 500ms körüli), de nagy eredményeknél nem valami gyors, egy másik pedig pont a nagy eredményeket találja meg hamar, de ha ritkább a kitöltöttség az sok fölösleges kört futtat vele
Viszont most eszembe jutott még valami, máris kipróbálom...
Egyébként egy 15x15-ös területet most átlag 90msec alatt találok meg Sztem ez jó eredmény lesz
bármekkora lehet a legnagyobb, akár 1 területű, akár 25000 területű
__________________
Redológia (#455305) [1/A] [SZK]

Non omnis moriar (#701164) [3/G]
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 04:22.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Design partly based on Hódító's design by Grafinet Team Kft.

Contents and games copyright (c) 1999-2020 - Queosia, Hódító

Partnerek: Játékok, civ.hu