【问题标题】:The "set of" operator in PascalPascal 中的“集合”运算符
【发布时间】:2019-02-24 23:26:08
【问题描述】:

我读到Pascal 中的set of 运算符代表数学“Power Set”,但我似乎无法理解。

例如,我有以下一段代码:

program setDemo(output);
type
    skill = (cooking, cleaning, driving, videogames, eating);
var
    slob: set of skill;
begin
    slob := [videogames, eating];
end.

我们从slob := [videogames, eating] 命令得到什么?我猜slob会包含这两个“技能”,但是Power set是如何表示的呢?

【问题讨论】:

  • set of 不是运算符。它更像是用于定义类型的“关键字”。
  • 如果您熟悉二进制算术,Pascal set 是一个位数组,其中子类型枚举位位置。通常,set 不能有超过 32、64 或 256 个项目(取决于实现),因为操作超过 4、8 或 32 个字节包含位的效率。
  • set of 是数据类型,而不是运算符。

标签: pascal


【解决方案1】:

基本上,作为(所有)技能集的一个子集,slob 是(所有)技能集的力量集的一个元素。


在 Pascal 中,set of A(其中A 是某种序数类型)是表示A 类型元素的数学集合的类型。更准确地说,这种类型的每个值都是这样一个数学集合。例如,在 Delphi(Pascal 的现代版本)中,您有

TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)

枚举和对应的TFontStyles = set of TFontStyle 设置类型。虽然TFontStyle 类型的值只是fsBoldfsItalicfsUnderlinefsStrikeOut 中的任一个,但TFontStyles 类型的值是一组字体样式(或属性),例如@ 987654336@。如果您将标签的Font.Style 属性设置为该值,则标签的字体将为粗体并带有下划线。

您似乎明白这一点,所以让我转而关注“幂集”概念,您似乎对此感到困惑。

使用数学语法,考虑集合

A = {cooking, cleaning, driving, gaming, eating}

技能。 A 的幂集,有时表示为 P(A) 或 2^A,是 A 的所有子集的集合。(因此,它是一个集合,其成员是集合。)下面列出了这个集合的一些成员:

{} (=the empty set)
{cooking}
{driving}
{cooking, cleaning}
{cleaning, gaming, eating}
{cooking, cleaning, driving, eating}
{cooking, cleaning, driving, gaming, eating} (=A)

总共,P(A) 由 2^|A| 组成= 2^5 = 32 个元素。实际上,在 A 的给定子集中,cooking 要么是它的一部分,要么不是(2 个选项),对于每个选项,cleaning 要么是子集的一部分,要么不是(2 个选项) , 等等。因此,组合的总数变为 2×2×...×2 = 32。

现在,给定 Pascal 枚举

skill = (cooking, cleaning, driving, gaming, eating)

set of skill 是一种类型,其值是skill 值的集合,例如[cooking, cleaning][cleaning, gaming, eating](使用Pascal 语法)。显然,每个这样的值——A 的 子集——是 P(A) 的 元素,与 skill 类型的每个值的方式大致相同A 本身的一个元素。


你特意问了,

我们从slob := [videogames, eating] 命令得到什么?

您将值 [videogames, eating] 分配给变量 slob。这是一个set of skill 类型的值,这个特定的值包含成员videogameseating

在底层,Delphi 中的集合值使用多个字节表示(每个集合类型都有特定的大小),集合中每个可能的元素都由一个特定的位表示。在 Delphi 中,仅当 A 的值不超过 256 个时才允许使用类型 set of A。如果A 有这么多值(比如Abyte),这就要求set of A 有256 位(这样就有2^256 = 1.16 × 10^77 个set of A 类型的可能值)。

有时人们想知道为什么他们不能声明类型set of integer。但是一个整数是一个 32 位的值,所以有 2^32 = 4294967296 个这样的值。因此,假设类型 set of integer 的值将需要 4294967296 字节或 4 GB。这对于单个变量来说是一个巨大的内存量!

【讨论】:

  • 很好的答案,谢谢。 [videogames, eating] 是一个数组吗?怎么打印? (尝试使用WriteLn)。
  • 不,arrayssets 不是一回事,尽管它们共享 [] 语法。没有一个行来打印一组(以一种漂亮的方式),但不需要很多行。见stackoverflow.com/a/32861338/282848
  • @vesii:不,[videogames, eating] 不是数组。这是一套。
  • 如果我理解你的答案是正确的,“帕斯卡集代表幂集” 不是不正确的陈述,因为帕斯卡集是幂集的子集。我理解正确吗?
  • @SertacAkyuz:不,帕斯卡集不是幂集 P(A) 的子集。帕斯卡集是幂集 P(A) 的一个元素。这与基础集合 A 的子集相同。
猜你喜欢
  • 2013-05-12
  • 2023-02-24
  • 2012-09-11
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多