ค้นหาคู่ของค่าทั้งหมดที่อยู่ใกล้กับระยะทาง Hamming


11

ฉันมีค่า 32- บิตไม่กี่ล้าน สำหรับแต่ละค่าฉันต้องการค้นหาค่าอื่น ๆ ทั้งหมดที่อยู่ในระยะห่างของการแฮ็มที่ 5 ในแนวทางไร้เดียงสาสิ่งนี้ต้องใช้การเปรียบเทียบซึ่งฉันต้องการหลีกเลี่ยงO(ยังไม่มีข้อความ2)

ฉันรู้ว่าถ้าฉันเพิ่งปฏิบัติกับค่า 32- บิตเหล่านี้เป็นจำนวนเต็มและเรียงลำดับรายการหนึ่งครั้งแล้วค่าที่แตกต่างกันในบิตที่สำคัญน้อยที่สุดจบลงด้วยกัน สิ่งนี้ทำให้ฉันมี "หน้าต่าง" ที่สั้นลงหรือช่วงของตัวเลขภายในที่ฉันสามารถทำการเปรียบเทียบคู่ที่ชาญฉลาดจริงสำหรับระยะทางที่แน่นอน อย่างไรก็ตามเมื่อ 2 ค่าแตกต่างกันเฉพาะในลำดับบิตที่สูงกว่าพวกเขาจะจบลงนอก "หน้าต่าง" นี้และปรากฏในปลายตรงข้ามของรายการที่เรียงลำดับ เช่น

11010010101001110001111001010110

01010010101001110001111001010110

จะห่างกันมากถึงแม้ว่าระยะการแฮ็กของพวกเขาคือ 1 เนื่องจากระยะการแฮ็มระหว่าง 2 ค่าถูกเก็บรักษาไว้เมื่อหมุนทั้งสองฉันคิดว่าโดยหมุน 32 ซ้ายแล้วเรียงลำดับรายการทุกครั้งมีโอกาส 2 ค่า จะปิดท้ายพอในรายการที่เรียงลำดับอย่างน้อยหนึ่งรายการ

  1. แม้ว่าวิธีการนี้จะให้ผลลัพธ์ที่ดี แต่ฉันก็พยายามดิ้นรนเพื่อสร้างความถูกต้องของวิธีการนี้อย่างเป็นทางการ

  2. เนื่องจากฉันกำลังมองหาค่าที่ตรงกันซึ่งมีระยะการแฮงค์ระยะทางหรือน้อยกว่าฉันต้องหมุน 32 บิตทั้งหมดหรือไม่ เช่นถ้าและขนาดหน้าต่างของฉันคือ 1,000 ฉันต้องทำที่การหมุนสูงสุด 24 บิตเพราะแม้ว่าบิตเร่ร่อนจะปรากฏในลำดับบิตที่ต่ำกว่า 8 บิตผลลัพธ์ที่ได้จะไม่แตกต่างกันมากกว่า 1,000k = 1kk=1


แค่ไอเดียจากการคิด 20 วินาที: การจัดเรียงตามรหัสสีเทาคืออะไร? สิ่งที่เกี่ยวกับการแยกรายการของบิตแมป 32 บิตออกเป็นสี่รายการของบิตแมป 8 บิตแล้วใช้เทคนิคของคุณ
Karl Damgaard Asmussen

1
คุณช่วยให้แม่นยำมากขึ้นเกี่ยวกับบิตแมปจำนวนมากหรือไม่? อยู่ใกล้กับ ,หรืออะไรก็ตาม 2 30220230
ข้อปฏิบัติ

@ นาที: ฉันมีบิตแมป 32 บิตดังกล่าว 3-4 ล้าน
karterk

ฉันไม่แน่ใจว่าคุณถามอะไร คุณกำลังบอกว่าคุณมีสตริงของสตริงบูลีน 32 ตัวอักษร (ขนาดใหญ่ แต่ไม่ได้มีสตริงที่เป็นไปได้ทั้งหมด ) และคุณต้องการทำเครื่องหมายคู่ที่มีระยะห่าง Hamming สูงสุด 5 ในบางส่วน วิธีบางทีโดยการสร้างรายการที่เชื่อมโยงของดัชนีของเพื่อนบ้านใกล้เคียงสำหรับแต่ละสาย ? 4 × 10 9 iA[ผม]4×109A[i].closeผม
András Salamon

คิดว่ามีแนวคิดที่คล้ายคลึงกันของ"quadtrees"ยกเว้นกับ hypercubes ที่เกี่ยวข้อง อัลกอริทึมตั้งอยู่ & ค้นหาเวกเตอร์ซ้ำใน hypercubes และเมื่อคุณต้องการค้นหา bitvectors "ใกล้เคียง" คุณจะค้นหาไฮเปอร์คิวบ์ "ใกล้เคียง" เท่านั้น สงสัยว่ามันอาจจะมีการศึกษา & ในกระดาษบางแห่ง .... ไม่แน่ใจว่าคำที่ถูกต้อง ....
vzn

คำตอบ:


9

ตามที่ระบุไว้วิธีการของคุณเป็นปัญหาเพราะถ้า 2 บิตแมปมีความแตกต่างที่เว้นระยะเท่ากันในการหมุนใด ๆ จะมีความแตกต่างในบิตสูงบางส่วน

คุณสามารถทำให้แนวทางของคุณเป็นแบบทั่วไปโดยอนุญาตให้ตำแหน่งบิตเป็นแบบที่ซับซ้อนมากขึ้น แน่นอนถ้าคุณเลือกการเปลี่ยนแปลงแบบสุ่มของบิตแล้วความแตกต่างทั้งหมดระหว่าง 2 บิตแมปกับระยะทางจะปรากฏใน 16 บิตต่ำลำดับด้วยความน่าจะดีกว่า1 / 50 ดังนั้นการทำซ้ำสองสามร้อยครั้งคุณควรหาสัดส่วนของคู่บิตแมปที่มีขนาดใหญ่มาก สำหรับการทดลองแต่ละครั้งจำนวนคู่ที่จะทดสอบ (ที่มี 16 บิตสูงเดียวกัน) ใกล้กับ64 N (สำหรับN 2 22 )51/5064ยังไม่มีข้อความยังไม่มีข้อความ222

อย่างไรก็ตามฉันจะลองวิธีต่อไปนี้ด้วย สร้างรายการบิตแมปของคุณที่แก้ไขในตำแหน่ง 2 บิตสูงสุดและเรียงลำดับรายการนี้ หากมีการชนกันในรายการนี้คุณมีสองบิตแมปอยู่ในระยะที่4จากนั้นระบุค่าทั้งหมดของบิตแมปครั้งแรกของคุณปรับเปลี่ยนสามตำแหน่งและค้นหาพวกเขาในรายการเพื่อหาคู่ของบิตแมปที่ระยะทาง5 ค่าใช้จ่ายในหน่วยความจำของวิธีการนี้ต้องมีการจัดเก็บ529 Nองค์ประกอบและจำนวนขององค์ประกอบในการค้นหาในขั้นตอนที่สองคือ4960 N45529ยังไม่มีข้อความ4960ยังไม่มีข้อความ


ข้อมูลเพิ่มเติม:

  1. ความน่าจะเป็นที่ความแตกต่างอยู่ใน16บิตลำดับต่ำหลังจากการเปลี่ยนลำดับแบบสุ่มจาก32บิต - ตำแหน่งเป็นเพียงความฉลาดของสองทวินาม: 51632
    (165)(325)0.0217
  2. การสร้างรายการสำหรับแต่ละองค์ประกอบในรายการต้นฉบับใส่ในรายการเพิ่ม: องค์ประกอบเององค์ประกอบทั้งหมดต่างกันในตำแหน่งเดียวและองค์ประกอบทั้งหมดต่างกันในสองตำแหน่ง (เก็บข้อมูลเกี่ยวกับองค์ประกอบดั้งเดิม) จำนวนสำเนาสำหรับแต่ละองค์ประกอบคือการชนกันภายในรายการนี้ (ตรวจพบหลังการเรียงลำดับ) จะสอดคล้องกับองค์ประกอบดั้งเดิมสองตัวที่ระยะทางสูงสุดรายการ โปรดทราบว่าแต่ละคู่สามารถตรวจจับได้หลายครั้งดังนั้นคุณจะต้องลบรายการที่ซ้ำกัน (แต่นี่เป็นกรณีของอัลกอริทึมเริ่มต้นของคุณอยู่แล้ว)41+32+(322)=5294
  3. สำหรับรอบสุดท้ายจะดีกว่าที่จะตัดรายการองค์ประกอบที่เพิ่มเข้ามาเพื่อให้ห่างจากองค์ประกอบดั้งเดิมของพวกเขาเฉพาะในระยะที่เท่านั้น จากนั้นสำหรับองค์ประกอบต้นฉบับแต่ละรายการให้สร้างองค์ประกอบที่ระยะทางแล้วค้นหาในรายการที่เพิ่ม อีกครั้งคุณต้องลบข้อมูลซ้ำเนื่องจากแต่ละคู่จะถูกตรวจพบครั้ง [ด้วยความระมัดระวังเป็นพิเศษคุณสามารถคาดหวัง / หลีกเลี่ยงการซ้ำซ้อนส่วนใหญ่ แต่ฉันไม่แน่ใจว่ามันคุ้มค่ากับความพยายาม]( 32)23 ( 5)(323)=49603(53)=10

สำหรับวิธีแรกคุณจะบอกว่าฉันอนุญาตบิตแมปในคำสั่งที่กำหนดไว้ล่วงหน้าแทนที่จะทำเพียงแค่การหมุนบิต คุณช่วยอธิบายว่าคุณมีโอกาสได้ 1/50 ได้อย่างไร นอกจากนี้สำหรับแนวทางที่สองฉันต้องสร้างดัชนีของรายการก่อนแล้วสำหรับทุกองค์ประกอบ - สร้างชุดค่าผสม (32C1 + 32C2) แล้วตรวจสอบเทียบกับดัชนีนี้เพื่อระบุบิตแมปทั้งหมดที่แตกต่างกันด้วยระยะทาง 2 หรือไม่? มันจะดีถ้าคุณสามารถอธิบายเพิ่มเติมได้ ขอบคุณ
karterk

5

คำตอบของ minar นั้นยอดเยี่ยมและน่าจะเป็นวิธีที่เหมาะสมสำหรับปัญหานี้โดยเฉพาะ อย่างไรก็ตามฉันจะพูดถึงอีกวิธีหนึ่งที่เป็นไปได้:

Hx,YH(x)=H(Y)HH

ดังที่กล่าวไว้สำหรับปัญหาเฉพาะของคุณ (ด้วยพารามิเตอร์เฉพาะที่คุณกล่าวถึง) ฉันคาดว่าอัลกอริทึมทั้งสองของมินาร์จะพิสูจน์ได้ว่าดีกว่าการใช้แบบแผน LSH ฉันพูดถึงเรื่องนี้เฉพาะในกรณีที่ผู้อ่านคนอื่นมาที่นี่เพื่อถามปัญหาที่คล้ายกัน แต่ด้วยพารามิเตอร์ที่แตกต่างกันที่ LSH อาจทำให้รู้สึกมากขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.