2

重新思考套装

介绍

在 C++、C#、Java 和 Python 中,有一些类用于定义对象的无序集合,分别是setHashSetSetset。这个想法的问题是这些类对“小”离散集有好处。有时我想要一个展示属性的集合,但是如果我列出该集合的所有可能元素,我将耗尽计算机内存。这方面的一个例子如下:

  • 考虑所有双精度浮点数的集合。构建这样一个集合会耗尽大多数计算设备的内存,并且需要大量时间来填充。

还有更多这样的集合示例,其中通常的无序对象集合并不理想或不实用。集合不需要(或要求)大量内存需求,而 C++、C#、Java 和 Python 中的集合类型在我们想要考虑非常大的集合时需要大量内存。与其使用上面那些通常的无序离散集合,为什么不创建一个更通用的类(或某种类型的对象)呢?

如果我描述这个时我的词汇不正确,请原谅我,我不是计算机科学家。我只是一个数学低等的研究生,想模仿数学中如何考虑集合。例如,实数是一​​个集合,其元素数量超过了宇宙中亚原子粒子的数量。此外,不可能像在 C++、C#、Java 和 Python 中的集合构造中那样将实数的每个元素放入一个集合中来构造实数。

备选集对象建议

集合对象提议有两部分:对这个集合的定性描述和对集合操作的描述。

定性描述

一套作为它的两个部分。一个通用对象类型和一个属性。

  1. 通用对象类型:集合的元素必须来自域。在编程中,域通常是某种类型的对象类型。我将给出一些在编程中经常发现的对象类型的例子:

    • 原始数据类型:int、bool、float、double、char、string 等。
    • 固定数组:具有一定固定大小的数据。这里有些例子
    • 动态数组:向量、列表等。
    • 结构
    • 班级
    • 命名空间
    • void(我的意思是说我可以用任何类型的对象构造一个任意集合)
    • 返回特定类型对象的函数
    • 具有特定输入质量的函数(例如,任何具有 3 个输入的函数,或具有一个整数输入的函数等)
    • 另一套
    • 等等
  2. 集合的属性:该属性确定通用对象类型 (1) 的元素是否是集合的一部分。该属性是一个返回真或假的函数。真意味着它是集合的一部分,如果它不是集合的一部分,则为假。

(2) 的优点是属性函数可以包含一组离散的对象,就像我们已经在 C++、C#、Java 和 python 中一样,或者我们可以只检查元素是否具有属性(例如对象 X 是浮点数吗? )。属性函数可以有任意多个输入来确定元素是否是集合的属性(即返回真/假)。人们还应该考虑到属性函数应该足够灵活,可以将任何对象作为输入来处理。例如,当集合的属性函数检查 Horse 对象是否高于 6 英尺时,可能会尝试测试 Cat 对象是否是集合的元素。在这种情况下,属性函数可能会抛出异常,但属性函数仍应返回 false。

设置操作

  1. Union:具有 2 个或更多集合作为输入的函数。输入的属性函数分别为 P1、P2、...、Pn。Union 函数返回一个新集合,其属性函数为 P1 或 P2 或 --- 或 Pn。
  2. 交集:具有 2 个或更多集合作为输入的函数。输入的属性函数分别为 P1、P2、...、Pn。Intersection 函数返回一个新集合,其属性函数为 P1 和 P2 以及 --- 和 Pn。
  3. 赞美:具有唯一输入的函数是一个集合。设输入集的属性函数为 P1。Compliment 函数返回一个新集合,如果 P1 返回 true,则其属性函数返回 false;如果 P1 为假,则属性函数返回真。也就是说,这个新集合具有NOT P1的属性函数。
  4. 相对赞美:一个以 2 个集合作为输入的函数。输入的属性函数分别为 P1、P2。Relative Compliment 函数返回一个新集合,其属性函数为 (P1 and NOT P2)。
  5. 笛卡尔积:给定一个或多个集合作为输入。该函数生成集合的第二个副本;复制的集合按照它们对应的原始输入集合的相同顺序放置在列表或数组中。

这个集合实现的缺点是没有确定性的方法来表明对于任何两个集合,一个集合是另一个集合的子集,使用通用对象类型和属性。也许可以说是计算机科学(和数学)中最著名的例子是 P=NP。为了使它起作用,我们需要证明对于任何两个集合的任何两个属性函数 P1 和 P2,P1 暗示 P2 或 P2 暗示 P1。这并不总是容易做到的。 我愿意在我想构建的这个集合对象中牺牲这种能力。

一组要完成的目标

我不够精通开发定性描述部分中的集合对象,或任何这些编程语言中的集合选项。我呼吁 StackOverflow 社区帮助我开发:

  1. 用各种语言(不仅仅是 C++、C#、Java 和 Python)开发上述集合对象和集合操作。我愿意接受可能无法创建一组特定类型的对象(例如
  2. 在此页面和/或 GitHub 上,以各种语言呈现并提供 Set Object 和 Set 操作代码。
  3. 在示例中使用集合对象和运算符。
  4. 详细说明该集合不能或可以用于通用对象类型的内容。

代码

本节有 Set 对象的各种实现。如果您有此处未列出的其他语言的实现,请提交。我(或任何模组)可以将其附加到列表中。

爪哇

设置对象代码

设置操作员代码

设置对象和运算符示例

C#

设置对象代码

设置操作员代码

设置对象和运算符示例

Python

设置对象代码

设置操作员代码

设置对象和运算符示例

C++

设置对象代码

设置操作员代码

设置对象和运算符示例

4

1 回答 1

1

您所描述的内容与番石榴 RangeDiscreteDomain课程非常相似。从Rangejavadoc:

范围(或“间隔”)定义了某种类型值的连续跨度周围的边界;Comparable例如,“从 1 到 100 的整数”。请注意,除非可以为方法提供适当的值,否则无法迭代这些包含的值。DiscreteDomainasSet

有关更多详细信息和示例,请参阅他们的Ranges Explained文章。那篇文章的介绍从理论上解释了范围:

范围,有时称为区间,是特定域的凸(非正式地,“连续”或“不间断”)部分。形式上,凸性意味着对于任何a <= b <= c,都range.contains(a) && range.contains(c)意味着range.contains(b)

范围可以“扩展到无穷大”——例如,范围“x > 3”包含任意大的值——或者可能受到有限约束,例如“2 <= x < 5”。

于 2012-09-08T05:45:19.937 回答