Algoritmus pro řešení jednoduché (?) Problém array

hlasů
7

Za této rychlosti problém je docela zásadní. Jsem nakreslil krásný obrázek vysvětlit problém lépe. Algoritmus musí počítat, pokud okraje obdélníku i nadále v mezích plátna, bude hrana protíná další obdélník?

Víme:

  1. Velikost plátna
  2. Velikost každého obdélníku
  3. Poloha každého obdélníku

Čím rychlejší řešení je, tím lépe! Jsem docela přilepená na tento jeden a opravdu nevím, kde začít.

alt textu http://www.freeimagehosting.net/uploads/8a457f2925.gif

Na zdraví

Položena 08/07/2010 v 13:23
zdroj uživatelem
V jiných jazycích...                            


6 odpovědí

hlasů
2

Linky, které nejsou vzájemně rovnoběžné se chystáte protínají v určitém okamžiku. Vypočítat svahy každého řádku a pak zjistit, jaké linky nebudou protínají.

Začněte s tím, a pak uvidíme, jak ji optimalizovat. Nejsem si jistý, jak je zastoupena vaše data a nevidím na disk.

Používání svazích je jednoduchá kontrola rovnost což pravděpodobně znamená, že můžete využít třídění dat. Ve skutečnosti, můžete asi jen vytvořit sadu odlišných tratí. Budete muset přijít na to, jak reprezentovat data takové, že oba svahy téhož obdélníku se nepočítají jako protínající.

EDIT: Počkejte .. jak dva obdélníky, jejichž hrany jít do nekonečna neprotínají? Obdélníky jsou v podstatě dvě linie, které jsou navzájem kolmé. by nemělo znamenat, že to vždy protíná s jiným, pokud jsou tyto řádky prodloužena do nekonečna?

Odpovězeno 08/07/2010 v 13:35
zdroj uživatelem

hlasů
6

Stačí vytvořit sadu intervalů pro každý z X a ose Y. Pak pro každý nový obdélník, zda existují křížící se intervaly v X nebo osy Y. Viz zde pro jeden ze způsobů, kterým se provádí intervalu sad.

Ve svém prvním příkladu je interval nastaven na vodorovné ose bude { [0-8], [0-8], [9-10] }, a na vertikální:{ [0-3], [4-6], [0-4] }

To je jen náčrtek, já abstrahuje mnoho detailů zde (např obvykle jeden by požádat nastaveném intervalu / strom „který intervaly překrývat tenhle“ namísto „protínají tohle“, ale nic není uskutečnitelný).

Upravit

Podívejte se na toto související MIT přednáška (je to trochu dlouhé, ale rozhodně to worths). I když budete hledat jednodušší řešení (než realizaci rozšířený červeno-černý strom), je dobré znát představy za těmito věcmi.

Odpovězeno 08/07/2010 v 13:36
zdroj uživatelem

hlasů
1

tak dlouho, dokud se nezmínil jazyk, který jste zvolili, jak vyřešit problém, budu používat nějaký pseudokódu

Předpokládá se, že pokud je vše v pořádku, pak Tříděný sběr obdélníkových hran podél jedné osy musí být posloupnost nepřekrývajících se časových intervalech.

  1. Číslo všechny vaše obdélníky, jim přiřadit jednotlivé identifikátory
  2. vytvořte prázdnou kolekci binární strom (BTC). tato kolekce by měl mít metodu pro vložení celého čísla uzlu s informacemi BTC :: vložky (klíč, hodnota)
  3. pro všechny obdélníky, proveďte:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. Nyní iterovat BTC (to vám dá seřazeném pořadí)

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 - opakujte kroky 2,3,4 pro rect.left a rect.right souřadnic

Odpovězeno 08/07/2010 v 13:49
zdroj uživatelem

hlasů
1

Líbí se mi na tuto otázku. Tady je můj pokus dostat se na něj:

Pokud je to možné: Vytvořte polygon z každého obdélníku. Na každou hranu jako řada maximální délky, které musí být oříznut. Použijte algoritmus oříznutí pro kontrolu počasí, nebo ne čára protíná s jinou. Například tento: Linka ořezovou

Ale mějte na paměti: Pokud narazíte na křižovatku, která je v poloze vrcholů, jeho platný jeden.

Odpovězeno 08/07/2010 v 14:01
zdroj uživatelem

hlasů
1

Tady je nápad. Namísto vytváření každého obdélníku (x, y, width, height), instanci jim (x1, y1, x2, y2), nebo alespoň si to interpretují tyto hodnoty s ohledem na šířku a výšku.

Tímto způsobem si můžete zkontrolovat, které obdélníky mají podobný xnebo yhodnotu a ujistěte se, že odpovídající obdélník má stejnou sekundární hodnotu.


Příklad:

Obdélníky jste dali mají následující hodnoty:

  • Náměstí 1: [0, 0, 8, 3]
  • Square 3: [0, 4, 8, 6]
  • Square 4: [9, 0, 10, 4]

Za prvé, budeme porovnávat Square 1se Square 3(bez kolizí):

  • Porovnat hodnoty x
    • [0, 8] až [0, 8] Jedná se o naprosto stejné, takže není crossover.
  • Porovnejte hodnoty y
    • [0, 4] [3, 6] Žádný z těchto čísel jsou podobné, takže jsou není faktorem

Dále musíme porovnat Square 3se Square 4(kolizi):

  • Porovnat hodnoty x
    • [0, 8] až [9, 10] Žádný z těchto čísel jsou podobné, takže jsou není faktorem
  • Porovnejte hodnoty y
    • [4, 6] [0, 4] obdélníky mají číslo 4 společného, ​​ale 0! = 6, a proto je zde kolize

Tím, že jsme věděli, že ke kolizi dojde, takže tento způsob skončí, ale umožní zhodnotit Square 1a Square 4pro některé další jasnosti.

  • Porovnat hodnoty x
    • [0, 8] až [9, 10] Žádný z těchto čísel jsou podobné, takže jsou není faktorem
  • Porovnejte hodnoty y
    • [0, 3] až [0, 4] obdélníky mají číslo 0 společného, ​​ale 3! = 4, a proto je zde kolize

Dejte mi vědět, pokud budete potřebovat žádné další podrobnosti :)

Odpovězeno 08/07/2010 v 14:08
zdroj uživatelem

hlasů
0

Heh, přičemž překrývající se intervaly odpovědět do extrému, můžete jednoduše zjistit všechny různé intervaly podél x a y osy. Pro každou linii řezu, provést horní mez vyhledávání ve směru osy, že se sníží, vztaženo na výchozí hodnotu intervalu je. Pokud nechcete najít interval nebo interval neprotíná linku, pak je to platný řádek.

Mírně choulostivé části je si uvědomit, že platné řezné linky nebudou protínat hranice obdélníku je podél osy, takže můžete kombinovat překrývající se intervaly do jednoho intervalu. Skončíte s jednoduchým tříděného pole (který vyplníte O (n)) a O (log n) hledat každou řezu.

Odpovězeno 09/07/2010 v 07:53
zdroj uživatelem

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