ฟังก์ชั่นที่กระจายอินพุต


14

ฉันต้องการทราบว่ามีฟังก์ชันจากหมายเลข n-bit ไปยังหมายเลข n-bit ที่มีคุณสมบัติดังต่อไปนี้หรือไม่:f

  • fควรเป็น bijective
  • ทั้งและน่าจะคำนวณได้อย่างรวดเร็วff−1
  • fควรคืนค่าตัวเลขที่ไม่มีความสัมพันธ์อย่างมีนัยสำคัญกับอินพุต

เหตุผลคือ:

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

ความคิดของฉันคือการฉีกตัวเลขสัญลักษณ์ที่มีเช่นที่พวกเขามีการแพร่กระจายอย่างกว้างขวางไปทั่วทั้งช่วงของ-1] เนื่องจากหมายเลขสัญลักษณ์มีความสำคัญเฉพาะในระหว่างอินพุตและเอาต์พุตที่เกิดขึ้นเพียงครั้งเดียวการใช้ฟังก์ชันดังกล่าวจึงไม่ควรแพงเกินไปf[0,264−1]

ฉันคิดเกี่ยวกับการวนซ้ำของตัวสร้างตัวเลขสุ่ม Xorshift หนึ่งครั้ง แต่ฉันไม่รู้วิธีการยกเลิกมันจริงๆแม้ว่ามันจะเป็นไปได้ในทางทฤษฎี

ใครรู้ฟังก์ชั่นดังกล่าวหรือไม่?
นี่เป็นความคิดที่ดีหรือไม่?


1
ฉันไม่ได้เป็นผู้เชี่ยวชาญ แต่บางทีคุณสามารถใช้การเปลี่ยนแปลง pseudorandom (ดูตัวอย่างการเข้ารหัส Feistel )
— Vor

หากคุณกำลังคำนวณฟังก์ชันแฮชเป็นหลักทำไมไม่ใช้การแฮช
— vonbrand

@vonbrand Hashing ไม่สามารถย้อนกลับได้ ดูข้อกำหนดจำนวน 2
— FUZxxl

ทำไมต้องย้อนกลับได้? มีอะไรผิดปกติกับการทำให้มันสามารถย้อนกลับได้โดยการค้นหา?
— vonbrand

1
คุณสามารถเก็บ (f (x), x) เป็นปุ่มได้
— adrianN

คำตอบ:


6

คุณสามารถใช้Fibonacci hashingคือ

⌋hF(k)=k⋅5−12−⌊k⋅5−12⌋

สำหรับคุณจะได้รับnหมายเลขคู่-ที่แตกต่างกัน (ประมาณ) แพร่กระจายอย่างสม่ำเสมอใน[ 0 , 1 ] ด้วยการปรับเป็น[ 1 .. M ]และการปัดเศษ (ลง) คุณจะได้ตัวเลขที่กระจายอย่างสม่ำเสมอในช่วงเวลานั้นk=1,…,nn[0,1][1..M]

ตัวอย่างเช่นค่าเหล่านี้คือสเกลเป็น[ 0..10000 ] (ลำดับเดิมซ้ายเรียงลำดับขวา):hF(1),…,hF(200)[0..10000]

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นตัวอย่างของสิ่งที่ Knuth เรียกใช้การแฮ็กแบบหลายค่า สำหรับขนาดคำคอมพิวเตอร์จำนวนเต็มความสำคัญกับบางWและMจำนวนที่อยู่ที่จำเป็นที่เราจะใช้wAwM

h(k)=⌊M((k⋅Aw)mod1)⌋

ฟังก์ชั่นคร่ำเครียด ด้านบนตามด้วย (ตรวจสอบให้แน่ใจว่าคุณสามารถคำนวณด้วยความแม่นยำเพียงพอ) ขณะนี้ยังใช้งานได้กับจำนวนอตรรกยะอื่น ๆ นอกเหนือจากϕ-1มันเป็นหนึ่งในสองตัวเลขเท่านั้นที่นำไปสู่หมายเลข "กระจายอย่างสม่ำเสมอที่สุด"A/w=ϕ−1=5−12ϕ−1

ค้นหาเพิ่มเติมในThe Art of Computer Programmingเล่มที่ 3 โดย Donald Knuth (บทที่ 6.4 จากหน้า 513 ในรุ่นที่สอง) โดยเฉพาะอย่างยิ่งที่คุณจะพบว่าทำไมตัวเลขที่เกิดขึ้นเป็นคู่ที่แตกต่างกัน (อย่างน้อยถ้า ) และวิธีการคำนวณฟังก์ชันผกผันถ้าคุณใช้ธรรมชาติและWแทนφ - 1n≪MAwϕ−1


1
วิธีการคำนวณอย่างมีประสิทธิภาพ? f−1
— frafl

1
@frafl ฉันหวังว่าการแก้ไขของฉันจะตอบข้อกังวลของคุณบ้าง เป็นที่ชัดเจนว่าเทคนิคการแฮ็กเหล่านี้ไม่ได้ถูกออกแบบมาเป็นพิเศษเพื่อให้สามารถย้อนกลับได้อย่างมีประสิทธิภาพ
— กราฟิลส์

ใช่ฉันจะลงคะแนน แต่ฉันจะไม่แนะนำเป็นคำตอบที่ยอมรับได้
— frafl

1

สำหรับอินพุต -bit ฟังก์ชันนี้ทำงาน:k

hash(n)=(nmod2⌈k2⌉)⋅2⌈k2⌉+ndiv2⌈k2⌉

hash(hash(n))=n{n,m},n<mhash(m)<hash(n){1,…,2⌈k2⌉−1}

Ref: ฟังก์ชันแฮชแบบย้อนกลับได้


มันดูเรียบง่ายและดูดี ฉันจะทดสอบอันนั้น
— FUZxxl

1
1ρ

มันค่อนข้างชัดเจน! สำหรับ 64- บิต (0x00000000FFFFFFFF) และคุณควรเลื่อน (<<) 32 บิต ฟังก์ชั่นนี้เรียบง่ายใช้งานได้จริงและเร็วพอในทางปฏิบัติ
— Reza

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