【问题标题】:Lookup function of Hash Table in SMLSML中哈希表的查找功能
【发布时间】:2014-11-30 03:54:35
【问题描述】:

我被分配在 SML 中为此哈希表数据类型编写查找函数;

datatype 'a ht = table of (int * ('a list)) list;

如果表为空和/或键不存在表,则返回 nil。 函数应该是这样的

val lookup = fn : int -> 'a ht -> 'a list

但我不知道如何查看哈希表的每个存储桶或显示键存储桶的值。对于使用哪种算法,我将不胜感激。

例如函数应该像这样工作;

-lookup 3 (table [(1, [2,3]), (2, [3,4,5]), (3, [4])]);
  val it = [4] : int list
-lookup 4 (table [(1, [2,3]), (2, [3,4,5]), (3, [4])]);
  val it = [] : int list

【问题讨论】:

  • 我尝试使用 find 函数来简化它:有趣的查找键 nil = false | find key (x::rest) = if key = x then true else find key (rest);但显然这是一个列表,不接受哈希表类型。我正在寻找一种将其应用于哈希表的方法。然后以某种方式打印键的值(如果存在)。
  • 先写一个在int列表中查找int的函数

标签: hashtable lookup sml


【解决方案1】:

您的哈希表是一对列表。

为了有趣的查找 n 表 = ... 首先,您需要一个函数来沿着对列表向下移动到第 n 个位置。 你可以使用类似的东西

case table of
table [] => nil
|table ls => lookup n-1 table (tl ls)

当你的查找函数的第二个参数在递归中减少到 1 时,第二次获取值(该对的 #2)或通过模式匹配,假设你的键按照你的示例中的顺序排列。 那就退货吧。

【讨论】: