在 §944的TeX 程序(B 卷计算机与排版)DEK 描述了使用的哈希函数新_trie_op为了有效地存储连字表。引用他的话:
使用的哈希函数新_trie_op是基于 313/510 近似于黄金分割率的观察[参见计算机编程艺术 3(1973),510-512];trie_op_hash_size通常是510的倍数。
我的问题是:DEK 讨论 313/510 比率和以下事实是否是巧合?trie_op_hash_size是 510 的倍数,作为参考第 510 页计算机编程艺术?
答案1
当然,只有 Knuth 本人才能回答这样的问题。以下是我的评论。
您引用了一个旧的§944,当 \TeX\ 意识到 8 位、多种语言等时,该条款就被替换了;请参阅 tex82.bug。
trie_op_hash_size是两倍(最大四分之一字-最小四分之一字) (§943),默认情况下为 2*255=510。在第 944 节的程序中使用了哈希函数。哈希值是哈希函数的总和,因为有多个密钥;313 和 361 用作与 510 互质的乘数。因子 313 与密钥一起使用,用于 TeX 所称的模式中的“连字符距离”,通常是一个较小的数字。斐波那契哈希扩展序列 1,2,3,... 是一个不错的选择,但是有许多具有相同键的条目,因此使用具有其他键的几个哈希函数的总和。
现在,求和仍然被一个加数扩展,该加数具有当前语言的乘数 1009。现在计算不是模 510 而是模 2 次trie_op_size并且该引用消失了;trie_op_size默认值为 500,而不是 255。
TAOCP 第 3 卷第一版第二印刷版第 510 页开始的文本在第二版中以第 517 页的图 37 开始。Knuth 查看了 $\phi^{-1} = (\sqrt5 - 1)/2$ 并将其称为黄金比例。文本描述了斐波那契散列的属性,因此引用第 510 页是有意义的。顺便说一句,那里提出的理论表明,在某些情况下,精确近似不一定是最好的,也就是说,313 可能比 317 更好,尽管我认为这在这里并不重要。请注意,旧卷 3 中没有提到多个键的哈希函数求和,新版本引用了 1977 年的一篇论文。
但是,你忽略了旧 §944 中引用段落的最后一句话:“但在这个特定应用中,选择相对不重要。”我认为对 TAOCP 的引用对于理解或解释代码和乘数 313 来说并不是绝对必要的;也许在 1982 年是必要的,而我有一个现代的观点。这并不是胡说八道,因为引用指向散列,但人们可以推测 Knuth 只是因为所述的巧合才引用的。一旦 510 被替换,引用就消失了(早在第 3 卷第 2 版准备好之前)。例如,第 §920 节保留了对旧第 3 卷的引用。