pascal 中使用的集合的实现是什么?

What is the implementation of sets used in pascal?

提问人:Akronix 提问时间:1/12/2015 最后编辑:Akronix 更新时间:10/23/2016 访问量:805

问:

我想知道语言提供的 pascal 中 set 类型的实际实现。特别是,我想知道 freepascal 运行时库中使用的那个,但我对任何 pascal 实现都感兴趣。

我关心它的运行时复杂性。Disjoint-set 数据结构的最佳实现在 O(log*n) 中,我想知道 pascal 实现是否有这个。

fpc rtl 的文档可以在这里找到: ftp://ftp.freepascal.org/pub/fpc/docs-pdf/rtl.pdf ,但它太大了(>1700 页),无法在不知道它是否存在的情况下寻找它。freepascal wiki 对此没有任何说明

设置 时间复杂度 Pascal FPC

评论

0赞 Abstract type 1/12/2015
按照逻辑,我会说集合以 32 位整数类型的形式存储为位。为什么?因为不能在具有超过 32 个元素的枚举上定义集合(例如 Set Of ...)。这是一个 comon 实现。检索、设置值始终是 O(1) 或 O(2),: shift/xor,没有十亿种方法可以做到这一点。
2赞 500 - Internal Server Error 1/13/2015
@BBaz:我不知道 Free Pascal,但在 Turbo Pascal/Borland Pascal/Delphi 中,限制始终是集合中的 256 个元素(32 字节)。
0赞 Abstract type 1/13/2015
对不起,大嘴巴 syndrom...,让我解释一下误解的起源:它来自这样一个事实,即一个已发布的集合不能有超过 32 个元素,否则 FPC 输出:.更疯狂的是,我基于这种误解为另一种语言编写了一个静态库!Error: This kind of property can't be published
0赞 Marco van de Voort 1/19/2015
可能已发布的集总是 4 个字节宽(一个整数),因此 RTTI 只有一种集类型。可能德尔福也这样做。

答:

2赞 Codor 1/12/2015 #1

根据这种解释,Pascal 在内部将集合表示为位字符串。然而,这篇文章显然没有提到 Pascal 的具体实现。在本文档中,还指出位字符串用于表示。更准确地说,本文档明确提到了 32 个字节用于存储集合。

评论

0赞 Rudy Velthuis 10/24/2016
一组最多 32 个字节(256 位)。较小的集合使用较少的字节。A 需要 11 位,因此实现为 2 个字节。set of 0..10
1赞 Marco van de Voort 1/12/2015 #2

Free Pascal 语言文档是“参考”指南,rtl 是运行时指南。编译器选项和指令在程序员指南中,请参阅下面的 $pack* 链接。

集是位域,大小因选项而异。(例如 $packset$packenum),最大大小为 256 位,32 字节(这是旧的 TP 限制)。

IIRC 在 (obj)FPC 模式下,集合随字大小增长,在 Delphi 模式下以字节大小的粒度增长,但这有点以 x86 为中心。但是,size=3 字节是不可能的,并且将四舍五入为 4。

下限始终为 0,因此一组 8..10 是 2 个字节 (0..15),即使它只能容纳 3 个值 (8,9,10)。

除此之外,还有一个小端序与大端序的问题。在大端系统上,您不能交替按字节和按字访问集合字段。Afaik FPC 主要以单词方式访问它们,但我上次检查是不久前。