Saya ingin tahu apakah ada fungsi dari nomor n-bit ke nomor n-bit yang memiliki karakteristik berikut:
- harus bijective
- Baik dan harus dapat dihitung dengan cukup cepat
- harus mengembalikan nomor yang tidak memiliki korelasi signifikan dengan inputnya.
Alasannya adalah ini:
Saya ingin menulis sebuah program yang beroperasi pada data. Beberapa informasi data disimpan dalam pohon pencarian biner di mana kunci pencarian adalah simbol alfabet. Seiring waktu, saya menambahkan simbol lebih lanjut ke alfabet. Simbol baru dengan mudah mendapatkan nomor gratis berikutnya. Oleh karena itu, pohon akan selalu memiliki bias kecil untuk kunci yang lebih kecil yang menyebabkan penyeimbangan kembali dari yang saya pikir seharusnya diperlukan.
Ide saya adalah untuk memotong angka simbol dengan sehingga mereka tersebar luas di seluruh rentang . Karena angka simbol hanya penting selama input dan output yang terjadi hanya sekali, menerapkan fungsi seperti itu seharusnya tidak terlalu mahal.
Saya berpikir tentang satu iterasi dari generator angka acak Xorshift, tetapi saya tidak benar-benar tahu cara untuk membatalkannya, meskipun secara teori hal itu harus dimungkinkan.
Apakah ada yang tahu fungsi seperti itu?
Apakah ini ide yang bagus?
sumber
Jawaban:
Anda dapat menggunakan hashing Fibonacci , yaitu
.hF(k)=k⋅5√−12−⌊k⋅5√−12⌋
Untuk Anda mendapatkan n angka berbeda berpasangan (sekitar) yang tersebar secara merata di [ 0 , 1 ] . Dengan penskalaan ke [ 1 .. M ] dan pembulatan (bawah), Anda mendapatkan angka yang tersebar secara merata dalam interval itu.k=1,…,n n [0,1] [1..M]
Misalnya, ini adalah diskalakan ke [ 0..10000 ] (urutan asli kiri, disortir kanan):hF(1),…,hF(200) [0..10000]
Ini adalah contoh dari apa yang Knuth sebut hashing multiplikatif . Untuk kata ukuran komputer, A beberapa bilangan bulat yang relatif prima terhadap w dan M jumlah alamat yang dibutuhkan, kita menggunakanw A w M
sebagai fungsi hashing. Di atas diikuti dengan (pastikan Anda dapat menghitungnya dengan presisi yang cukup). Meskipun ini juga berfungsi dengan bilangan irasional lainnya selainϕ-1A/w=ϕ−1=5√−12 ϕ−1 , ini adalah salah satu dari hanya dua angka yang mengarah ke angka "terdistribusi paling seragam".
Temukan lebih banyak di The Art of Computer Programming , Volume 3 oleh Donald Knuth (bab 6.4 dari halaman 513 dalam edisi kedua). Khususnya Anda akan menemukan mengapa angka-angka yang dihasilkan berbeda secara berpasangan (setidaknya jika ) dan bagaimana menghitung fungsi terbalik jika Anda menggunakan natural A dan w bukannya ϕ - 1 .n≪M A w ϕ−1
sumber
Untuk input bit, fungsi ini berfungsi:k
Ini dapat dibalik, dalam , dan memiliki pasangan tidak berurutan { n , m } , n < m , di mana h a s h ( m ) < h a s h ( n ) . Waspadalah bahwa output dan input mungkin berkorelasi, terutama jika input Anda dalam { 1 , … , 2 ⌈ khash(hash(n))=n {n,m},n<m hash(m)<hash(n) {1,…,2⌈k2⌉−1} .
Ref: Fungsi hash yang dapat dibalik
sumber