【问题标题】:Haskell GHC: what is the time complexity of a pattern match with N constructors?Haskell GHC:与 N 个构造函数匹配的模式的时间复杂度是多少?
【发布时间】:2012-01-27 00:12:08
【问题描述】:

假设我们有以下 Haskell:

data T = T0 | T1 | T2 | ... | TN

toInt :: T -> Int
toInt t = case t of
  T0 -> 0
  T1 -> 1
  T2 -> 2
  ...
  TN -> N

这里使用什么算法来执行模式匹配?我看到两个选项:

(1) 线性搜索,类似

if      (t.tag == T0) { ... }
else if (t.tag == T1) { ... }
else ...

(2) 二分搜索,这在这个特定任务中是明智的:在集合 {TO...T1023} 中搜索t.tag。但是,如果模式匹配通常具有许多其他功能和泛化,则可能不会使用它。

用 GHC 编译,使用什么算法,时间复杂度是多少,以 N 表示,在 t 上进行模式匹配 toInt

【问题讨论】:

标签: haskell compiler-construction pattern-matching complexity-theory


【解决方案1】:

使用跳转表,使模式匹配成为一个恒定时间操作。

不幸的是,我无法找到最新的引用,尽管this page 提到了 Cmm 级 switch 语句作为跳转表的实现,并且 this old tagging design document 在 a 上使用了 caseBool为例,生成跳转表。

【讨论】:

  • 这意味着时间复杂度是 O(1) 并且如果不清楚的话也是 Θ(1)
  • 嘿,不公平!我希望 O(1) 包含实际的 Θ(0)
  • 你可以引用GHC source
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2017-09-11
  • 2016-04-14
相关资源
最近更新 更多