【发布时间】:2010-01-05 15:12:26
【问题描述】:
我正在寻找一个通过封装元素提供最快无序迭代的容器。换句话说,“一次添加,多次迭代”。
OCaml 的标准模块中是否有一个速度足够快(以至于进一步优化它是无用的)?还是某种第三方 GPL 就绪的?
AFAIK 只有一个 OCaml 编译器,所以快速的概念或多或少很清楚......
...但是在我看到几个答案之后,它似乎不是。当然,有很多数据结构允许通过大小为 n 的容器进行 O(n) 迭代。但我要解决的任务就是其中之一,其中 O(n) 和 O(2n) 之间的差异很重要 ;-)。
我还看到数组和列表提供了关于添加元素顺序的不必要信息,我不需要这些信息。也许在“功能世界”中存在可以用这些信息换取一点迭代速度的数据结构。
在 C 语言中,我会直接选择一个普通数组。问题是,我应该在 OCaml 中选择什么?
【问题讨论】:
-
1) 为了迂腐,O(n) 和 O(2n) 之间没有区别。你说的是常数因素。 2) 为元素选择任意顺序并对其进行修复,如在数组或列表中,正是您优化迭代的方式。您希望如何改进“增加索引/跟随指针,从内存中获取”以提高迭代速度?
-
1) 是的,我说的是常数因素,因为我正在优化瓶颈; 2) 我不知道如何改进,但 it 是 Array 和 List 模块的工作方式吗?数组没有说(虽然它可能是已知)占用连续的内存。列表需要指针取消引用(慢?)。我仍然有疑问。
-
@Pavel:克里斯的意思是你在滥用大 O 表示法。他并不是说您不应该关心常数因子,只是说您在引用它们时应该更清楚地使用数学符号。
-
@bcat,为什么这么严重? ;-) 我的意思是,我假设每个阅读 [ocaml] 标签中的问题的人都知道它的含义并且可以发现笑话,即使它们不太好:-\
标签: performance data-structures ocaml