基于数基系统的算法?[关闭]


87

我最近注意到,有很多算法部分或全部基于创造性基础中数字的巧妙使用。例如:

  • 二项式堆基于二进制数,更复杂的偏斜二项式堆基于偏斜二进制数。
  • 一些用于生成按字典顺序排列的排列的算法基于乘数系统。
  • 可以将尝试看作是一棵树,它以适当的基数一次查看字符串的一位。
  • 霍夫曼编码树被设计为使树中的每个边缘在某种二进制表示中编码为零或一。
  • 斐波那契搜索中使用斐波那契编码,并反转某些类型的对数。

我的问题是:还有哪些其他算法将聪明的数字系统用作直觉或证明的关键步骤?。我正在考虑就该主题进行一次讨论,因此,我必须从中汲取更多的例子,效果会更好。


5
我也喜欢这个问题,但是您如何选择“正确”的答案呢?这应该是社区Wiki吗?
vlad

14
这应该是社区Wiki
BlueRaja-Danny Pflughoeft

18
@close选民:如果关于算法的问题不在SO的主题范围内,那么我不知道这里的主题是什么。关于CSS的新手问题?“我可以给regex plzz打电话吗?” “请发送电子邮件给codez 4 mi hoemwok”?
MAK

2
旅行者指南银河:生命,宇宙和一切的答案是什么?Deep Thought的答案:42.作为寻找问题的机器的地球:9 x 6是什么?这就是为什么一切如此混乱的原因。在T恤衫上看到:9(基数13)x 6(基数13)= 42(基数13)。QED。
克里斯·沃尔顿

“还有哪些其他算法将聪明的数字系统用作直觉或证明的关键步骤呢?” 堆栈溢出不是推荐引擎所有内容的列表链接场。绝对可以解决实际编程问题的算法。交换所提供了聪明的算法,没有。您可能想问一问数学的元数据是否需要。

Answers:


39

克里斯·冈崎(Chris Okasaki)在他的《纯函数数据结构》一书中有一章很好地论述了“数字表示形式”:从本质上讲,对数字进行某种表示并将其转换为数据结构。为了使您有品味,以下是该章的各节:

  1. 位置编号系统
  2. 二进制数(二进制随机访问列表,零零表示,惰性表示,分段表示)
  3. 偏斜二进制数(偏斜二进制随机访问列表,偏斜二项式堆)
  4. 三进制和四进制数

摘录的一些最佳技巧:

  • 区分数字的密集表示和稀疏表示(通常您可以在矩阵或图形中看到它,但它也适用于数字!)
  • 冗余数字系统(具有多个数字表示形式的系统)很有用。
  • 如果您将第一个数字安排为非零或使用无零表示,则检索数据结构的头部可能很有效。
  • 通过分段数据结构避免级联借用(从列表的末尾开始)和携带(从约束到列表)

这也是该章的参考列表:

  • Guibas,McCreight,Plass和Roberts:线性列表的新表示形式。
  • Myers:适用性随机存取堆栈
  • Carlsson,Munro,Poblete:具有固定插入时间的隐式二项式队列。
  • Kaplan,Tarjan:纯功能列表,通过递归减速进行分类。

2
+1我有一份冈崎的书的副本...我喜欢那些章节,这部分也是我为什么要问这个问题的一部分(引导歪斜的二项式堆真的很酷!)尽管如此,我并没有一直阅读也许我应该。另外,我将检查这些参考资料。他们看起来很棒。
templatetypedef

Okasaky的完整论文可在线获得:cs.cmu.edu/~rwh/theses/okasaki.pdf
Gigi,

20

“三元数可以方便地传达自相似结构,例如Sierpinski三角形或Cantor集。” 资源

“四进制数用于表示二维希尔伯特曲线。” 资源

“四分之一虚数系统是由Donald Knuth于1955年首次提出的,它是在向高中科学人才搜寻中提交的。它是一个以虚数2i为基础的非标准位置数字系统。它能够以仅使用数字0、1、2和3表示每个复数。” 资源

“罗马数字是一个双进制系统。” 资源

“ Senary在素数研究中可能被认为是有用的,因为除以2或3表示的所有素数以外,所有素数都以1或5作为最后一位。” 资源

“ Sexagesimal(基数60)是一个以60为基数的数字系统。它起源于公元前3世纪的古代苏美尔人,一直传到古代的巴比伦人,但仍以修改后的形式用于测量。时间,角度以及作为角度的地理坐标。” 资源

等等...

此列表是一个很好的起点。


6
这些都不是与算法..
丹尼Pflughoeft - BlueRaja

11
当然可以。在三元模型中构建Sierpinski Triangle三角形,或以六进制形式计算地理坐标。将罗马数字转换为十进制的算法怎么样?基于Senary系统的素数查找算法怎么样?
本杰明

9

前几天,我读了您的问题,今天却遇到了一个问题:如何生成集合的所有分区?我使用的解决方案(可能是由于阅读了您的问题)使我想到的是:

对于具有(n)个元素的集合,我需要(p)个分区,请对以(p)为底的所有(n)个数字进行计数。

每个数字对应一个分区。每个数字对应于集合中的一个元素,数字的值告诉您将元素放入哪个分区。

这并不奇怪,但是很整洁。它是完整的,不会造成冗余,并且使用任意基数。您使用的基础取决于特定的分区问题。


3
我认为这完全是从templatetypedef的帖子中窃取的,它肯定已经卡在了我的潜意识中。我只剩下它了,因为它谈论的不仅仅是二进制。
本·霍纳

2
这将生成最多具有p个分区的所有分区,并且确实具有冗余。如何111222不同于222111
空设置为

7

最近,我遇到了一个很酷的算法,该算法基于0到2 n -1之间数字的二进制表示,按字典顺序生成子集。它使用数字的位来确定应为集合选择哪些元素并进行局部重新排序生成的集合使它们按字典顺序排列。如果您有好奇心,请在此处发表文章。

同样,许多算法都是基于缩放的(例如,Ford-Fulkerson最大流算法的弱多项式版本),该算法使用输入问题中数字的二进制表示形式逐步将粗略的近似精炼为完整的解决方案。


2
这是生成子集的最简单方法:)
st0le 2011年

这是计算组合概念的最简单方法。
Saeed Amiri

@ st0le-我认为这比标准版本有些棘手,因为它按字典顺序列出了集合,而不是您从位与集合包含之间的一对一映射中获得的常规次序。
templatetypedef


6

我隐约记得一些关于双基系统以加快矩阵乘法的事情。

双碱基系统是一个冗余系统,它对一个数字使用两个碱基。

 n = Sum(i=1 --> l){ c_i * 2^{a_i} * 3 ^ {b_i}, where c in {-1,1}

冗余意味着可以通过多种方式指定一个数字。

您可以查找Todor Cooklev的Vassil Dimitrov撰写的文章“用于矩阵多项式计算的混合算法”。

尽力提供最好的简短概述。

他们试图计算矩阵多项式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

也,

         / (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

因为(显然)(其中一个)这些方程在第一个系统中很快,而在第二个系统中更好,所以最好选择一个依赖于的方程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

请看一下文章以获得更好的解释,因为我不是该领域的专家。



5

这是一篇有关使用三元数解决“伪造硬币”问题的好文章(在这种情况下,您必须使用一小笔天平将一袋普通硬币探测到一袋伪造的硬币)


这是一篇很棒的文章,我最终在一次名为“数字系统的乐趣”的演讲中使用了这篇文章。非常感谢您发布它!
templatetypedef

欢迎,很高兴您能够使用它!
2011年

5

散列字符串(例如,在Rabin-Karp算法中)通常将字符串评估为由n个数字组成的base-b数字(其中n是字符串的长度,b是一些足够大的选定基数)。例如,字符串“ ABCD”可以散列为:

'A'*b^3+'B'*b^2+'C'*b^1+'D'*b^0

将ASCII值替换为字符并将b设为256,这将成为:

65*256^3+66*256^2+67*256^1+68*256^0

但是,在大多数实际应用中,结果值取一些合理大小的数字为模,以保持结果足够小。



4

Hackers Delight(每个程序员在我的眼中都应该知道的一本书)中,有一章完整地介绍了不常用的底数,例如-2为底数(是,右负底数)或-1 + i(i为虚数单位sqrt(-1)),基础。我也很好地计算出什么是最好的基础(就硬件设计而言,对于所有不想读的人:方程的解是e,所以可以选择2或3,则3会好一点(因数比2)好1.056倍-但技术上更实用)。

我想到的其他事情是灰度计数器(当您在此系统中计数只有1位更改时,您经常在硬件设计中使用此属性来减少亚稳态问题)或已经提到的霍夫曼编码(算术编码)的一般化。


3

密码术广泛使用整数环(模数)和有限域,其操作直观地基于具​​有整数系数的多项式的行为方式。



1

好问题。名单确实很长。讲时间是混合基准的简单实例(天|小时|分钟|秒|上午/下午)

如果您有兴趣了解,我已经创建了一个元数据库枚举n元组框架。它是用于基本编号系统的非常甜蜜的语法糖。它尚未发布。通过电子邮件发送我的用户名(通过gmail)。


1
以及任何日历系统-玛雅语,农历,巴比伦语...。以及1971年之前的英文货币(LSD)。正如你所说的那样。
克里斯·沃尔顿


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.