tem*_*def 87 algorithm math numbers number-systems data-structures
我最近注意到,基于创意基础中数字的巧妙使用,部分或全部有很多算法.例如:
我的问题是:还有哪些其他算法使用聪明的数字系统作为他们直觉或证据的关键步骤?.我正在考虑就这个问题进行一次讨论,所以我必须从中得到更多的例子.
Edw*_*ang 39
Chris Okasaki在他的书" Purely Functional Data Structures "中有一个非常好的章节,它讨论了"数字表示":基本上,对数字进行一些表示并将其转换为数据结构.为了给出一种味道,以下是该章的部分内容:
一些最好的技巧,蒸馏:
这是该章的参考列表:
Ben*_*min 20
"三元数可以用来传达自我相似的结构,比如Sierpinski Triangle或Cantor set." 资源
"第四纪数字用于表示二维希尔伯特曲线." 资源
"四分之一虚数系统最初是由Donald Knuth于1955年提出的,是对高中科学人才搜索的提交.它是一个非标准的位置数字系统,它使用虚数2i作为基础.它能够仅使用数字0,1,2和3表示每个复数." 资源
"罗马数字是一个两性系统." 资源
"在素数的研究中,可以认为Senary是有用的,因为所有素数,当用基数6表示时,除了2和3之外,有1或5作为最后数字." 资源
"Sexagesimal(60号基地)是一个以六十年代为基础的数字系统.它起源于公元前三千年的古代苏美尔人,它被传递给古代的巴比伦人,并且它仍被用于 - 以修改的形式 - 用于测量时间,角度和角度的地理坐标." 资源
等等...
这份清单是一个很好的起点.
我前几天读了你的问题,今天遇到了一个问题:如何生成一组的所有分区?我遇到的解决方案,以及我使用的解决方案(可能是因为阅读了您的问题)是:
对于具有(n)个元素的集合,我需要(p)分区,计算基数(p)中的所有(n)个数字.
每个数字对应一个分区.每个数字对应于集合中的元素,数字的值告诉您将元素放入哪个分区.
这并不奇怪,但它很整洁.它完整,没有冗余,并使用任意基础.您使用的基础取决于特定的分区问题.
我依稀记得一些关于加速某些矩阵乘法的双基系统.
双基系统是一个冗余系统,它使用两个基数作为一个数字.
n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
Run Code Online (Sandbox Code Playgroud)
冗余意味着可以通过多种方式指定一个数字.
您可以通过Vassil Dimitrov,Todor Cooklev查找文章"计算矩阵多项式的混合算法".
我试图给出最好的简短概述.
他们试图计算矩阵多项式G(N,A) = I + A + ... + A^{N-1}.
Supoosing N是复合的G(N,A) = G(J,A) * G(K, A^J),如果我们申请J = 2,我们得到:
/ (I + A) * G(K, A^2) , if N = 2K
G(N,A) = |
\ I + (A + A^2) * G(K, A^2) , if N = 2K + 1
Run Code Online (Sandbox Code Playgroud)
也,
/ (I + A + A^2) * G(K, A^3) , if N = 3K
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 1
\ I + A * (A + A^2 + A^3) * G(K, A^3) , if N = 3K + 2
Run Code Online (Sandbox Code Playgroud)
因为它是"显而易见的"(开玩笑地),其中一些方程式在第一个系统中很快,而在第二个系统中则更好 - 所以选择最好的方程式是个好主意N.但是这需要对2和3进行快速模运算.这就是为什么双基进来 - 你基本上可以快速进行模运算,因为它们都为你提供了一个组合系统:
/ (I + A + A^2) * G(K, A^3) , if N = 0 or 3 mod 6
G(N,A) = | I + (A + A^2 + A^3) * G(K, A^3) , if N = 1 or 4 mod 6
| (I + A) * G(3K + 1, A^2) , if N = 2 mod 6
\ I + (A + A^2) * G(3K + 2, A^2) , if N = 5 mod 6
Run Code Online (Sandbox Code Playgroud)
请看文章以获得更好的解释,因为我不是这方面的专家.
散列字符串(例如在Rabin-Karp算法中)通常将字符串评估为由n个数字组成的base-b数字(其中n是字符串的长度,b是一些足够大的选定基数).例如,字符串"ABCD"可以散列为:
'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0
Run Code Online (Sandbox Code Playgroud)
将ASCII值替换为字符并将b替换为256,
65*256^3+66*256^2+67*256^1+68*256^0
Run Code Online (Sandbox Code Playgroud)
但是,在大多数实际应用中,所得到的值是以一些合理大小的数量为模,以保持结果足够小.
| 归档时间: |
|
| 查看次数: |
6605 次 |
| 最近记录: |