唐纳德·高德纳 2022 年“圣诞树”讲座

今年,2022 年是 唐纳德·高德纳开始写作计算机编程的艺术的 60 周年。今年85岁的高德纳几乎已经成为计算机编程界的传奇人物——他仍在为他对算法的大规模分析撰写书籍。

但每年,就在圣诞节前后,都有一个传统。高德纳为斯坦福大学的一小部分观众(高德纳是名誉教授)和更多的在线观众举办了一场“面向非专业人士”的特别讲座。

树的魔力

高德纳弯腰在记事本(投射到他身后的屏幕上)上,开始了第26届年度圣诞节讲座,指出当晚的话题已经隐藏了二十年。在最初的20年里,他们称之为“圣诞树”讲座,因为“树对计算机科学家来说是最重要的东西之一。每年我都会至少学到两件关于树木的新东西......”

大约五年前,他们把名字改成了“圣诞讲座”——但问题不在于树木不再有趣。“我仍然每年都会学到关于树木的很酷的东西。但是他们越来越难向普通观众解释!

因此,今年胜利的“回家”讲座确实包括树木 - 特别是高德纳描述为“双子树”的现象,以及Baxter排列和平面图。高德纳指出,这些都是最新一卷《计算机编程的艺术》中涉及的主题,然后开玩笑地提醒观众,他的书是一个很好的圣诞礼物。

他笑着补充说:“从讲师的角度来看,当你有你喜欢谈论的事情时,总是最好的。

唐纳德首先向观众介绍了二叉树——一种熟悉的分支数据结构,当你向下工作时,每个节点最多可以有两个较低的节点(一个左节点和一个右节点)。但随后他向观众展示了“50 多年来我最喜欢的算法之一......二叉树插入。如果数据低于键值,则数据插入左分叉,如果数据较高,则插入右分叉。

为了生成一个真正的随机序列,他会让观众大声喊出数字应该出现在八个数字序列中的位置——然后将这些混乱变成他记事本上的一棵整洁的二叉树。

但是,然后以相反的顺序浏览这些相同的数字,高德纳神奇地产生了一个互补的第二个二叉树 - 当你将每个父节点的子节点(对于两棵树)写到一个图表上时,它没有重叠。

高德纳用红色墨水来写一棵树的子节点,然后用绿色墨水写下另一棵树的子节点来演示这一点:

奥纳德高德纳绘制双子树(二叉树对) 十二月7 2022

高德纳分享了一个令人惊讶的计算结果,即有超过10,000棵八节点双树。“这种树插入算法是我从1960年代中期开始就一直在玩的东西,”高德纳告诉惊讶的观众,“我已经在无数的计算机程序中使用它。

“但我从来没有——我花了50年的时间才明白,它也同时给了我双树!”

小和大

下一个数学古玩是Baxter排列,这是一种数字序列,高德纳为它提供了一个漂亮的简单定义。如果任何固定数kK + 1上面的数字是“大”,而它们下面的数字是“小”,那么在Baxter排列中,“我不能有一个大后跟一个小。(反之亦然。如果在序列中 k 前面有较大的 k + 1,那么“我不能有一个小的后跟一个大。

高德纳提供了一个例子——但随后玩弄了后果。

颠倒数字的顺序总是会产生另一种Baxter排列。您还可以通过向序列中的每个数字添加一个常量来生成另一个 Baxter 排列。如果该常量等于或大于序列的最高数字,则可以通过将序列附加到原始序列上来生成更长的Baxter排列。(甚至可以在该序列之前挂起。

所有这些场景都保留了巴克斯特序列的原始独特属性,高德纳向观众重申。无论您选择哪对数字来分隔一对进行测试,“所有的小家伙都会先来,大人物在后。

高德纳提出了尽可能小的非巴克斯特排列——3、1、4、2。他称之为“圆周率突变”,因为它是圆周率到四位数的四舍五入近似值。

多年来,高德纳发现,在测试关于排列的猜想时,“如果猜想是假的,它几乎总是在pi突变时失败。序列的反面也不是Baxter排列 - 只有两个这样的失败序列(在24个可能的序列中)。

三种漂亮的算法

当晚的最后一个主题是平面图——将一个看起来很熟悉的矩形分解(或“分解”)成更小的子矩形。(或者,这是一个平面图,进入“房间”。顺便说一句,Knuth指出,在创建硅芯片时,这种建模变得很重要 - “房间”成为模块或逻辑门。

然后他问了一个挑衅性的问题:两个平面图相同意味着什么?

唐纳德·高德纳绘制平面图 十二月7 2022

高德纳在他的 X 轴和 Y 轴上重新排列了他的坐标名称的顺序,然后绘制了另一个平面图,其中矩形彼此保持相同的位置。(“我不妨把整个事情写下来,因为这是在互联网上发生的,”高德纳一度开玩笑说。

这个特殊的平面图遵循榻榻米条件——没有四个不同矩形在一个点相遇的“四个角”点。高德纳展示了绘制平面图的替代方法——这使他进入了他的大结局。“这和双子树和巴克斯特排列有什么关系?”

令人惊讶的是,当使用最后的图表方法时,每个数字序列都是Baxter排列的,都会给你一个有效的平面图。通过同样的顺序,先向前,然后向后,总是给你一对双子树——你猜对了——它们再次完美互补。(当您将两个树的每个父节点的子节点写到单个图表上时,没有重叠。

“你给我一个Baxter排列,我可以告诉你平面图是什么。你给我一个平面图,我可以告诉你双子树是什么,你给我一棵双子树,我可以告诉你产生它的独特巴克斯特排列是什么!”

三个迷人的概念,起初似乎彼此完全无关,实际上通过三个漂亮的算法一对一地对应。

高德纳编写了执行所有操作的程序——比如将Baxter排列转换为平面图的程序。(“如果你给它一个不是巴克斯特排列的排列,”高德纳告诉观众,“它会嘲笑你,说'太糟糕了。你丢失。这不是巴克斯特的排列!他甚至使用Unix管道将一个程序的输出作为下一个程序的输入 - “当然,我回到了我开始的那个。

你可能感兴趣的:(唐纳德·高德纳 2022 年“圣诞树”讲座)