มีฟังก์ชันแฮชสำหรับคอลเลกชัน (เช่นชุดหลายชุด) ของจำนวนเต็มที่มีการค้ำประกันทางทฤษฎีที่ดีหรือไม่?


36

ฉันอยากรู้ว่ามีวิธีเก็บแฮชของจำนวนเต็มหลายชุดที่มีคุณสมบัติดังต่อไปนี้หรือไม่:

  1. มันใช้พื้นที่ O (1)
  2. สามารถอัปเดตให้สะท้อนถึงการแทรกหรือการลบในเวลา O (1)
  3. คอลเลคชั่นที่เหมือนกันสองชุด (เช่นคอลเลกชันที่มีองค์ประกอบเดียวกันที่มีหลายหลากเท่ากัน) ควรแฮชไปที่ค่าเดียวกันเสมอและคอลเลกชันที่แตกต่างกันสองชุดควรแฮชกับค่าที่แตกต่างกัน

หนึ่งความพยายามครั้งแรกในที่นี้คือการจัดเก็บโมดูโลผลิตภัณฑ์แบบสุ่มนายกรัฐมนตรีของแฮชขององค์ประกอบแต่ละรายการ สิ่งนี้ตรงกับที่ 1 และ 2 แต่ไม่ชัดเจนว่ามันหรือการเปลี่ยนแปลงที่ใกล้เคียงจะตอบสนอง 3

ฉันเดิมโพสต์เกี่ยวกับเรื่องนี้StackOverflow

* คุณสมบัติที่ 1 และ 2 อาจผ่อนคลายเล็กน้อยเพื่อพูด O (log n) หรือพหุนามย่อยขนาดเล็ก ประเด็นคือเพื่อดูว่าเราสามารถระบุหลายชุดและทดสอบความเท่าเทียมกันอย่างน่าเชื่อถือได้หรือไม่โดยไม่ต้องจัดเก็บองค์ประกอบเอง


การเป็นตัวแทนของชุดโฆษณาหลายชุดของคุณคืออะไร นั่นคือคุณจะเข้ารหัส multiset เป็นบิตสตริงได้อย่างไร หากคุณต้องการได้รับการดำเนินการ - เวลา (เป็นอิสระจากขนาดของมัลติเซ็ต) ฉันคิดว่าคุณควรทำการเข้ารหัสอย่างชัดเจน O(1)
Jukka Suomela

การเข้ารหัสของชุดนั้นไม่สำคัญ ฟังก์ชั่นแฮชควรเป็นอิสระจากการเป็นตัวแทนของชุด ถ้าฉันใช้การแทนค่าแบบบัญญัติของชุดแฮชแล้วแฮชมาตรฐานใด ๆ ที่การแทนค่าบิตของชุดจะเป็นไปตาม 3 และอาจเป็น 1 แต่ไม่ใช่ 2 ฉันควรเพิ่มว่าคอลเลกชันที่เท่ากันสองชุดควรแฮชเป็นค่าเดียวกันเสมอ
jonderry

คุณหมายถึงอะไรโดย 2 คุณได้รับชุดรหัสแฮชเก่าและองค์ประกอบใหม่และคุณต้องการคำนวณรหัสแฮชใหม่หรือไม่ หรือคุณเพิ่งได้รหัสแฮชเก่าและองค์ประกอบใหม่
หมดเวลา

เป็นการดีที่คุณจะไม่ต้องการชุดเก่า คุณไม่จำเป็นต้องทำการค้นหาสมาชิก (สำคัญให้พื้นที่ จำกัด ) เพียงแค่การทดสอบความเท่าเทียมกันอาจผ่านการเปรียบเทียบค่าแฮชที่มีความน่าจะเป็นเชิงบวกต่ำ
เบื่อ

คำตอบ:


17

[u]O(lgu)u

p a [ p ] i a i O ( lg i ) u u O ( u / p ) p p = u 2 [ u ]h(x)=(i=1uxiai)modppa[p]iaiO(lgi)uuO(u/p)P) สิ่งนี้สามารถทำให้เล็กมากได้โดยการให้มีขนาดใหญ่พอ (ตัวอย่างเช่นและคุณทำงานใน "double precision") หากฉากนั้นเล็กกว่าแน่นอนคุณสามารถเริ่มต้นได้โดยการทำให้จักรวาลกลายเป็นจักรวาลที่เล็กกว่าpp=u2[u]

ไม่มีใครรู้วิธีการแก้ปัญหาด้วยความน่าจะเป็นการปะทะกันของเมื่อ hashing ถึงช่วง ? สิ่งนี้น่าจะเป็นไปได้[ p ]O(1/p)[p]


0

คาร์เตอร์และ Wegman ครอบคลุมในฟังก์ชันแฮชใหม่และใช้ในการตรวจสอบและการตั้งค่าความเท่าเทียมกัน ; มันคล้ายกับที่คุณอธิบาย โดยพื้นฐานแล้วฟังก์ชันสับเปลี่ยนสับเปลี่ยนสามารถอัปเดตองค์ประกอบหนึ่งครั้งสำหรับการแทรกและการลบและการจับคู่ความน่าจะเป็นสูงใน O (1)


ฉันคิดว่ามันใช้งานได้ในชุดเท่านั้นไม่ใช่หลายชุด (ตามคำถามที่ถาม) จากส่วนที่ 5 ที่ด้านล่างของหน้า 274: "เพิ่ม (x, S) - เพิ่มองค์ประกอบ x ไปยังชุดชื่อ S การดำเนินการนี้อาจไม่สามารถใช้หาก x เป็นสมาชิกของ S. อยู่แล้ว"
jbapple

คุณถูก; ฉันพลาดส่วน "หลาย" ดูเหมือนว่าฟังก์ชั่นแฮชสามารถจัดการข้อมูลซ้ำได้แม้ว่าฉันจะไม่มีการอ้างอิง
KWillets

-2

คุณภาพของฟังก์ชั่นแฮชจะขึ้นอยู่กับคุณสมบัติขององค์ประกอบที่มีแฮชอยู่เสมอ คุณพูดอะไรเกี่ยวกับเรื่องนี้ได้บ้าง? ตัวอย่างเช่นคำแนะนำผลิตภัณฑ์ของคุณอาจเป็นฟังก์ชั่นแฮชที่ไม่ดีหากองค์ประกอบ x_i ของชุดข้อมูลของคุณมักมีปัจจัยสำคัญเพียงเล็กน้อย แต่คุณสามารถปรับปรุงได้ในกรณีนี้เพียงแค่นำผลิตภัณฑ์ของ x_i + p mod q ทั้งหมดสำหรับบางช่วงเวลา p และ q


1
ใช่นั่นคือเหตุผลในการแฮชขององค์ประกอบแต่ละตัวก่อนที่จะคูณเข้าด้วยกัน
เบื่อ

อะไร? ข้อเสนอแนะของ OP คือการรวมพวกมันทั้งหมดเข้าด้วยกันใช่ไหม? ฉันกำลังบอกว่าถ้าคุณเพิ่มค่าคงที่ก่อนที่คุณจะทำเช่นนี้คุณอาจได้รับแฮชที่ดีขึ้น
TonyK

-5
A = 0x4F1BBCDD
B = 0x314EFB75
A*B = 1 
N = size of set before addition/removal<P>
Add X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U+X)&M)<<16) + ((V^X)&M)
H *= A
H += N+1

Remove X
H = (H-N)*B
U = H >> 16
V = H & 0xFFFF
H = (((U-X)&M)<<16) + ((V^X)&M)
H *= A
H += N-1

ผลรวมช่วยให้เราสามารถเกิดขึ้นหลายครั้งที่มีค่าเดียวกัน
ที่ xor ช่วยให้เรามีชุดผลรวมที่เป็นจำนวนเดียวกัน

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