ทำไมจึงเป็นการดีที่สุดที่จะใช้หมายเลขเฉพาะเป็น mod ในฟังก์ชัน hashing


57

ถ้าฉันมีรายการของค่าคีย์จาก 1 ถึง 100 และฉันต้องการจัดระเบียบพวกเขาในอาร์เรย์ 11 ถังฉันได้รับการสอนให้สร้างฟังก์ชั่น mod

H=kmod 11

ตอนนี้ค่าทั้งหมดจะถูกวางทีละแถวใน 9 แถว ยกตัวอย่างเช่นในถังแรกจะมี0,11,22\ ในวินาทีจะมี1,12,23เป็นต้น

สมมติว่าฉันตัดสินใจที่จะเป็นเด็กเลวและใช้ฟังก์ชั่นที่ไม่เฉพาะเจาะจงเป็นฟังก์ชัน hashing ของฉัน - ใช้เวลา 12 ใช้ฟังก์ชั่น Hashing

H=kmod 12

จะส่งผลให้ตารางแฮชที่มีค่า0,12,24ในที่ฝากข้อมูลแรก, 1,13,25ฯลฯ ในที่สองเป็นต้น

เป็นหลักพวกเขาเป็นสิ่งเดียวกัน ฉันไม่ได้ลดการชนและฉันไม่ได้กระจายสิ่งที่ดีขึ้นโดยใช้รหัสแฮชหมายเลขเฉพาะและฉันไม่สามารถเห็นได้ว่ามันจะมีประโยชน์อย่างไร


คำถามที่เกี่ยวข้องทำไมเราใช้ xor ใน hash-function stackoverflow.com/questions/5889238//
shuva

คำตอบ:


62

พิจารณาชุดของปุ่มและตารางแฮชซึ่งมีจำนวนของถังคือmเนื่องจากคือปัจจัยคีย์ที่เป็นทวีคูณของจะถูกแฮ็กไปยังถังที่มีทวีคูณเป็น :K={0,1,...,100}m=1231233

  • คีย์จะถกถังเก็บ0{0,12,24,36,...}0
  • คีย์จะถกถังเก็บ3{3,15,27,39,...}3
  • คีย์จะถกถังเก็บ6{6,18,30,42,...}6
  • คีย์จะถกถังเก็บ9{9,21,33,45,...}9

หากกระจายอย่างสม่ำเสมอ (เช่นทุกคีย์ในมีแนวโน้มที่จะเกิดขึ้นเท่ากัน) การเลือกจะไม่สำคัญ แต่จะเกิดอะไรขึ้นถ้าไม่กระจายอย่างสม่ำเสมอ? ลองจินตนาการว่าคีย์ที่มีแนวโน้มที่จะเกิดขึ้นเป็นทวีคูณของ3ในกรณีนี้ถังทั้งหมดที่ไม่ใช่ทวีคูณของจะว่างเปล่าด้วยความน่าจะเป็นสูง (ซึ่งแย่มากในแง่ของประสิทธิภาพของตารางแฮช)KKmK33

สถานการณ์นี้เป็นเรื่องปกติที่อาจดูเหมือน ลองจินตนาการว่าคุณกำลังติดตามวัตถุตามที่เก็บไว้ในหน่วยความจำ ถ้าขนาดของคำว่าคอมพิวเตอร์ของคุณเป็นสี่ไบต์แล้วคุณจะได้รับการ hashing กุญแจที่มีหลายรายการที่ 4จำเป็นที่จะกล่าวว่าการเลือกจะเป็นหลายจะเป็นทางเลือกที่น่ากลัว: คุณจะต้องบุ้งกี๋ว่างเปล่าและทั้งหมดของคีย์ของคุณชนที่เหลือบุ้งกี๋4m43m/4m/4

โดยทั่วไป:

คีย์ทุกตัวในที่ใช้ร่วมกันกับจำนวนที่เก็บข้อมูลจะถูกแฮชไปยังที่ฝากข้อมูลที่เป็นตัวคูณของปัจจัยนี้Km

ดังนั้นเพื่อลดการชนกันมันเป็นสิ่งสำคัญที่จะลดจำนวนของปัจจัยร่วมกันระหว่างและองค์ประกอบของKสิ่งนี้จะสำเร็จได้อย่างไร โดยการเลือกให้เป็นตัวเลขที่มีปัจจัยน้อยมาก: จำนวนเฉพาะmKm


ฉันเพิ่งเห็นว่าคำค้นหาของฉันสอดคล้องกับคำตอบของคุณ คุณคิดว่าฟังก์ชั่นแฮชในข้อความค้นหาของฉันนั้นดีหรือไม่?
แลกเปลี่ยน

@overexchange: ฉันตอบคำถามของคุณ คำตอบนี้อาจเป็นที่สนใจสำหรับคุณ
Mario Cervera

เหตุใดการเลือกของ m จึงสำคัญเฉพาะเมื่อ K เบ้? ไม่เป็นความจริงหรือว่าเราจะมีประสิทธิภาพที่แย่ลงด้วย m ที่ไม่ดีแม้ว่า K จะกระจายอย่างสม่ำเสมอ
vorou

ขึ้นอยู่กับความหมายของ "bad " หากคุณหมายถึง "เล็กเมื่อเทียบกับจำนวนขององค์ประกอบในตารางแฮช" (เช่นตัวประกอบการโหลดสูง) ประสิทธิภาพจะไม่ดี อย่างไรก็ตามถ้าคุณหมายถึง "ไม่สำคัญ" ความจริงข้อนี้ไม่สำคัญเลยถ้าคีย์ทั้งหมดมีโอกาสเท่ากันเพราะมันจะถูกกระจายอย่างเท่าเทียมกันในตารางแฮช คำถามตัวเองให้ตัวอย่าง m
Mario Cervera

16

การชนกันนั้นมีโอกาสน้อยกว่าที่จะใช้เฉพาะช่วงเวลานั้นขึ้นอยู่กับการแจกจ่ายคีย์ของคุณหรือไม่

ถ้าหลายคีย์ของคุณมีรูปแบบและฟังก์ชันแฮชคุณคือแล้วคีย์เหล่านี้ไปยังกลุ่มย่อยขนาดเล็กของถัง IFFแบ่งnดังนั้นคุณควรลดจำนวนดังกล่าวซึ่งสามารถทำได้โดยเลือกไพรม์a+kbH(n)=nmodmbnb

หากคุณต้องการมีที่เก็บข้อมูลถึงถังและคุณรู้ว่าความแตกต่างซึ่งเป็นทวีคูณมีแนวโน้มมากกว่าความแตกต่างซึ่งเป็นทวีคูณของและคุณอาจเลือกสำหรับแอปพลิเคชันพิเศษของคุณ1112112312


1
แต่ถ้าคีย์ของฉันไม่ได้มีรูปแบบแล้วไม่สำคัญ? นั่นถูกต้องใช่ไหม? a+k×bm
CodyBugstein

1
@lmray หากคีย์ของคุณมีการกระจายอย่างสม่ำเสมอไม่สำคัญ ถ้าไม่ใช่มันก็จะขึ้นอยู่กับการแจกแจงที่แม่นยำสำหรับเพื่อสสารหรือไม่ mm
AProgrammer

เพียงแค่หวนกลับแก้ไขแล้วผมลืมไปว่า12>12>11
frafl

3
คุณหมายถึงว่า "ไปที่ชุดย่อยขนาดเล็กของถังถ้า iffหาร " bm
Mikhail Dubov

8

ไม่ว่าจะมีผลกระทบหรือไม่นั้นขึ้นอยู่กับว่าคุณปฏิบัติต่อการชนหรือไม่ เมื่อใช้ตัวแปรhashing แบบเปิดการใช้ช่วงเวลาจะช่วยให้แน่ใจว่าสล็อตว่างจะพบได้ตราบเท่าที่ตารางว่างเปล่าเพียงพอ

ลองแสดงสิ่งต่อไปนี้เช่น:

สมมติว่าเราต้องการที่จะใส่องค์ประกอบที่ hashes ไปยังที่อยู่และแก้ไขปัญหาการชนกันโดยพยายามที่ตำแหน่งต่อมาสำหรับiaa+i2i=1,2,

แสดงว่าโพรซีเดอร์นี้ให้ตำแหน่งว่างเสมอหากตารางแฮชมีขนาด ,ใหญ่กว่าและอย่างน้อยครึ่งหนึ่งของตำแหน่งทั้งหมดว่างpp3

คำแนะนำ: ใช้ความจริงที่ว่าวงแหวนระดับกากโมดูโลเป็นสนามถ้าเป็นไพร์มดังนั้นจึงมีคำตอบไม่เกินตัวppi2=c2


2

ถ้าฟังก์ชันแฮชของคุณเป็นของแบบฟอร์มที่เป็นสำคัญและสุ่มเลือกแล้วน่าจะเป็นที่ 2 ปุ่มที่แตกต่างกันกัญชาถังเดียวกันคือกว่าเมตร ดังนั้นสำหรับ ,ซึ่งมีขนาดเล็กมากh(k)=a×kmodmma1mm=1009Pr{h(x)=h(y),xy}=0.00099108027

รูปแบบนี้เรียกว่า: Universal Hashing

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