Saya baru-baru ini memperhatikan bahwa ada banyak algoritma di luar sana yang sebagian atau seluruhnya didasarkan pada penggunaan angka yang cerdik dalam basis kreatif. Sebagai contoh:
- Heap binomial didasarkan pada bilangan biner, dan heap binomial skew yang lebih kompleks didasarkan pada bilangan biner skew.
- Beberapa algoritme untuk menghasilkan permutasi yang diurutkan secara leksikografis didasarkan pada sistem bilangan faktorad.
- Percobaan dapat dianggap sebagai pohon yang melihat satu digit string pada satu waktu, untuk basis yang sesuai.
- Pohon pengkodean Huffman dirancang agar setiap tepi di pohon menyandikan nol atau satu dalam beberapa representasi biner.
- Pengkodean Fibonacci digunakan dalam pencarian Fibonacci dan untuk membalikkan jenis logaritma tertentu.
Pertanyaan saya adalah: algoritma lain apa yang ada di luar sana yang menggunakan sistem bilangan pintar sebagai langkah kunci dari intuisi atau pembuktian mereka? . Saya berpikir untuk membuat pembicaraan tentang subjek, jadi semakin banyak contoh yang harus saya ambil, semakin baik.
algorithm
math
data-structures
numbers
number-systems
templatetypedef
sumber
sumber
Jawaban:
Chris Okasaki memiliki bab yang sangat bagus dalam bukunya Purely Functional Data Structures yang membahas "Representasi Numerik": pada dasarnya, mengambil beberapa representasi angka dan mengubahnya menjadi struktur data. Untuk memberi rasa, berikut adalah bagian dari bab itu:
Beberapa trik terbaik, saring:
Berikut juga daftar referensi untuk bab tersebut:
sumber
dll ...
Daftar ini adalah titik awal yang baik.
sumber
Saya membaca pertanyaan Anda beberapa hari yang lalu, dan hari ini dihadapkan pada masalah: Bagaimana cara membuat semua partisi dari satu set? Solusi yang terpikir oleh saya, dan yang saya gunakan (mungkin karena membaca pertanyaan Anda) adalah ini:
Untuk himpunan dengan elemen (n), di mana saya membutuhkan (p) partisi, hitung semua (n) digit angka dalam basis (p).
Setiap nomor sesuai dengan partisi. Setiap digit sesuai dengan elemen dalam himpunan, dan nilai digit memberi tahu Anda di partisi mana elemen tersebut akan ditempatkan.
Ini tidak luar biasa, tapi rapi. Itu lengkap, tidak menyebabkan redundansi, dan menggunakan basis sewenang-wenang. Basis yang Anda gunakan tergantung pada masalah partisi tertentu.
sumber
111222
bedanya dengan222111
?Baru-baru ini saya menemukan algoritme keren untuk menghasilkan subset dalam urutan leksikografis berdasarkan representasi biner dari angka antara 0 dan 2 n - 1. Ini menggunakan bit angka untuk menentukan elemen apa yang harus dipilih untuk himpunan dan untuk menyusun ulang secara lokal set yang dihasilkan untuk membuatnya menjadi urutan leksikografis. Jika Anda penasaran, saya memiliki artikel yang diposting di sini .
Selain itu, banyak algoritme didasarkan pada penskalaan (seperti versi polinomial lemah dari algoritme aliran maks Ford-Fulkerson), yang menggunakan representasi biner dari angka-angka dalam masalah masukan untuk secara progresif menyempurnakan perkiraan kasar menjadi solusi lengkap.
sumber
Bukan sistem dasar yang cerdas tetapi penggunaan sistem dasar yang cerdas: Urutan Van der Corput adalah urutan ketidaksesuaian rendah yang dibentuk dengan membalik representasi bilangan berbasis n. Mereka digunakan untuk membuat urutan Halton 2-d yang terlihat seperti ini .
sumber
Saya samar-samar mengingat sesuatu tentang sistem basis ganda untuk mempercepat beberapa perkalian matriks.
Sistem basis ganda adalah sistem redundan yang menggunakan dua basis untuk satu angka.
Redundan berarti satu angka dapat ditentukan dengan banyak cara.
Anda dapat mencari artikel "Algoritme Hibrid untuk Perhitungan Polinomial Matriks" oleh Vassil Dimitrov, Todor Cooklev.
Mencoba memberikan gambaran singkat terbaik yang saya bisa.
Mereka mencoba menghitung matriks polinomial
G(N,A) = I + A + ... + A^{N-1}
.Misalkan N adalah komposit
G(N,A) = G(J,A) * G(K, A^J)
, jika kita menerapkan J = 2, kita dapatkan:juga,
Karena "jelas" (bercanda) bahwa beberapa persamaan ini cepat di sistem pertama dan beberapa lebih baik di sistem kedua - jadi sebaiknya pilih yang terbaik dari yang bergantung
N
. Tetapi ini akan membutuhkan operasi modulo yang cepat untuk 2 dan 3. Inilah mengapa basis ganda masuk - pada dasarnya Anda dapat melakukan operasi modulo dengan cepat karena keduanya memberi Anda sistem gabungan:Lihat artikel untuk penjelasan yang lebih baik karena saya bukan ahli di bidang ini.
sumber
RadixSort dapat menggunakan berbagai basis angka. http://en.wikipedia.org/wiki/Radix_sort Implementasi bucketSort yang cukup menarik.
sumber
berikut adalah posting yang bagus tentang menggunakan nomor terner untuk memecahkan masalah "koin palsu" (di mana Anda harus mendeteksi satu koin palsu dalam kantong yang biasa, menggunakan saldo sesedikit mungkin)
sumber
String hashing (misalnya dalam algoritma Rabin-Karp ) sering mengevaluasi string sebagai bilangan basis-b yang terdiri dari n digit (di mana n adalah panjang string, dan b adalah beberapa basis terpilih yang cukup besar). Misalnya string "ABCD" dapat di-hash sebagai:
Mengganti nilai ASCII untuk karakter dan menganggap b 256 ini menjadi,
Padahal, dalam sebagian besar aplikasi praktis, nilai yang dihasilkan diambil modulo beberapa angka berukuran wajar untuk menjaga hasilnya cukup kecil.
sumber
Eksponensial dengan kuadrat didasarkan pada representasi biner dari eksponen.
sumber
Di
Hackers Delight
(buku yang harus diketahui setiap programmer di mata saya) ada bab lengkap tentang basis yang tidak biasa, seperti -2 sebagai basis (ya, basis negatif kanan) atau -1 + i (i sebagai unit imajiner sqrt (-1)) sebagai mendasarkan. Saya juga menghitung dengan baik apa basis terbaik (dalam hal desain perangkat keras, untuk semua yang tidak ingin membacanya: Solusi persamaannya adalah e, jadi Anda dapat menggunakan 2 atau 3, 3 akan sedikit lebih baik (faktor 1,056 kali lebih baik dari 2) - tetapi secara teknis lebih praktis).Hal lain yang muncul di benak saya adalah penghitung abu-abu (Anda ketika Anda menghitung dalam sistem ini hanya perubahan 1 bit, Anda sering menggunakan properti ini dalam desain perangkat keras untuk mengurangi masalah metastabilitas) atau generalisasi pengkodean Huffmann yang telah disebutkan - pengkodean aritmatika.
sumber
Kriptografi menggunakan banyak cincin bilangan bulat (aritmatika modular) dan juga bidang terbatas, yang operasinya secara intuitif didasarkan pada cara polinomial dengan koefisien bilangan bulat berperilaku.
sumber
Saya sangat suka yang satu ini untuk mengubah bilangan biner menjadi kode Gray: http://www.matrixlab-examples.com/gray-code.html
sumber
Pertanyaan bagus. Daftarnya memang panjang. Menceritakan waktu adalah contoh sederhana dari basis campuran (hari | jam | menit | detik | am / pm)
Saya telah membuat kerangka kerja n-tuple enumerasi meta-base jika Anda tertarik untuk mendengarnya. Ini adalah gula sintaksis yang sangat manis untuk sistem penomoran dasar. Ini belum dirilis. Email nama pengguna saya (di gmail).
sumber
Salah satu favorit saya menggunakan basis 2 adalah Enkode Aritmatika . Ini tidak biasa karena hart dari algoritme menggunakan representasi angka antara 0 dan 1 dalam biner.
sumber
Mungkin AKS memang demikian.
sumber