Algorithm 基于数字基系统的算法?
我最近注意到,有很多算法部分或全部都是基于数字在创造性基础上的巧妙运用。例如:Algorithm 基于数字基系统的算法?,algorithm,math,data-structures,numbers,number-systems,Algorithm,Math,Data Structures,Numbers,Number Systems,我最近注意到,有很多算法部分或全部都是基于数字在创造性基础上的巧妙运用。例如: 二项式堆基于二进制数,而更复杂的倾斜二项式堆基于倾斜二进制数 一些生成字典序排列的算法是基于factoradic数制的 可以将尝试视为一次查看字符串的一个数字以获得适当基数的树 哈夫曼编码树的设计目的是让树中的每条边在某种二进制表示中编码一个零或一 斐波那契编码用于斐波那契搜索和反转某些类型的对数 我的问题是:还有哪些算法将聪明的数字系统作为其直觉或证明的关键步骤?。我正在考虑就这个问题进行一次演讲,所以我要从中
- 二项式堆基于二进制数,而更复杂的倾斜二项式堆基于倾斜二进制数
- 一些生成字典序排列的算法是基于factoradic数制的
- 可以将尝试视为一次查看字符串的一个数字以获得适当基数的树
- 哈夫曼编码树的设计目的是让树中的每条边在某种二进制表示中编码一个零或一
- 斐波那契编码用于斐波那契搜索和反转某些类型的对数
是一个很好的起点。RadixSort可以使用不同的基数。
bucketSort非常有趣的实现。密码学广泛使用整数环(模算术)和有限域,它的操作直观地基于整系数多项式的行为方式。我非常喜欢这个将二进制数转换为格雷码的方法:不完全是一个聪明的基本系统,而是对基本系统的巧妙使用:序列是通过反转数字的base-n表示形式形成的。它们被用来构造看起来有点像的二维数字。关于使用三元数字来解决“假币”问题(在这种情况下,你必须在一袋普通硬币中检测出一枚假币,并尽可能少地使用天平)克里斯·冈崎骏(Chris Okasaki)在他的《纯函数数据结构》(Pure Functional Data Structures)一书中有一个非常好的章节,讨论了“数字表示”:本质上,将数字的一些表示形式转换为数据结构。为了给人一种感觉,以下是该章的部分:
- 区分数字的密集表示和稀疏表示(通常在矩阵或图形中可以看到这一点,但它也适用于数字!)
- 冗余数字系统(具有多个数字表示形式的系统)非常有用
- 如果您将第一个数字安排为非零或使用无零表示,则检索数据结构的头部会非常有效
- 通过分割数据结构,避免级联借用(从列表的尾部)和携带(从列表上考虑)
- Guibas、McCreight、Plass和Roberts:线性列表的新表示法
- Myers:一种实用的随机访问栈
- Carlsson,Munro,Poblette:一个具有恒定插入时间的隐式二项式队列
- Kaplan,Tarjan:通过递归减速实现链接的纯函数列表
- 好问题。名单确实很长。
告诉时间是一个简单的混合基数实例(天|小时|分钟|秒|上午/下午)
如果您有兴趣了解的话,我已经创建了一个meta base枚举n元组框架。对于基本编号系统来说,这是一种非常甜蜜的语法糖。它还没有发布。给我的用户名发电子邮件(在gmail上)。我模模糊糊地记得一些关于双基系统的事情,它们可以加速矩阵乘法 双基系统是一种冗余系统,一个数字使用两个基
n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}
冗余意味着可以通过多种方式指定一个数字
您可以查找Vassil Dimitrov、Todor Cooklev的文章“计算矩阵多项式的混合算法”
尽我所能给出最好的简短概述
他们试图计算矩阵多项式G(N,A)=I+A+…+A ^{N-1}
假设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
而且
“很明显”(开玩笑地)这些方程中的一些在第一个系统中很快,而在第二个系统中更好——因此,根据N
从中选择最好的是一个好主意。但这需要对2和3进行快速模运算。这就是为什么双基出现的原因-你基本上可以快速地对它们进行模运算,给你一个com
/ (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
/ (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
'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0
65*256^3+66*256^2+67*256^1+68*256^0