Öklid mesafesine göre sıralama


17

x S y S x yS , bir düzlemdeki nokta kümesidir. Aynı düzlemde rastgele bir noktası verilir. Görev, S'deki tüm ve arasındaki Öklid mesafesine göre sıralamaktır .xSySxy

Beyinsiz bir yaklaşım, ve arasındaki mesafeleri hesaplamaktıryxy tüm için ve daha sonra herhangi bir hızlı algoritmayı kullanarak bunları sıralamaktır.yS

saklamanın veya önişlemenin herhangi bir yolu var mı, böylece sıralama işlemi daha hızlı hale geliyor mu?S


1
Karşılık gelen kareye göre (örneğin, hash tablosunu kullanarak) uygun boyutta ve grup noktalarında bir ızgara düşünebilirsiniz. Daha sonra belirli kare çiftleri için, bir karedeki tüm noktaların başka bir karedeki tüm noktalardan daha uzak olduğunu çıkarabilirsiniz . Pratikte yardımcı olabilir, sanırım. x
ilyaraz

Belirttiğiniz “beyinsiz yaklaşım”, O (n log n) zamanında çalışır, burada n, S'deki pratikte oldukça hızlı olan nokta sayısıdır. Giriş faktörünü atmak mı istiyorsunuz yoksa harici sıralama gibi başka bir şey mi istiyorsunuz ?
Tsuyoshi Ito

Mesele şu ki, puan setimi hazırlamak için neredeyse sınırsız zamanım var, ama bunları sıralamanın zamanı çok sınırlı. Bununla birlikte, standart sıralamadaki herhangi bir hızlanma takdir edilir - aynı O (n log n) olsa da, en kötü durumda (veya en iyi durumda veya her neyse) daha hızlı olsa bile.
Alex K.

Örneğin, S'yi 2 boyutlu ağaç olarak saklarsam, O (log n) zamanında en yakın komşuyu bulabilirim. Belki de görevim için benzer bir çözüm var. Mekansal veri yapılarında büyük bir uzman değilim - ve çok fazla var - kolayca özleyebiliyorum.
Alex K.

Yanıtlar:


13

Çözüm 1: Nokta çiftleri arasında dikey açıortayları bulun ve bu çizgilerin yerleşimini oluşturun. Düzenlemede, sıralı sıralamanın sabit olduğu Θ ( n 4 ) hücreleri vardır. Bu nedenle, düzenleme için bir nokta konum veri yapısı oluşturun ve her hücreyi, o hücre içindeki noktalar için döndürülecek sıralı sıra ile süsleyin. Bitişik hücreler arasındaki sıralı siparişler yalnızca tek bir transpozisyonda farklılık gösterir, bu nedenle bu sıralı siparişlerin temsillerini alan paylaşmasına izin vermek için kalıcı bir veri yapısı kullanabilirsiniz. Toplam alan O ( n 4 ) ve sorgu süresi OΘ(n2)Θ(n4)O(n4) .O(logn)

Çözüm 2: Bu aynı dikey bisektörlerin rasgele bir örneğini seçin , düzenlemelerini oluşturun ve her bir düzenleme hücresini, iki örneklenmiş hattın her kesişmesi boyunca dikey çizgi segmentleri ile bölün. Elde edilen bölüm vardır Θ ( n 2 ) geçtiği her bir yüksek olasılık ile olan hücreler, O ( n ) örneklenmemiş bisectors. Bölümün her hücresini, hücre içindeki bazı x 'lerden görüldüğü gibi, noktaların geçerli sıralı sıralaması ile süsleyin. Toplam alan O ( n 3 ) 'tür .Θ(n)Θ(n2)O(n)O(n3)

Şimdi, bir sorgu yapmak için, bölümdeki sorgu noktasını bulun, bölüm hücresiyle depolanan sıralamaya bakın ve bu saklı sıralamayla başlayarak Levcopoulos & Petersson'un (1989) Kartezyen ağacı karşılaştırma sıralama algoritmasını kullanın . Bu adımın süresi ile orantılıdır; burada k i , y i noktasıyla sıra dışı olan noktaların sayısıdır . Ancak Σ k i olan O ( n ) (her örneklenmemiş açıortay nedenleri en fazla bir puan üzerinden sırasız parite), sorgu zaman çokiO(1+logki)kiyikiO(n) de O ( n ) 'dir .iO(1+logki)O(n)


1
PS, aynı alanı ve sorgu süresini kullanan ancak daha basit bir sorgu algoritması için daha karmaşık bir ön işleme algoritması kullanan alternatif bir çözüm 2 varyantı: 11011110.livejournal.com/233793.html
David Eppstein

Why do n4 pre-processing when you could sort from all n starting points in O(n2logn) time and store the results in a hash table using space O(n2) for constant lookup?
Dave

Because there are Θ(n4) starting points with different sort orders, not Θ(n2).
David Eppstein

1

You're probably not going to be able to get away from nlog(n) time any way you slice it; even precomputing regions corresponding to all possible sort orders could (I believe) yield O(n!) regions and thus finding 'your' region by any meaningful search technique will take O(log(n!))=O(nlog(n)) time. (EDIT: this is absolutely wrong; see David Eppstein's excellent answer for more information!) One useful way of getting the complexity down, on the other hand - especially if you don't need the full sort at once but just need to be able to randomly pull out kth-nearest on the fly - might be through higher-order Voronoi diagrams: extensions of the standard Voronoi cell that accomodate not just the nearest neighbor but second-nearest, etc. Frank Dehne's paper on k-nearest neighbor searching, http://people.scs.carleton.ca/~dehne/publications/2-02.pdf seems to be the canonical reference; his homepage at http://www.dehne.carleton.ca/publications has a number of other papers on Voronoi diagrams that might be of some use.


3
If one partitions the plane into regions with different sort orders, there are Θ(n4) regions, not O(n!). The boundaries between regions are the perpendicular bisector lines of pairs of points, there are Θ(n2) such lines, and the set of regions is given by the arrangement of these lines.
David Eppstein

@David I think you should make this an answer.
James King

Seconded - n! felt wrong as I was writing it, but I couldn't see a case against. I'll amend my answer shortly to correct that, but I'd really like to see a more directly-informed one; thank you!
Steven Stadnicki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.