全局变量是存储数据的宝剑。 稀疏数组。 第三部分

全局变量是存储数据的宝剑。 稀疏数组。 第三部分在前面的部分(1, 2)我们将全局变量视为树,在这一节中我们将把全局变量视为稀疏数组。

稀疏数组 是一种数组类型,其中大多数值取相同的值。

在实践中,稀疏数组通常非常巨大,以至于用相同的元素占用内存是没有意义的。 因此,以这样的方式实现稀疏数组是有意义的,这样内存就不会浪费在存储相同的值上。
在某些编程语言中,稀疏数组包含在语言本身中, 例如在 J, MATLAB。 其他编程语言有特殊的库可以让你实现它们。 对于 C++ - 艾根 等等

全局变量是实现稀疏数组的良好候选者,因为:

  1. 它们只存储某些节点的值,不存储未定义节点的值;
  2. 访问节点值的接口与许多编程语言实现对多维数组元素的访问极其相似。
    Set ^a(1, 2, 3)=5
    Write ^a(1, 2, 3)

  3. Global 是一个相当低级的数据存储结构,因此它具有出色的速度特性(从每秒数十万到数千万个事务,具体取决于硬件,见下文)。 1)

由于全局是一个持久结构,因此当事先知道 RAM 量不够时,在其上创建稀疏数组是有意义的。

稀疏数组实现的属性之一是,如果访问未定义的单元格,则返回一些默认值。

这可以使用函数来实现 $GET 在 COS 中。 此示例考虑 3 维数组。

SET a = $GET(^a(x,y,z), defValue)

哪些任务需要稀疏数组以及全局变量如何提供帮助?

邻接(连通)矩阵

这样的矩阵 用于表示图形:

全局变量是存储数据的宝剑。 稀疏数组。 第三部分

显然,图越大,矩阵中的零就越多。 例如,如果我们采用社交网络图并将其以类似矩阵的形式呈现,那么它将几乎完全由零组成,即将是一个稀疏数组。

Set ^m(id1, id2) = 1 
Set ^m(id1, id3) = 1 
Set ^m(id1, id4) = 1 
Set ^m(id1) = 3 
Set ^m(id2, id4) = 1 
Set ^m(id2, id5) = 1 
Set ^m(id2) = 2
....

在这个例子中,我们全局保存 ^m 连接矩阵,以及每个节点的边数(谁与谁是朋友以及朋友的数量)。

如果图中的元素数量不超过 29 万(该数量取 8 * 的乘积) 最大线径),也就是说,存储此类矩阵的一种更经济的方式是位串,因为它们的实现以特殊方式优化了大间隙。

位串的操作由函数执行 $比特.

; установка бита
SET $BIT(rowID, positionID) = 1
; получение бита
Write $BIT(rowID, positionID)

状态机转换表

由于有限自动机的转移图是普通图,因此有限自动机的转移表就是上面讨论的相同的邻接矩阵。

元胞自动机

全局变量是存储数据的宝剑。 稀疏数组。 第三部分

最著名的元胞自动机是 游戏“生活”,由于其规则(当一个单元有许多邻居时,它就会死亡),它是一个稀疏数组。

Stephen Wolfram 认为元胞自动机 新的科学领域。 2002 年,他出版了一本 1280 页的书《一种新的科学》,书中他广泛地指出,元胞自动机的进步不是孤立的,而是持久的,并对所有科学领域产生重大影响。

已经证明,任何在计算机上可执行的算法都可以使用元胞自动机来实现。 元胞自动机用于对动态环境和系统进行建模、解决算法问题以及用于其他目的。

如果我们有一个巨大的字段并且需要记录元胞自动机的所有中间状态,那么使用全局变量是有意义的。

制图学

当谈到使用稀疏数组时,我首先想到的是映射任务。

一般来说,地图上有很多空白区域。 如果地图被表示为大像素,那么地球71%的像素将被海洋占据。 稀疏数组。 而如果只应用人手的作品,那么空白空间将超过95%。

当然,没有人以栅格数组的形式存储地图;而是使用矢量表示。
但什么是矢量地图? 这是一种由点和折线和多边形组成的框架。
本质上是一个点及其之间连接的数据库。

最雄心勃勃的测绘任务之一是盖亚望远镜绘制银河系地图的任务。 形象地说,我们的银河系就像整个宇宙一样,是一个连续的稀疏阵列:巨大的空虚空间,其中存在着罕见的小点——恒星。 空白空间为 99,999999…….%。 为了存储我们银河系的地图,我们选择了一个全球数据库 - Caché。

我不知道这个项目中全局变量的确切结构,我可以假设它类似于:

Set ^galaxy(b, l, d) = 1; Номер звезды по каталогу, если есть
Set ^galaxy(b, l, d, "name") = "Sun"
Set ^galaxy(b, l, d, "type") = "normal" ; варианты blackhole, quazar, red_dwarf и т.д.
Set ^galaxy(b, l, d, "weight") = 14E50
Set ^galaxy(b, l, d, "planetes") = 7
Set ^galaxy(b, l, d, "planetes", 1) = "Mercury"
Set ^galaxy(b, l, d, "planetes", 1, weight) = 1E20
...

其中 b、l、d 是 银河坐标纬度、经度 以及到太阳的距离。

全局变量的灵活结构允许您保存恒星和行星的任何必要特征,因为全局变量的基础是无方案的。

为了存储我们的宇宙地图,选择 Caché 不仅是因为它的灵活性,还因为它能够非常快速地存储数据流,同时创建索引全局变量以进行快速搜索。

如果我们返回地球,那么制图项目是在全局变量上创建的 OpenStreetMap XAPI 和 OpenStreetMap 的一个分支 - FOSM.

最近在 黑客马拉松 Caché 实施地理空间索引 地理空间。 我们正在等待作者发表包含实现细节的文章。

OpenStreetMap XAPI 中全局空间索引的实现

图片取自 这个演示文稿.

整个地球被划分为正方形,然后是子正方形,子正方形又分为子子正方形,依此类推。 一般来说,我们得到一个层次结构来存储创建的全局变量。

全局变量是存储数据的宝剑。 稀疏数组。 第三部分

在任何时刻,我们几乎可以立即请求所需的方块或清除它,并且所有子方块也将被返回或清除。

类似的全局方案可以通过多种方式实现。

选项1:

Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 1) = idПервойТочки
Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 2) = idВторойТочки
...

选项2:

Set ^m('abacdabcdabacdabcda', 1) = idПервойТочки
Set ^m('abacdabcdabacdabcda', 2) = idВторойТочки
...

在这两种情况下,使用 COS/M 请求位于任意级别的正方形中的点并不困难。 在第一个选项中,清理任意层的方形空间会更容易一些,但这很少是必要的。

下层方块之一的示例:

全局变量是存储数据的宝剑。 稀疏数组。 第三部分

以下是 XAPI 项目中的几个全局变量:全局变量索引的表示:

全局变量是存储数据的宝剑。 稀疏数组。 第三部分

全球的 ^方式 用于存储积分 折线 (道路、小河流等)和多边形(封闭区域:建筑物、森林等)。

稀疏数组在全局变量上的使用的粗略分类。

  1. 我们存储某些对象的坐标及其状态(映射、元胞自动机)
  2. 我们存储稀疏矩阵。

对于情况2),当请求元素未赋值的特定坐标时,我们必须获取默认稀疏数组元素的值。

在全局变量中存储多维矩阵时我们收到的奖励

快速删除和/或选择行、平面、立方体等的倍数空间。 对于使用整数索引的情况,快速移除和/或获取行、平面、立方体等的倍数的空间块的能力可能是有用的。

团队 我们可以删除单个元素或一行,甚至整个平面。 由于全局变量的属性,这种情况发生得非常快 - 比逐个元素删除快数千倍。

下图展示了全局中的一个三维数组 ^a 以及不同类型的删除。

全局变量是存储数据的宝剑。 稀疏数组。 第三部分

要使用已知索引选择空间片段,可以使用以下命令 合并.

选择矩阵列放入 Column 变量中:

; Зададим трёхмерный разреженный массив 3x3x3
Set ^a(0,0,0)=1,^a(2,2,0)=1,^a(2,0,1)=1,^a(0,2,1)=1,^a(2,2,2)=1,^a(2,1,2)=1
Merge Column = ^a(2,2)
; Выведем переменную Column
Zwrite Column

结论:

Column(0)=1
Column(2)=1

Column 变量的有趣之处在于我们还有一个稀疏数组,也必须通过 $GET,因为默认值不存储在其中。

也可以使用该功能通过小程序来选择空间块 $订单。 这对于索引未量化(制图)的空间尤其方便。

结论

当前时代提出了新的宏伟任务。 图可以由数十亿个顶点组成,地图可以由数十亿个点组成,有些人甚至可能想在元胞自动机上运行自己的宇宙(1, 2).

当稀疏数组中的数据量不再适合 RAM,但您需要使用它们时,那​​么值得考虑在全局变量和 COS 上实现类似项目的可能性。

感谢您的关注! 我们正在等待您在评论中提出问题和愿望。

免责声明: 本文以及我对其的评论仅代表我的观点,与 InterSystems Corporation 的官方立场无关。

来源: habr.com

添加评论