Egy algoritmus, hogy megoldja egy egyszerű (?) Array probléma

szavazat
7

Ezt a problémát a sebesség elég fontos. Már húzott egy szép képet, hogy ismertesse a problémát, annál jobb. Az algoritmus kell számolnia, ha élek egy téglalap továbbra keretein belül a vásznon, majd a szélét metszik a másik téglalap?

Tudjuk:

  1. A méret a vászon
  2. A méret az egyes téglalap
  3. A helyzete minden téglalap

Minél gyorsabb a megoldás, annál jobb! Vagyok ragadt ez, és nem igazán tudom, hol kezdjem.

alt szöveg http://www.freeimagehosting.net/uploads/8a457f2925.gif

Egészségére

A kérdést 08/07/2010 13:23
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
2

Vonalak nem párhuzamosak egymással fognak metszik egy bizonyos ponton. Számoljuk ki a lejtők minden sort, majd meghatározzák, milyen vonalak nem fognak metszik.

Kezdje azzal, és akkor lássuk, hogyan kell optimalizálni. Nem tudom, hogyan reprezentálják az adatokat, és nem tudom látni a képet.

Segítségével lejtők egy egyszerű egyenlőség csekket, ami valószínűleg azt jelenti, hogy kihasználják a sorba rendezi az adatokat. Sőt, akkor valószínűleg csak hozzon létre egy sor különböző pályákon. Itt van, hogy kitaláljuk, hogyan képviselje az adatokat, hogy a két lejtőin azonos téglalap nem számítanak metsző.

EDIT: Várj .. hogyan lehet két téglalap, amelynek szélei megy a végtelenségig nem metszi? Téglalapok alapvetően két vonalak, amelyek merőlegesek egymásra. nem azt jelenti, hogy mindig metszi a másik, ha azokat a sorokat ki kell terjeszteni a végtelen?

Válaszolt 08/07/2010 13:35
a forrás felhasználó

szavazat
6

Csak teremt a beállított időközönként az egyes X és az Y tengelyen. Ezután minden új téglalap, hátha vannak metsző időközönként az X vagy az Y tengelyen. Lásd itt az egyik módja a végrehajtási intervallum készletek.

Ebben az első példában az intervallum beállítása a vízszintes tengely lenne { [0-8], [0-8], [9-10] }, és a függőleges:{ [0-3], [4-6], [0-4] }

Ez csak egy vázlat, én absztrahált sok részletet itt (pl általában egy kérném időközzel set / fa „amely időközönként átfedik ezt az egy” helyett „metszik ezt az egy”, de semmit nem megvalósítható).

szerkesztése

Kérjük, nézze meg ezt a kapcsolódó MIT előadás (ez egy kicsit hosszú, de teljesen worths azt). Még ha találsz egyszerűbb megoldásokat (mint végrehajtó egy kibővített piros-fekete fa), akkor jó tudni, hogy az elképzelések mögött ezeket a dolgokat.

Válaszolt 08/07/2010 13:36
a forrás felhasználó

szavazat
1

mindaddig, amíg nem említette azt a nyelvet, úgy döntött, hogy megoldja a problémát, én is használ valamilyen pszeudo-kód

Az elképzelés az, hogy ha minden rendben van, akkor egy rendezett gyűjteménye téglalap élek egy tengely mentén kell sorozata nem átfedő intervallumok.

  1. szám minden téglalap, bízzák azokat az egyedi azonosítók
  2. hozzon létre egy üres bináris fa gyűjtemény (BTC). ez a gyűjtemény kell egy módszert beszúrni egy egész csomópontot info BTC :: betét (kulcs, érték)
  3. minden téglalap tegye:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. most végighaladni a BTC (ez adja meg a rendezett sorrendben)

btc_item = btc.first()
do
    id = btc_item.id
    btc_item = btc.next()
    if(id != btc_item.id)
    then report_invalid_placement(id, btc_item.id)
    btc_item = btc.next()
while btc_item is valid

5,7,8 - ismételje meg 2,3,4 számára rect.left és rect.right koordinátákat

Válaszolt 08/07/2010 13:49
a forrás felhasználó

szavazat
1

Szeretem ezt a kérdést. Itt van a megkísérelni a rajta:

Ha lehetséges: hozzon létre egy sokszög minden téglalap. Treat minden éle, mint egy vonal maximális hosszúságú, hogy kell nyírni. Használjon nyírás algoritmust, hogy ellenőrizze az időjárás, vagy nem metszi a másikkal. Például ez: Vonal Sajtó

De ne feledje: Ha úgy találja, egy kereszteződést, amely a vertex pozícióját, annak valódiságát.

Válaszolt 08/07/2010 14:01
a forrás felhasználó

szavazat
1

Van egy ötletem. Ahelyett, hogy minden téglalap (x, y, width, height), instantiate őket (x1, y1, x2, y2), vagy legalábbis azt értelmezi ezeket az értékeket adott a szélesség és magasság.

Így, akkor ellenőrizze, hogy mely téglalap hasonló xvagy yértéket, és ellenőrizze, hogy a megfelelő négyszög azonos másodlagos értéket.


Példa:

A téglalapok adtál meg a következő értékeket:

  • Tér 1: [0, 0, 8, 3]
  • Tér 3: [0, 4, 8, 6]
  • Square 4: [9, 0, 10, 4]

Először is össze Square 1kell Square 3(nincs ütközés):

  • Hasonlítsuk össze az x értékek
    • [0, 8] a [0, 8] Ezek pontosan ugyanaz, így nincs crossover.
  • Hasonlítsuk össze az y értékek
    • [0, 4] [3, 6] Egyik ezek a számok hasonlóak, így ők nem tényező

Ezután összehasonlítjuk Square 3a Square 4(ütközés):

  • Hasonlítsuk össze az x értékek
    • [0, 8] [9, 10] Egyik ezek a számok hasonlóak, így ők nem tényező
  • Hasonlítsuk össze az y értékek
    • [4, 6] a [0, 4] A téglalapok a szám 4 közös, de 0! = 6, ezért van egy ütközés

By know tudjuk, hogy egy ütközés következik be, így a módszer akkor ér véget, de lehetővé teszi, értékeli Square 1és Square 4néhány extra tisztaságát.

  • Hasonlítsuk össze az x értékek
    • [0, 8] [9, 10] Egyik ezek a számok hasonlóak, így ők nem tényező
  • Hasonlítsuk össze az y értékek
    • [0, 3] a [0, 4] A téglalapok a szám 0 közös, de a 3! = 4, tehát, van egy ütközés

Hadd tudja, ha szüksége további részleteket :)

Válaszolt 08/07/2010 14:08
a forrás felhasználó

szavazat
0

Heh, figyelembe átfedő intervallumok válaszolni, hogy a szélsőséges, akkor egyszerűen meg kell határoznia mind különböző időközönként, az x és az y tengelyen. Minden vágás vonalát, ezt egy felső korlát keresés tengelye mentén fog vágni alapján az intervallum kezdő értékét. Ha nem talál egy intervallum, vagy az intervallum nem metszi a vonalat, akkor ez egy érvényes sor.

A kissé trükkös része az, hogy észre, hogy érvényes vágási vonalak nem metszik egymást egy téglalapot határvonaláig egy tengely mentén, így össze átfedő intervallumok egyetlen intervallum. A végén egy egyszerű rendezett tömbben (ami kitölti O (n) időben), és egy O (log n) keresni minden vágási vonalon.

Válaszolt 09/07/2010 07:53
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more