Hamming mesafesi altındaki tüm değer çiftlerini bulun


11

Birkaç milyon 32-bit değerim var. Her değer için 5'lik bir çekiçleme mesafesi içindeki diğer tüm değerleri bulmak istiyorum. Saf yaklaşımda, bu kaçınmak istediğim O(N2) karşılaştırmaları gerektirir .

Bu 32 bit değerlere tamsayı olarak davranıp listeyi bir kez sıralarsam, o zaman sadece en az anlamlı bitlerde farklılık gösteren değerlerin birbirine çok yakın olduğunu fark ettim. Bu, daha kısa bir "pencere" veya tam çekiçleme mesafesi için gerçek çift karşılaştırmalar yapabileceğim bir sayı aralığına sahip olmamı sağlıyor. Bununla birlikte, 2 değer yalnızca daha yüksek sıra bitlerinde değiştiğinde, bu "pencere" dışında kalırlar ve sıralanan listenin karşı uçlarında görünürler. Örneğin

11010010101001110001111001010110

01010010101001110001111001010110

çekiçleme mesafesi 1 olmasına rağmen çok uzak olacaktır. Her ikisi de döndürüldüğünde 2 değer arasındaki çekiçleme mesafesi korunduğundan, 32 sola dönüş yaparak ve ardından listeyi her seferinde sıralayarak, muhtemelen 2 değerin bunlardan en az birinde sıralanan listede yeterince yakın sonuçlanır.

  1. Her ne kadar bu yaklaşım bana iyi sonuçlar veriyor olsa da, bu yaklaşımın doğruluğunu resmi olarak belirlemeye çalışıyorum.

  2. Darbe mesafesi k veya daha az olan eşleşen değerleri aradığım göz önüne alındığında, gerçekten 32 bit dönüşlerin hepsini yapmam gerekir mi? Örneğin, k=1 ve pencere boyutum 1000 ise, maksimum 24 bit rotasyonda yapmam gerekir, çünkü kaçak bit 8 alt sıra bitinden birinde görünse bile, elde edilen sayılar 1000'den fazla değişmez.


Sadece 20 saniyelik düşünce: Fikirler Gray-Code'a göre? 32 bit bitmaplerin listesini 8 bit bitmaplerin dört listesine bölüp tekniğinizi kullanmaya ne dersiniz?
Karl Damgaard Asmussen

1
220230

@minar: Böyle 32 bit bitmap'lerden 3-4 milyonum var.
karterk

A[i]4×109A[i].closei

uygulanabilir hiper küpler dışında benzer bir "dörtlü" kavramı olduğunu düşünün . algoritma vektörleri hiper küplerde bulur ve özyinelemeli olarak bulur ve sonra "yakın" bitvektörleri aramak istediğinizde, yalnızca "yakın" hiper küpleri ararsınız. şüpheli o çalışma ve bir yerde bir kağıt .... emin değilim doğru terimler ....
vzn

Yanıtlar:


9

Belirtildiği gibi, yaklaşımınız sorunludur, çünkü 2 bitmap'in herhangi bir dönüşte eşit aralıklı farklılıkları varsa, bazı yüksek dereceli bitlerde farklılıklar olacaktır.

51/5064NN222

45529N4960N


Ek bilgi:

  1. 51632
    (165)(325)0.0217
  2. Orijinal listedeki her eleman için listelerin oluşturulması, artırılmış listeye konur: elemanın kendisi, tüm elemanlar bir konumda farklıdır ve tüm elemanlar iki konumda farklıdır (orijinal eleman hakkında bilgi tutarak). Her öğenin kopya sayısıBu listedeki herhangi bir çarpışma (sıralamadan sonra algılanır) en fazla mesafedeki iki orijinal öğeye karşılık gelir . Her çiftin birkaç kez tespit edilebileceğini unutmayın, bu nedenle kopyaları kaldırmanız gerekir (ancak ilk algoritmanızda durum böyleydi).1+32+(322)=529.4
  3. Son geçiş için, yalnızca orijinal öğelerinden tam olarak uzakta olanları tutmak için artırılmış elemanlar listesini budamak tercih edilir . Ardından, her orijinal öğe için öğeleri mesafesinde oluşturun ve bunları artırılmış listede arayın. Bir kez daha, her bir çift kez tespit edileceğinden kopyaları kaldırmanız gerekiyor . [Ekstra özenle, çoğu kopyayı tahmin edebilir / önleyebilirsiniz, ancak çabaya değip değmeyeceğinden emin değilim.]2(323)=49603(53)=10

İlk yaklaşım için, bitmap'e sadece biraz dönme yapmak yerine önceden belirlenmiş bazı siparişlerde izin verdiğimi mi söylüyorsunuz? 1/50 olasılığınızı nasıl elde ettiğinizi açıklar mısınız? Ayrıca, ikinci yaklaşım için, önce listemden bir dizin oluşturmam ve sonra her öğe için - 32C1 + 32C2) kombinasyonları oluşturmam ve 2 bit mesafeden farklı tüm bitmap'leri tanımlamak için bunları bu dizine karşı kontrol etmem gerekir mi? Bunu daha fazla açıklayabilirseniz harika olur. Teşekkürler.
karterk

5

minar'ın yanıtı mükemmeldir ve muhtemelen bu sorun için doğru yaklaşımdır. Ancak, olası bir yaklaşımdan daha bahsedeceğim:

Bir kullanabilirsiniz yerellik duyarlı karma işlevi (LSH). Yere duyarlı bir karma işlevi , Hamming mesafesine yakınsa, . Eğer böyle bir karma varsa , o zaman (hash fonksiyonu kullanarak bir karma tabloya tüm değerlerini saklayabilir ve açık karma) ve sonra çok hızlı bir şekilde Hamming mesafe yakın değerlerin tüm çiftleri bulmak mümkün olacak . Bir LSH oluşturmak için çeşitli teknikler vardır; birkaç aday bulmak için bu konudaki referanslara bakabilirsiniz.Hx,yH(x)=H(y)HH

Bununla birlikte, özel probleminiz için (bahsettiğiniz spesifik parametrelerle), minar'ın iki algoritmasının pratikte herhangi bir LSH tabanlı şemadan daha iyi olacağını umuyorum. Bunu sadece diğer okuyucuların bu soruya benzer bir sorunla gelmesi durumunda, ancak LSH'nin daha anlamlı olabileceği farklı parametrelerle gelmesi durumunda bahsediyorum.

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.