探索希尔伯特曲线
希尔伯特曲线:一条线,如何填满整个空间?
想象一下,你拿着一支笔,笔尖只能沿着一条线移动,你不能抬笔,也不能画第二条线。现在给你一个任务:用这一条连续的线,把整个正方形都走遍。
听起来似乎不可能,因为线是一维的,而正方形是二维的。一条一维的没有粗细的线,怎么可能覆盖一个面?
但数学家希尔伯特告诉我们:如果允许这条线不断弯折、不断细化,那么事情会变得非常奇妙。这就是 希尔伯特曲线。
从一个非常简单的图案开始
希尔伯特曲线的第一阶其实非常简单,可以把它想象成一个 U 形状。
没有复杂的数学,没有漂亮的细节,只是 一条弯曲的线。
这就是最开始的希尔伯特曲线。
下一阶,发生了什么?
现在问题来了,如果我们想让这条曲线变得更加复杂,应该怎么办?
一个很自然的想法是:把刚才的图形复制几份,然后连起来。
于是,我们把这个 U 形曲线缩小,得到四个更小的 U 形,然后把它们放进正方形的四个区域。
但事情并没有这么简单,如果四个 U 都保持原来的方向,它们的端点位置就很难自然地连接起来。所以,我们需要把其中一些 U 进行旋转,有些情况下还需要翻转。这样,四个小曲线就可以以合适的方向排列,再把它们连接起来。就是这样:缩小 → 排列 → 旋转 / 翻转 → 连接。
于是,一条比原来复杂得多的连续曲线出现了。
这里有一个很容易产生的疑问:为什么不能直接把四个 U 放在一起?
因为我们真正想得到的,不是四条互不相连的曲线,而是 一条连续的曲线,所以每个小曲线的起点和终点,都必须处在合适的位置。旋转或者翻转,就是为了改变这些小曲线的方向,让它们能够彼此连接起来。
因此,旋转并不是为了让图案“看起来更漂亮”,它是构造过程中非常重要的一步:让不同部分能够按照正确的方向连接起来。同时,把四个小曲线分别放进不同的区域,也可以让它们各自负责正方形的一部分空间,避免全部挤在一起。
但真正重要的事情还在后面
现在,我们已经得到了一条比最开始复杂得多的曲线。那么下一阶怎么办?
这里是希尔伯特曲线最核心的地方:刚才得到的整个图形,会成为构造下一阶图形的基础。也就是说,我们并不是每次都从最开始的 U 重新画,而是 上一阶的整个曲线,变成下一阶构造时要使用的基本图形。
到了下一阶,我们再次把上一阶的图形(现在不是 U 了)缩小,复制成四份,继续把它们放进正方形不同的区域,然后根据需要旋转、翻转,再把它们连接起来。于是,又得到一个更复杂的曲线。
下一阶完成之后,我们还可以继续。
把刚才得到的整个曲线,再次作为构造下一阶图形的基础,然后:缩小 → 排列 → 旋转 / 翻转 → 连接,得到更高一阶的曲线。
然后继续,再继续,再继续,……
所以希尔伯特曲线的核心并不是某一个特别复杂的图形。而是一套非常简单的规则:把上一阶的曲线缩小成几个部分,重新排列、调整方向并连接起来,然后继续重复。简单的规则,经过不断重复,最终产生了极其复杂的结构。
什么是 “阶”?
我们可以把希尔伯特曲线的不同构造层级称为:阶。
第一阶,只有最简单的 U 形。
第二阶,由四个缩小、调整方向后的第一阶组成,曲线开始变得复杂。
第三阶,第二阶又被分成更小的部分,曲线开始出现明显的网格结构。
第四阶,弯折越来越多,线条越来越密集。
第五阶,整个正方形已经被非常密集的曲线覆盖。
所以,阶数越高,意味着我们进行了越多层的递归构造。这里的“递归”,简单来说就是 用之前得到的结果,继续构造新的结果。
随着阶数不断增加,曲线越来越密。它不再像一条普通的“线”。而越来越像 一张密密麻麻的二维地图。
继续增加。线与线之间的空隙越来越小。再增加,空隙更小。再增加,曲线更加密集。
如果我们把这个过程一直进行下去,最终会得到一个极其反直觉的结果:这条连续的曲线可以覆盖整个正方形,这就是希尔伯特曲线最著名的特征。
一条线,真的能变成一个面吗?
这里必须稍微停下来解释一下。当我们说:“希尔伯特曲线填满了整个正方形。”,并不是说:你画了一条普通的粗线,然后把正方形涂满了。
真正的意思是:当阶数趋向无限时,希尔伯特曲线可以经过正方形中的每一个点。
也就是说,对于正方形中的任意一个位置,都可以找到曲线上的某个位置与它对应。
因此,希尔伯特曲线属于 空间填充曲线。
“空间填充” 是什么意思?
可以把它想象成一个非常勤奋的机器人。
机器人只有一条路线,它不能飞,不能跳,不能瞬移,只能 沿着一条连续的路线前进。
如果路线还比较粗,它只能经过正方形中的一些区域。但是随着曲线不断细化,路线会越来越密。它会进入越来越小的区域,绕过去,再回来,再进入下一个区域,再回来……
路线越来越细,覆盖的空间越来越多。最终在极限意义上,正方形中的每一个位置,都可以被这条路线经过
这就是“空间填充”。
现在我们可以回到一个更深的问题:为什么希尔伯特曲线最终可以覆盖整个正方形,而不是留下某些永远无法到达的地方?关键就在于,曲线的构造会不断细化空间。
在较低的阶下,正方形被分成比较大的区域,曲线会进入这些区域。到了更高的阶,这些区域又会被进一步分成更小的区域,曲线继续进入其中。再下一阶,这些区域还会继续细分,于是,空间被越来越细地划分,与此同时,曲线也越来越密。所以随着阶越来越高,曲线与曲线之间的空隙越来越小。在无限细化的极限下,这些空隙可以趋向于零。因此,没有某个固定的小区域能够永远躲在曲线之外。
可以把它想象成一场“越来越细的扫地”,这是理解希尔伯特曲线最直观的方法之一。
想象你要用一支笔把整个正方形走一遍。
第一阶:你只能画一条比较粗略的路线,会留下很多空白。
第二阶:路线更加细密,空白变少。
第三阶:路线继续变密,空白更少。
第四阶:路线已经非常密集。
……
继续下去,空白区域越来越小。最终,在无限阶的极限意义下,空白趋向于零。这就是空间填充。
但它和普通“涂满”不一样,这里还有一个非常有趣的区别。
如果你拿刷子把整个正方形涂黑,当然很容易来回把它填满。
但希尔伯特曲线的要求更加苛刻:你只能画一条连续的线,不能抬笔,不能跳跃,不能画第二条独立的线。
即使这样,它仍然可以在极限意义上覆盖整个区域。所以真正神奇的不是”把正方形填满“,而是“只用一条连续的曲线,也可以走遍整个二维空间”。
希尔伯特曲线 为什么这么特别?
到这里,我们已经看到了希尔伯特曲线最令人惊讶的一面。
它从 一条简单的曲线 开始,通过不断的 缩小 → 排列 → 旋转 / 翻转 → 连接,一步一步变得越来越复杂。
而最终,它却不只是得到一个复杂的图案。它做到了 用一条连续的曲线,覆盖整个二维正方形,这就是它与许多普通分形最不同的地方。
一个非常重要的特点:自相似
现在我们已经理解了希尔伯特曲线是怎样一阶一阶构造出来的,可以再回头看一个非常有趣的现象。
还记得吗?我们刚才说过:上一阶的整个曲线,会成为下一阶构造的基础,这意味着,在一个更高阶的希尔伯特曲线中,你会发现许多更小的区域,看起来和较低阶的希尔伯特曲线非常相似。例如:第三阶,可以看成由多个缩小、旋转或翻转后的第二阶组成。而第二阶,又可以看成由多个第一阶组成。
这种 整体中包含与整体相似的局部结构,就是我们所说的 自相似,这也是分形结构中非常重要的特征之一。
“一维”为什么可以覆盖“二维”?
这是希尔伯特曲线最值得思考的问题之一。
我们平时认为,一条线 = 一维,一个正方形 = 二维,所以直觉上,一条线不可能覆盖一个正方形。
对于普通的线来说,这个判断当然没有问题。
但希尔伯特曲线是一个特殊的数学构造。它并不是一条普通的、光滑的线,随着阶数不断增加,它会不断弯曲、折返、进入更小的区域、再折返、再进入更小的区域、……。当这个过程无限进行时,它可以建立起从一维参数到二维空间的连续映射。于是,一个看似“一维”的对象,就能够覆盖整个二维正方形。
但这并不意味着“维度消失了”。
这里也有一个容易产生误解的地方。希尔伯特曲线并不是在说“一维和二维完全没有区别。”,当然不是。它真正说明的是:一个区间上的点,可以通过连续映射覆盖一个二维正方形,但这种映射并不是一一对应的,也就是说,不同的曲线参数,有时可能对应到同一个空间位置。所以,它并不是说现实世界中的一根普通绳子突然变成了一个正方形,而是数学中存在这样一种非常特殊的连续映射。
为什么数学家会研究这样的东西?
希尔伯特曲线并不是为了画漂亮的数学艺术而诞生的,它来自数学家对于连续曲线以及空间之间关系的研究。
十九世纪末,德国数学家大卫·希尔伯特提出了这种空间填充曲线,它挑战了人们对于 线 和 面 之间关系的直觉。
在普通人的直觉里,线就是线,面就是面,它们应该是完全不同的东西。
但希尔伯特曲线告诉我们:数学世界里的“维度”,有时候会表现出非常反直觉的关系。
希尔伯特曲线并不只是一个用来挑战直觉的数学构造,它还有非常实际的用途:把二维空间中的数据,映射到一条一维的顺序上。
比如,你有一个二维地图,但是计算机最终需要把数据存储在一个线性的地址空间里,那么问题来了:怎样把二维附近的数据,尽量也放在一维空间中相近的位置?
希尔伯特曲线可以提供一种非常优秀的排列方式,因为它具有很好的空间局部性。简单来说,二维空间中彼此接近的区域,沿着希尔伯特曲线的顺序,通常也会比较接近。这意味着,原本二维的空间关系,可以被尽量保留到一维的排列中。
这种思想可以用于空间数据库、数据索引、图像处理、计算机图形学、科学计算、多维数据处理等多种计算机科学应用。
所以,这个看起来像数学玩具的曲线,其实也和计算机科学有很深的联系。
一条线的极限
现在回到最开始的问题:一条线,怎么可能填满一个正方形?
希尔伯特曲线给出的答案不是“一条普通的线真的变成了一个面。”,而是 从一个简单的曲线开始,不断把上一阶曲线作为下一阶构造的基础,通过缩小、重新排列、旋转 / 翻转和连接,不断细化空间。
当这个过程无限进行时,这条连续曲线可以覆盖整个正方形。这听起来非常反直觉,但也正因为如此,它才成为数学中最著名的 空间填充曲线 之一。
如果把希尔伯特曲线的整个故事浓缩起来,其实非常简单:一条简单的曲线 → 缩小成多个部分 → 重新排列 → 旋转 / 翻转 → 连接 → 得到下一阶曲线 → 把上一阶作为下一阶构造的基础 → 不断重复 → 曲线越来越密 → 空隙越来越小 → 无限细化 → 填满整个空间。
一个简单得几乎让人难以相信的规则,最终却产生了一个令人惊讶的结果:一条连续的曲线,可以走遍一个二维空间。,这就是 希尔伯特曲线。
希尔伯特曲线 与 分形龙 有什么不同?
如果你已经探索过 分形龙,可能会觉得:“它们看起来都是不断递归生成的曲线。”
确实如此,但它们想展示的东西不同。
分形龙 核心是 不断折叠。一条简单的线,经过重复折叠,变成复杂的分形结构。它让我们看到 简单规则 → 复杂图案。
希尔伯特曲线 核心是 不断细分和填充空间。一条连续的线,经过不断细化、重新排列和连接,最终覆盖二维区域。它让我们看到:一条曲线 → 整个二维空间。
所以可以简单地理解为:
分形龙 是 折出一条龙。
希尔伯特曲线 是 用一条线走遍整个房间。
希尔伯特曲线 与 曼德博集合 有什么不同?
希尔伯特曲线 和 曼德博集合,都能通过简单规则产生令人惊讶的复杂结构,但它们产生复杂性的方式完全不同。
曼德博集合 不断计算:复数 → 迭代 → 判断,最后得到一个复杂的集合,它最吸引人的地方是:无限放大时不断出现复杂细节。
希尔伯特曲线 不断执行:缩小 → 排列 → 旋转 / 翻转 → 连接 → 重复,最终,不断提高曲线的空间覆盖密度。
所以:
曼德博集合:探索无限细节。
希尔伯特曲线:探索无限密度。
它们虽然都能产生复杂的视觉结构,但探索时的感觉完全不同。
继续探索数学世界
希尔伯特曲线 是分形与递归几何中非常特别的一种构造。
如果你喜欢这种 简单规则不断重复,最终产生复杂结构 的数学图形,还可以继续探索 分形龙,看看一条简单的线如何通过不断折叠,变成复杂的分形图案。也可以探索 阿波罗尼奥斯圆填充,看看圆与圆之间如何不断填充,创造一个几乎没有尽头的圆形世界。或者回到 曼德博集合,看看一个简单的复数迭代,如何产生无限复杂的边界。
它们的数学原理完全不同,却都在告诉我们一件非常有趣的事情:重复一个简单的规则,有时候会把我们带到一个完全超出直觉的世界。
而 希尔伯特曲线 给出的答案尤其令人惊讶:有时候,一条线不仅可以变得无比复杂,甚至可以用自己的方式,走遍整个空间。
你还可以继续欣赏更多奇妙的数学图形,或者查看维基百科上更多关于希尔伯特曲线的介绍。