【发布时间】:2015-02-25 21:23:02
【问题描述】:
Cirdec's answer 回答了一个基本上不相关的问题,这让我想知道如何最好地表示具有恒定时间加法、减一和零测试的自然数。
为什么 Peano 算术不够好:
假设我们使用
data Nat = Z | S Nat
那么我们可以写
Z + n = n
S m + n = S(m+n)
我们可以在 O(1) 时间内计算 m+n,方法是将 m-r 借方(对于某些常量 r),每个 S 构造函数上添加一个到 n。要获得 O(1) isZero,我们需要确保每个 S 构造函数最多有 p 借方,对于一些常量 p。如果我们计算a + (b + (c+...)),这很有效,但如果我们计算((...+b)+c)+d,它就会崩溃。问题是借方在前端堆积。
一个选项
简单的方法是直接使用可连接列表,例如 Okasaki 描述的那些。有两个问题:
-
O(n) 空间并不理想。
-
当我们不关心列表的顺序时,引导队列的复杂性是必要的(至少对我而言)并不完全清楚。
【问题讨论】:
-
O(n)中的n是什么?数字的大小或输入的长度? Okasaki 描述的“可连接列表”是什么? -
@Cirdec,如果无法改善空间使用率,我不会感到惊讶,现在我想了更多。 O(1) 加法是一个非常严格的要求!
-
你不能得到恒定的时间加法。如果你限制数字的大小,你只能得到恒定的时间。
-
@augustss,怎么样? Okasaki 的可链表支持 O(1) 追加和 O(1) 递减。
-
并不是说这对 SO 不合适,但您也可以考虑compsci。
标签: haskell math data-structures