yarıçap içinde ev bulmak


10

Bir röportaj sırasında bana şu sorular verildi: Şu anda piyasada bulunan (yani satılık) tüm evleri belirli bir mesafede listeleyen bir gayrimenkul uygulaması (örneğin, kullanıcı 20 mil içindeki tüm evleri bulmak istiyor), bu tür bir hizmet oluşturmak için uygulamanızı (hem veri yapısı hem de alogirithm) nasıl tasarlarsınız?

Herhangi bir fikir? Nasıl uygularsınız? Ona daha önce hiç coğrafi ile ilgili bir şey yapmadığımı bilmediğimi söyledim.

Yanıtlar:


6

Muhtemelen uzamsal indekslemeden bahseden bir cevaptan sonradır , büyük olasılıkla kutudan uzamsal indeksleme sağlayan bir veritabanı seçerek , ancak gerekirse bir R uygulayarak uygulamanın kendisinde uygulanabileceğini belirterek birkaç puan da alabilirsiniz. -Tree (DB seçimi başka nedenlerle düzeltildiyse kullanışlı olabilir mi? Ayrıca, uzamsal veritabanlarının nasıl çalıştığını bildiğinizi gösterir). Mekansal indeksleme, bir arama kutusunun içine sığacak konumların bir alt kümesini hızlı bir şekilde almanıza olanak tanır, her biri için gerçek bir arama yapmak için gerçek mesafeyi (gerekirse, yalnızca tek başına dikdörtgen yeterince iyi olabilir) hesaplayarak bunu daha da hassaslaştırabilirsiniz. daire / elips

Mesafelerin muhtemelen 20M veya daha az olduğu göz önüne alındığında, 20M ucuna doğru fark edilebilir hatalar görmeye başlayacak olsanız da, mesafeyi hesaplamak için düz bir dünya olduğunu varsayarsınız, çok daha büyük aralıklara doğru bir şekilde ihtiyaç duyulursa, daha iyi mesafe modellerine de bakmaya başlamanız gerekir. dünya için örneğin Haversine mesafesi

elbette tartışılabilecek sayısız başka detay da var, örneğin UI tasarımı, kendi başlarına tüm konular olabilecek DB şeması


20 mil hızda, düz bir toprak modelinden kaynaklanan hatalar ihmal edilebilir. Her neyse, bir kullanıcı ofisinin 20 mil yakınında bir ev listesi görmek istediğinde, sonuçlara 20 mil ve 10 metre uzaklıkta bir evin dahil edilip edilmediğini umursamıyor.
kevin cline

1
Gerçekten de, eğer birkaç yanlış pozitif önemli değilse, gerçek mesafe hesaplamasını tamamen atlayabilir ve MBR
jk'yi

Merak ettiğim bir şey var: Satılık çok sayıda ev göz önüne alındığında, şirketler (Zillo gibi?) Hepsini bir db'de saklıyor ve sadece seçmeye devam ediyor mu? Bunun büyük bir performans isabeti olacağını hayal ediyorum ve hepsini bir grafik temsili ile hafızada saklamak çok daha hızlı olurdu - belki matris veya bitişik liste ve en yakın evleri bulmak için mesafe algoritmalarını kullanın. Ne düşünüyorsun?
paul smith

@paulsmith Bilmiyorum, ancak bunun bir uzamsal DB'de olduğundan şüpheleniyorum, bir uzamsal DB muhtemelen dahili olarak bir grafik gösterimi kullanacak (büyük olasılıkla tartışıldığı gibi bir R-Ağacı, ancak başka seçenekler var) anahtar sadece asgari sınırlayıcı dikdörtgendeki öğeleri seçebilir
jk.

8

Ne zaman böyle bir soru ile karşılaşırsanız ve sadece problem alanında uzmanlığa sahip değilseniz, birkaç şey yapmak iyidir.

Öncelikle bu sorun alanında belirli bir uzmanlığa sahip olmadığınızı kabul edin.

İkincisi , problemi nasıl çözeceğinizi açıklayın.

Coğrafi arama ile çalışırken belirli bir deneyimim olmasa da, sorunu çözmek için iyi belgelenmiş algoritmalar ve mevcut teknolojiler olduğundan eminim. Benim kullanabileceğim ortak çözümler hakkında bilgi edinmek ve projenin gereksinimlerine göre uygulama hakkında bir seçim yapmak için bunları keşfedeceğim.

Üçüncüsü , bunun gibi sorunları her zaman temel bileşenlerine indirgeyin. Bir haritadaki konumların 2 boyutlu olarak dağıtıldığını biliyorsunuz. Eğer rasgele x verilirse, y koordinatlarının her koordinatla başka bir koordinattan uzaklığını bir üçgen oluşturarak ve bilinmeyen uzunluğu çözerek hesapladığını bilirsiniz. Ayrıca, sınırlayıcı bir kutu içindeki tüm koordinatları bulmanız istenirse, bunu sadece bulmak istediğiniz kutunun genişliklerini hesaplayarak ve her iki eksen boyunca mantıktan daha az basit kullanarak yapabileceğinizi de bilirsiniz.

Son olarak , sorulardan vazgeçmiş gibi görünen bir geliştiriciyi hiç işe almadım . Bir soru sorarsam ve kişi "Bilmiyorum" der ve sözlü olarak düşünmeye bile çalışmazsa, bana beyin fırtınası oturumlarına katkıda bulunmayacakları izlenimini verir - bu da yazılım yazan kuruluşlarda kritiktir .


tüm iyi tavsiyeler
jk.

@Ben, bahsettiğiniz her şeye kesinlikle katılıyorum, ancak görüşmeci oturum başlamadan önce açıkça söylediğini bilmediğinizi söylemenin iyi olduğunu söyledi, sadece talimatlarını izledim ve ona bilmediğimi açıkça söyledim: )
paul smith

4

Bu muhtemelen açıktır, ancak birçok uygulama için fakir adamın yavaş çözümü iyi olabilir.

Enlem ve boylam depolayan ilişkisel bir veritabanında bir tablo var. 20 mil içinde enlem ve 20 mil içinde bir boylam olan tüm yerleri sorgula. Bu, gerçekten aramak istediğiniz yarıçapı içeren en küçük sınırlayıcı dikdörtgenin boyutunu size sınırlayan bir dikdörtgen verir (ve dünyanın eğriliğini de göz ardı eder).

Ardından, döndürülen seti (dizinleri kullanarak bir sorgu ile) alır ve doğru bir mesafe hesaplaması kullanarak filtreleyebilirsiniz.

Yani, verimli performans değil, zaman içinde çok verimli gelişir. Birçok uygulama için daha iyi bir seçim olabilir.


2

Muhtemelen en kolay yol, 2B manzaraya dağıtıldığı varsayılarak evlerinizin konumlarını saklamak için bir dörtlü kullanmaktır . Arama oldukça basit olmalıdır.

Eşyalarınızı saklamak için CBS özellikli bir RDBMS kullanıyorsanız, bunun için endişelenmenize gerek yoktur. Lider oyuncuların performansı hakkında bazı bilgiler için bu soruya bakın .

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.