Bentley-Ottmann algoritması - Bentley–Ottmann algorithm

İçinde hesaplamalı geometri, Bentley-Ottmann algoritması bir tarama çizgisi algoritması hepsini listelemek için geçişler bir dizi çizgi segmentinde, yani bulur kesişme noktaları (ya da sadece, kavşaklar) çizgi parçalarının. Genişler Shamos-Hoey algoritması,[1] bir dizi çizgi parçasının herhangi bir kesişme olup olmadığını test etmek için benzer bir önceki algoritma. Aşağıdakilerden oluşan bir girdi için çizgi parçaları geçişlerde (veya kesişmelerde), Bentley-Ottmann algoritması zaman alır . Olduğu durumlarda , bu, her segment çiftini test eden saf bir algoritmada yapılan iyileştirmedir. .

Algoritma başlangıçta tarafından geliştirilmiştir Jon Bentley ve Thomas Ottmann (1979 ); ders kitaplarında daha ayrıntılı olarak anlatılmıştır Preparata ve Shamos (1985), O'Rourke (1998), ve de Berg vd. (2000). olmasına rağmen asimptotik olarak daha hızlı algoritmalar artık Chazelle ve Edelsbrunner (1992) ve Balaban (1995) Bentley-Ottmann algoritması, basitliği ve düşük bellek gereksinimleri nedeniyle pratik bir seçim olmaya devam ediyor[kaynak belirtilmeli ].

Genel strateji

Bentley-Ottmann algoritmasının ana fikri, bir süpürme çizgisi dikey bir çizginin olduğu yaklaşma L düzlem boyunca soldan sağa (veya örneğin yukarıdan aşağıya) hareket ederek giriş satırı segmentlerini sırayla keser.[2] Algoritma, en kolay şekilde genel pozisyon, anlamı:

  1. Hiçbir iki çizgi parçası uç noktası veya kesişme noktası aynı x-koordinat
  2. Hiçbir çizgi parçası uç noktası başka bir çizgi parçası üzerinde yer almaz
  3. Tek bir noktada üç çizgi parçası kesişmez.

Böyle bir durumda, L dikey sıralaması yalnızca sonlu bir kesikli kümede değişen bir nokta kümesinde her zaman girdi çizgi bölümlerini kesişir. Etkinlikler. Spesifik olarak, ayrı bir olay, bir çizgi parçasının bir uç noktası (sol veya sağ) veya iki çizgi parçasının kesişme noktası ile ilişkilendirilebilir. Böylece, sürekli hareket L sonlu bir adım dizisine bölünebilir ve sınırlı bir süre içinde çalışan bir algoritma tarafından simüle edilebilir.

Bu simülasyon sırasında meydana gelebilecek iki tür olay vardır. Ne zaman L bir çizgi parçasının uç noktasını süpürür s, kesişme noktası L ile s dikey sıralı kesişim noktaları kümesine eklenir veya buradan çıkarılır. Uç noktalar, girdiden algoritmaya kadar zaten bilindiği için, bu olayların tahmin edilmesi kolaydır. Kalan olaylar ne zaman meydana gelir? L iki çizgi parçası arasındaki (veya kesişen) bir kesişme boyunca süpürür s ve t. Bu olaylar aynı zamanda olaydan hemen önce şunların kesişme noktalarının olmasından da tahmin edilebilir. L ile s ve t kesişme noktalarının dikey sıralamasında bitişiktir[açıklama gerekli ].

Bentley-Ottmann algoritmasının kendisi, tarama çizgisinin giriş çizgisi segmentleri ile kesişme noktalarının mevcut dikey sırasını ve bitişik kesişim noktası çiftleri tarafından oluşturulan potansiyel gelecek olayların bir koleksiyonunu temsil eden veri yapılarını korur. Sırasıyla her olayı işler, veri yapılarını yeni kesişme noktaları kümesini temsil edecek şekilde günceller.

Veri yapıları

Süpürme hattının kesişme noktalarını verimli bir şekilde korumak için L girdi çizgi segmentleri ve gelecekteki olayların sırası ile Bentley – Ottmann algoritması iki veri yapıları:

  • Bir ikili arama ağacı ("süpürme çizgisi durum ağacı"), kesişen giriş satırı segmentleri kümesini içerir Ltarafından sipariş edildi y-bu segmentlerin kesiştiği noktaların koordinatları L. Geçiş noktalarının kendileri değil ikili arama ağacında açıkça gösterilir. Bentley – Ottmann algoritması yeni bir segment ekleyecek s süpürme çizgisi L sol uç noktayı geçiyor p bu segmentin (yani, en küçük segmentin son noktası) x-Süpürme çizgisi sağlandığında koordinat L yukarıda bu makalede açıklandığı gibi soldan başlar). Doğru segment konumu s ikili arama ağacında, her bir adımın p ile kesişen başka bir segmentin üstünde veya altında L. Bu nedenle, logaritmik zamanda bir ekleme gerçekleştirilebilir. Bentley-Ottmann algoritması aynı zamanda bölümleri ikili arama ağacından silecek ve diğer bölümlerin hemen üstünde ya da altında olan bölümleri belirlemek için ikili arama ağacını kullanacaktır; bu işlemler, segmentlerin temel geometrisine referans olmaksızın sadece ağaç yapısının kendisi kullanılarak gerçekleştirilebilir.
  • Bir öncelik sırası ("olay kuyruğu"), Bentley – Ottmann algoritmasında gelecekteki olası olayların bir sırasını korumak için kullanılır. Her olay bir noktayla ilişkilendirilir p düzlemde, bir segment uç noktası veya bir kesişme noktası ve olay, çizgi L süpürür p. Böylelikle olaylara öncelik verilebilir. x-Her olayla ilişkili noktaların koordinatları. Bentley-Ottmann algoritmasında, gelecekteki potansiyel olaylar, henüz üzerinden geçmemiş çizgi parçası uç noktalarından ve birbirinin hemen üstünde veya altında bulunan parça çiftlerini içeren çizgi çiftlerinin kesişme noktalarından oluşur.

Algoritmanın, tarama çizgisinin açıkça bir temsilini korumasına gerek yoktur. L veya düzlemdeki konumu. Aksine, konumu L dolaylı olarak temsil edilir: en son işlenen olayla ilişkili noktadan geçen dikey çizgidir.

İkili arama ağacı herhangi bir dengeli ikili arama ağacı veri yapısı, örneğin kırmızı-siyah ağaç; tek gereken, ekleme, silme ve aramaların logaritmik süre almasıdır. Benzer şekilde, öncelik sırası bir ikili yığın veya herhangi bir diğer logaritmik zaman öncelikli kuyruk; gibi daha karmaşık öncelik kuyrukları Fibonacci yığını gerekli değildir. Öncelik kuyruğunun alan karmaşıklığının, onu uygulamak için kullanılan veri yapısına bağlı olduğuna dikkat edin.

Ayrıntılı algoritma

Bentley – Ottmann algoritması aşağıdaki adımları gerçekleştirir.

  1. Öncelik kuyruğunu başlatın Q her biri düzlemdeki bir noktayla ilişkilendirilen ve x- noktanın koordinatı. Yani, başlangıçta, Q giriş segmentlerinin her bir uç noktası için bir olay içerir.
  2. Bir kendini dengeleyen ikili arama ağacı T süpürme çizgisini geçen çizgi parçalarının Ltarafından sipariş edildi y- geçiş noktalarının koordinatları. Başlangıçta, T boş. (Çizgi süpürse bile L açıkça temsil edilmediğinden, başlangıçta tüm girdi segmentlerinin solunda olan dikey bir çizgi olarak hayal etmek faydalı olabilir.)
  3. Süre Q boş değil, olayı bulun ve buradan kaldırın Q bir noktayla ilişkili p minimum ile x-koordinat. Bunun ne tür bir olay olduğunu belirleyin ve aşağıdaki vaka analizine göre işleyin:
    • Eğer p bir çizgi parçasının sol uç noktasıdır s, ekle s içine T. Çizgi parçalarını bulun r ve t sırasıyla hemen üstte ve altındadır s içinde T (eğer varsa); eğer geçiş r ve t (komşuları s Durum veri yapısında) olay kuyruğunda gelecekteki olası bir olayı oluşturur, bu olası gelecekteki olayı olay kuyruğundan kaldırın. Eğer s haçlar r veya t, bu kesişme noktalarını olay kuyruğuna gelecekteki olası olaylar olarak ekleyin.
    • Eğer p bir çizgi parçasının sağ uç noktasıdır s, Kaldır s itibaren T. Segmentleri bulun r ve t bu (kaldırılmadan önce s) sırasıyla hemen üstünde ve altında idi T (eğer varsa). Eğer r ve t çapraz, bu geçiş noktasını olay kuyruğuna gelecekteki olası bir olay olarak ekleyin.
    • Eğer p iki parçanın kesişme noktasıdır s ve t (ile s altında t geçişin solunda), pozisyonlarını değiştirin s ve t içinde T. Değişimden sonra segmentleri bulun r ve sen (eğer varsa) hemen altında ve üstünde olanlar t ve s, sırasıyla. Kesişen noktaları kaldırın rs (ör. arasında bir geçiş noktası r ve s) ve tu (ör. arasında bir geçiş noktası t ve sen) olay kuyruğundan ve eğer r ve t çapraz veya s ve sen çapraz, bu kesişme noktalarını olay kuyruğuna ekleyin.

Analiz

Algoritma, her segment uç noktası veya geçiş noktası için sıralı sırayla bir olay işler. - tümevarımla kanıtlanabileceği gibi bu noktaların koordinatları. Bunun nedeni, Olay işlendiyse, sonraki olay (bu bir kesişme noktasıysa) ile temsil edilen segmentlerin sıralamasında bitişik olan iki segmentin kesişmesi olmalıdır. ve algoritma, olay kuyruğundaki potansiyel gelecek olaylar olarak komşu segmentler arasındaki tüm geçişleri koruduğu için; bu nedenle, sonraki doğru olay her zaman olay kuyruğunda mevcut olacaktır. Sonuç olarak, çözmek için tasarlandığı problem olan giriş hattı segmentlerinin tüm kesişmelerini doğru bir şekilde bulur.

Bentley – Ottmann algoritması bir dizi işliyor olaylar, nerede giriş satırı segmentlerinin sayısını gösterir ve kesişme sayısını gösterir. Her olay, ikili arama ağacında ve olay kuyruğunda sabit sayıda işlem tarafından işlenir ve (çünkü yalnızca segment uç noktaları ve bitişik segmentler arasında geçişler içerdiğinden) olay kuyruğu hiçbir zaman şunlardan fazlasını içermez: Etkinlikler. Tüm işlemler zaman alır . Dolayısıyla, algoritmanın toplam süresi .

Algoritma tarafından bulunan geçişlerin bulunduktan sonra depolanması gerekmiyorsa, algoritma tarafından herhangi bir zamanda kullanılan alan : Her biri giriş çizgisi segmentleri, ikili arama ağacının en fazla bir düğümüne karşılık gelir Tve yukarıda belirtildiği gibi olay kuyruğu en fazla elementler. Bu boşluk sınırının nedeni Kahverengi (1981); algoritmanın orijinal versiyonu biraz farklıydı (geçiş olaylarını başka bir olay iki kesişen segmentin bitişik olmamasına neden olduğunda) daha fazla alan kullanmasına neden olur.[3]

Chen ve Chan (2003) Bentley-Ottmann algoritmasının, bilgilerinin çoğunu girdiyi temsil eden bir dizideki segmentlerin sırasına göre kodlayan ve yalnızca ek hafıza hücreleri. Bununla birlikte, kodlanmış bilgilere erişmek için algoritma, logaritmik bir faktörle yavaşlatılır.

Özel pozisyon

Yukarıdaki algoritma açıklaması, çizgi parçalarının dikey olmadığını, çizgi parçası uç noktalarının diğer çizgi parçalarının üzerinde olmadığını, kesişmelerin yalnızca iki çizgi parçası tarafından oluşturulduğunu ve iki olay noktasının aynı değere sahip olmadığını varsayar. x-koordinat. Başka bir deyişle, köşe durumlarını hesaba katmaz, yani genel pozisyon giriş segmentlerinin uç noktalarının. Ancak, bu genel konum varsayımları çoğu çizgi parçası kesişimi uygulaması için makul değildir. Bentley ve Ottmann (1979) bu tür sayısal çakışmalardan kaçınmak için girdiyi biraz karıştırmayı önerdi, ancak bu karışıklıkların nasıl gerçekleştirileceğini ayrıntılı olarak açıklamadı. de Berg vd. (2000) Özel konum girdilerinin işlenmesine yönelik aşağıdaki önlemleri daha ayrıntılı olarak açıklayın:

  • Olay noktaları arasındaki bağları aynı şekilde kırın x-kullanarak koordine edin y-koordinat. Farklı etkinlikler y-Kordinatlar eskisi gibi işlenir. Bu değişiklik, hem birden çok olay noktası sorununu hem de aynı x- koordinat ve dikey çizgi segmentleri sorunu: Dikey bir segmentin sol uç noktası, daha düşük olanı olarak tanımlanır. y- koordinat ve böyle bir segmenti işlemek için gereken adımlar, çok yüksek bir eğime sahip dikey olmayan bir segmenti işlemek için gerekenlerle temelde aynıdır.
  • Bir çizgi parçasını bir kapalı küme, uç noktalarını içeren. Bu nedenle, bir uç noktayı paylaşan iki çizgi parçası veya başka bir parçanın uç noktasını içeren bir çizgi parçası, iki çizgi parçasının kesişimi olarak kabul edilir.
  • Birden çok çizgi parçası aynı noktada kesiştiğinde, bu kesişim için tek bir olay noktası oluşturun ve işleyin. Bu olayın neden olduğu ikili arama ağacında yapılan güncellemeler, bunun sağ son nokta olduğu herhangi bir çizgi parçasının kaldırılmasını, bunun sol uç nokta olduğu yeni çizgi bölümlerinin eklenmesini ve bu olay noktasını içeren kalan çizgi bölümlerinin sırasının tersine çevrilmesini içerebilir. . Tarafından açıklanan algoritma sürümünün çıktısı de Berg vd. (2000) kesişen çizgi parçası çiftleri kümesinden ziyade, ait oldukları parçalarla etiketlenen çizgi parçalarının kesişme noktaları kümesinden oluşur.

Dejenereliklere benzer bir yaklaşım, LEDA Bentley – Ottmann algoritmasının uygulanması.[4]

Sayısal hassasiyet sorunları

Algoritmanın doğruluğu için, bir çizgi parçası uç noktası ile diğer çizgi bölümleri arasındaki yukarıdaki-aşağıdaki ilişkilerin yaklaşık olarak belirlenmesi ve farklı olay noktalarının doğru bir şekilde önceliklendirilmesi gereklidir. Bu nedenle, giriş çizgisi segmentlerinin uç noktaları için tamsayı koordinatlarının kullanılması ve rasyonel sayı tam olarak iki parçanın kesişme noktalarının koordinatları kullanılarak keyfi kesinlikte aritmetik. Ancak bu koordinatların hesaplamalarını ve karşılaştırmalarını hızlandırmak mümkün olabilir. kayan nokta hesaplamalar ve bu şekilde hesaplanan değerlerin sıfırdan yeterince uzak olup olmadıklarının herhangi bir hata olasılığı olmadan kullanılabilir olup olmadığının test edilmesi.[4] Bentley-Ottmann algoritmasının saf bir uygulamasının gerektirdiği kesin aritmetik hesaplamalar, giriş koordinatlarından beş kat daha fazla hassasiyet biti gerektirebilir, ancak Boissonat ve Preparata (2000) Algoritmada gerekli kesinlik miktarını girdi koordinatları olarak bit sayısının iki katına düşüren değişiklikleri açıklar.

Daha hızlı algoritmalar

O (n günlük n) Bentley – Ottmann algoritması için zaman sınırının bir kısmı gereklidir, çünkü eşleşen alt sınırlar içinde kesişen çizgi segmentlerini tespit etme sorunu için cebirsel karar ağacı hesaplama modelleri.[5] Ancak, bağımlılık k, geçiş sayısı iyileştirilebilir. Clarkson (1988) ve Mulmuley (1988) her ikisi de rastgele hale getirilmiş algoritmalar sağladı düzlemsel grafik bunların uç noktaları çizgi parçalarının uç noktaları ve kesişimleri olan ve kenarları bu köşeleri birleştiren bölümlerin bölümleri olan O (n günlük n + k) ve bu problem aranjman inşaat çözüldü belirleyici olarak aynı O (n günlük n + k) zaman sınırı Chazelle ve Edelsbrunner (1992). Bununla birlikte, bu düzenlemeyi bir bütün olarak inşa etmek, O (n + k), O (n) Bentley-Ottmann algoritmasının uzay sınırı; Balaban (1995) O zamanındaki tüm kavşakları listeleyen farklı bir algoritma tanımladı (n günlük n + k) ve boşluk O (n).

Giriş çizgisi segmentleri ve bunların uç noktaları bir satırın kenarlarını ve köşelerini oluşturuyorsa bağlantılı grafik (muhtemelen geçişlerle), O (n günlük n) Bentley – Ottmann algoritması için zaman sınırının bir kısmı da azaltılabilir. Gibi Clarkson, Cole ve Tarjan (1992) göster, bu durumda problemi beklenen O (O) zamanında çözmek için rastgele bir algoritma varn günlük * n + k), nerede günlük* gösterir yinelenen logaritma, logaritmadan çok daha yavaş büyüyen bir fonksiyon. Yakından ilişkili bir rastgele algoritma Eppstein, Goodrich ve Strash (2009) aynı problemi O zamanında çözer (n + k günlük(ben)n) herhangi bir sabit için ben, nerede günlük(ben) logaritma işlevini yineleyerek elde edilen işlevi gösterir ben zamanlar. Bu algoritmalardan ilki, her zaman doğrusal zaman alır. k daha büyük n bir günlük tarafından(ben)n faktör, herhangi bir sabit için benikinci algoritma doğrusal zaman alırken k den daha küçük n bir günlük tarafından(ben)n faktör. Bu algoritmaların her ikisi de Bentley-Ottmann algoritmasının girdinin küçük rastgele örneklerine uygulanmasını içerir.

Notlar

  1. ^ Shamos ve Hoey (1976).
  2. ^ Algoritmanın açıklamasında de Berg vd. (2000), tarama çizgisi yataydır ve dikey olarak hareket eder; bu değişiklik, kullanımının değiştirilmesini gerektirir x- ve y- Algoritma boyunca tutarlı bir şekilde koordinasyon sağlar, ancak algoritmanın açıklaması veya analizi için büyük önem taşımaz.
  3. ^ Algoritmanın orijinal versiyonunun doğrusal olmayan uzay karmaşıklığı, Pach ve Sharir (1991).
  4. ^ a b Bartuschka, Mehlhorn ve Näher (1997).
  5. ^ Preparata ve Shamos (1985), Teorem 7.6, s. 280.

Referanslar

Dış bağlantılar