Med en uppsättning 2D-koordinater för de fyra hörnen av varje byggnad i en stadssilhuett (som på ett fotografi), hur skulle du bestämma konturen av silhuetten av alla byggnader, där byggnader kanske överlappar varandra?

Med tanke på [matematik] N [/ matematik] byggnader kan du göra det i [matematik] O (N log N) [/ matematik] tid. Du kommer att behöva [matematik] O (N) [/ matematik] extra utrymme.

Först, för varje byggnad, skapa en händelse associerad med den vänstra x-koordinaten där vi lägger till en byggnad med den aktuella byggnadens höjd. Vi skapar en andra händelse associerad med rätt x-koordinat där vi tar bort en byggnad med höjden på den nuvarande byggnaden. Sätt alla dessa händelser i en prioritetskö, som behandlar dem i ordning för att öka x-koordinaten.

Du måste behålla en uppsättning av de höjder som för närvarande kan uppnås. Denna uppsättning ska stödjas av ett balanserat binärt träd för att stödja effektiv insättning och borttagning. Om höjderna inte är olika kan du störa dem med små epsiloner så att alla höjder är distinkta.

Nu bearbetar vi händelserna från prioritetskön i ordning. När vi når en händelse där vi skapar en byggnad lägger vi till den angivna höjden i vår uppsättning. Om x-koordinaten ändras vid nästa händelse uppdaterar vi också den maximala höjden vi hittills har sett vid vår nuvarande x-koordinat. Om vi ​​når en händelse när vi tar bort en byggnad tar vi helt enkelt bort den höjden från vårt set.

När vi har dessa höjder kan generera horisonten göras genom att rita horisontella linjer som sträcker sig åt höger från en maximal höjd tills en ny x-koordinat kan uppnås.

Lämna en kommentar