我读到set of
中的Pascal
运算符代表数学上的“ 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
将包含这两个“技能”,但是幂集如何表示呢?
答案 0 :(得分:3)
slob
基本上是(全部)技能组的子集,是(全部)技能组的能力组的元素。
在Pascal中,set of A
(其中A
是一些序数类型)是一种表示数学类型为A
的元素集的类型。更准确地说,此类型的每个值都是这样的数学集合。例如,在Delphi(Pascal的现代版本)中,您拥有
TFontStyle = (fsBold, fsItalic, fsUnderline, fsStrikeOut)
枚举和相应的TFontStyles = set of TFontStyle
集类型。虽然类型TFontStyle
的值只是fsBold
,fsItalic
,fsUnderline
或fsStrikeOut
之一,但类型TFontStyles
的值是一组字体样式(或属性),例如[fsBold, fsUnderline]
。如果将标签的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)的 ,与类型{{1} }是A本身的元素。
您具体问过
我们从
skill
命令中得到什么?
您将值slob := [videogames, eating]
分配给变量[videogames, eating]
。这是类型slob
的值,并且此特定值包含成员set of skill
和videogames
。
在后台,Delphi中的设置值使用多个字节表示(每种设置类型都有特定的大小),并且该设置中的每个可能元素都由一个特定的位表示。在Delphi中,仅当eating
的值不超过256个时,才允许类型set of A
。如果A
有这么多值(例如A
是A
),则这要求byte
具有256位(因此,有2 ^ 256 = 1.16×10 ^类型为set of A
的77个可能值。
有时人们会奇怪为什么他们不能声明类型set of A
。但是整数是一个32位值,因此有2 ^ 32 = 4294967296这样的值。假设类型set of integer
的值将因此需要4294967296字节或4 GB。对于单个变量来说,这是一个巨大的内存!