Yaklaşık aramayı destekleyen verimli harita veri yapısı


25

Girdi tuşuyla mümkün olan en yakın eşleşmeyi döndüren, verimli tuşların yaklaşık olarak aranmasını destekleyen (örneğin dizgiler için Levenshtein mesafesi) bir veri yapısı arıyorum. Şimdiye kadar bulduğum en uygun veri yapısı Burkhard-Keller ağaçları , ancak bu amaçla başka / daha iyi veri yapıları olup olmadığını merak ediyordum.

Düzenleme: Vakamın bazı detayları:

  • Dizeler genellikle birbirlerinden oldukça büyük bir Levenshtein farkına sahiptir.
  • Tellerin ortalama uzunluğu 10-12'ye yakın olan maksimum 20-30 karakter uzunluğundadır.
  • Verimli olarak sorgulamak istediğim çoğunlukla statik bir veri kümesi oluşturacağımdan, yerleştirme işleminden daha verimli bir arama ile daha fazla ilgileniyorum.

Giriş dizgisinde ve haritadaki öğe sayısının boyutunda herhangi bir koşul var mı? Haritaya yerleştirmenin ne kadar verimli olması gerekiyor?
edA-qa mort-ora-y

mrm, BK ağaçlarına söyleyebileceğim kadarıyla hala tüm ağacın oldukça büyük bir bölümüne bakıyor. Ama bu benim tarafımda erken optimizasyon olabilir sanırım?
merijn

3
Neredeyse yinelenen olma noktasıyla yakından ilgili: Hızlı yazım denetleyicisi oluşturmak için verimli veri yapıları
Raphael

Yanıtlar:


18

nO(d)O(d)nO(dϵ)31/ϵnd11

Diğer mesafeleri göz önünde bulundurmaya istekli iseniz, o zaman bölgeye duyarlı karma (LSH) harika bir iş çıkarır. Yöreye duyarlı hash, Indyk ve Motwani'nin ANNS problemini çözmek için öncülük ettiği bir tekniktir; burada yüksek boyutlu bir uzayda yaşayan noktaların (uzun vektörleri, uzun dizeleri vb. Okunması) az sayıda kovaya bağlanması, birbirlerinin yanında, iyi bir olasılık ile aynı kutuya eşlenirler ve birbirlerinden uzaktaki noktalar, aynı zamanda iyi olasılıklara sahip farklı kutulara eşlenir. İçinde Indyk ve Andoni tarafından büyük ve çok erişilebilir anket makale vardır CACM . Bu teknik basit ve hızlıdır ve küçük alan gereksinimlerine sahiptir; orada da kod var (makalenin kodla bağlantısı olduğunu düşünüyorum). Hamming mesafesi gibi şeyler için (ve bazı rejimlerde işe yarar)1

Bu tür bir soru cstheory için iyi bir seçimdir.SE . Orada ilgili bir soru var , ancak tam komşusu için sormak gibi görünüyor.


12

İlgilendiğiniz veri yapıları metrik ağaçlardır. Yani, metrik uzaylarda verimli aramaları destekliyorlar. Bir metrik boşluk, bir dizi nesne ve bunlar arasında tanımlanan üçgen eşitsizliğini sağlayan bir mesafe fonksiyonundan oluşur. Amaç, sorguya yeterince yakın olan nesneleri almak için bir nesne kümesi ve bir sorgu öğesi verilir.

Arama sorunları kelimenin tam anlamıyla bilgisayar biliminin her yerinde olduğu için, çok sayıda farklı metrik ağaç vardır. Ancak, en az iki gruba ayrılabilir: pivot tabanlı ve kümelemeye dayalı (ve kesinlikle melezler de var). İyi bir anket E. Chavez ve diğ., Metrik Uzaylarda Arama, 2001 . Bkz. Örneğin Bölüm 5: Metrik Uzaylara Güncel Çözümler, sayfa 283.

O(nα)0<α<1O(n2)O(1)

Chavez ve diğ. ayrıca diğer ağaçlara güzel bir genel bakış ve özel olarak herhangi biri ilginizi çekerse doğal olarak daha fazla referans verin. Uygulamada, farklı ağaçların performansı genellikle deneysel olarak değerlendirilir. Bu bence mekanın yapısına çok bağlı. Bu nedenle, özellikle hangi ağacın sizin durumunuzda en verimli olacağını söylemek zordur. Yine de, ilk önce en kolay olanı seçmenin iyi bir fikir olduğunu düşünüyorum. BK-ağaçları inşa edilmesi en kolay olanı ise, önce onları deneyin. Gereksinimlerinizi karşılamıyorlarsa, alanınız hakkında daha bilinçli kararlar almanıza yardımcı olacak daha fazla gerçekleri toplamak için zaman (ve belki de programlama zamanı) harca.

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.