在 Trie 中插入值

2024-04-24

我在 SML 目录中找到了 Trie 的实现:

    signature DICT =
    sig
      type key = string                 (* concrete type *)
      type 'a entry = key * 'a          (* concrete type *)

      type 'a dict                      (* abstract type *)

      val empty : 'a dict
      val lookup : 'a dict -> key -> 'a option
      val insert : 'a dict * 'a entry -> 'a dict
      val toString : ('a -> string) -> 'a dict -> string
    end;  (* signature DICT *)

    exception InvariantViolationException

    structure Trie :> DICT = 
    struct
      type key = string
      type 'a entry = key * 'a

      datatype 'a trie = 
        Root of 'a option * 'a trie list
      | Node of 'a option * char * 'a trie list

type 'a dict = 'a trie

  val empty = Root(NONE, nil)

  (* val lookup: 'a dict -> key -> 'a option *)
  fun lookup trie key =
    let
      (* val lookupList: 'a trie list * char list -> 'a option *)
      fun lookupList (nil, _) = NONE
        | lookupList (_, nil) = raise InvariantViolationException
        | lookupList ((trie as Node(_, letter', _))::lst, key as letter::rest) =
            if letter = letter' then lookup' (trie, rest)
            else lookupList (lst, key)
        | lookupList (_, _) =
            raise InvariantViolationException

      (*
        val lookup': 'a trie -> char list
      *)
      and lookup' (Root(elem, _), nil) = elem
        | lookup' (Root(_, lst), key) = lookupList (lst, key)
        | lookup' (Node(elem, _, _), nil) = elem
        | lookup' (Node(elem, letter, lst), key) = lookupList (lst, key)
    in
      lookup' (trie, explode key)
    end

  (*
    val insert: 'a dict * 'a entry -> 'a dict
  *)
  fun insert (trie, (key, value)) = 
    let
      (*
        val insertChild: 'a trie list * key * value -> 'a trie list
        Searches a list of tries to insert the value. If a matching letter 
        prefix is found, it peels of a letter from the key and calls insert'. 
        If no matching letter prefix is found, a new trie is added to the list.
        Invariants:
          * key is never nil.
          * The trie list does not contain a Root.
        Effects: none
      *)
      fun insertChild (nil, letter::nil, value) = 
            [ Node(SOME(value), letter, nil) ]
        | insertChild (nil, letter::rest, value) = 
            [ Node(NONE, letter, insertChild (nil, rest, value)) ]
        | insertChild ((trie as Node(_, letter', _))::lst, key as letter::rest, value) = 
            if letter = letter' then
              insert' (trie, rest, value) :: lst
            else
              trie :: insertChild (lst, key, value)
        | insertChild (Root(_,_)::lst, letter::rest, value) =
            raise InvariantViolationException
        | insertChild (_, nil, _) = (* invariant: key is never nil *)
            raise InvariantViolationException

      (*
        val insert': 'a trie * char list * 'a -> 'a trie
        Invariants:
          * The value is on the current branch, including potentially the current node we're on.
          * If the key is nil, assumes the current node is the destination.
        Effects: none
      *)
      and insert' (Root(_, lst), nil, value) = Root(SOME(value), lst)
        | insert' (Root(elem, lst), key, value) = Root(elem, insertChild (lst, key, value))
        | insert' (Node(_, letter, lst), nil, value) = Node(SOME(value), letter, lst)
        | insert' (Node(elem, letter, lst), key, value) = Node(elem, letter, insertChild (lst, key, value))
    in
      insert'(trie, explode key, value)
    end

    (*
      val toString: ('a -> string) -> 'a dict -> string
    *)
    fun toString f trie =
      let
        val prefix = "digraph trie {\nnode [shape = circle];\n"
        val suffix = "}\n"

        (* val childNodeLetters: 'a trie list * char list -> char list *)
        fun childNodeLetters (lst, id) =
          (foldr 
            (fn (Node(_, letter, _), acc) => letter::acc
              | _ => raise InvariantViolationException) nil lst)

        (* val edgeStmt: string * string * char -> string *)
        fun edgeStmt (start, dest, lbl) =
          start ^ " -> " ^ dest ^ " [ label = " ^ Char.toString(lbl) ^ " ];\n"

        (* val allEdgesFrom: char list * char list *)
        fun allEdgesFrom (start, lst) = 
          (foldr 
            (fn (letter, acc) => 
              acc ^ edgeStmt(implode(start), implode(start @ [letter]), letter))
            "" lst)

        (* val labelNode: stirng * string -> string *)
        fun labelNode (id: string, lbl: string) =
          id ^ " [ label = \"" ^ lbl ^ "\" ];\n"

        fun toString' (Root(elem, lst), id) =
              let
                val idStr = implode(id)
                val childLetters = childNodeLetters(lst, id)
                val childStr = foldr (fn (trie, acc) => acc ^ toString'(trie, id)) "" lst
              in
                (case elem
                  of SOME(value) => 
                      labelNode (idStr, f(value)) ^ 
                      allEdgesFrom (id, childLetters)
                   | NONE => 
                      labelNode (idStr, "") ^ 
                      allEdgesFrom (id, childLetters)) ^ childStr
              end
          | toString' (Node(elem, letter, lst), id) =
              let
                val thisId = id @ [letter]
                val idStr = implode(thisId)
                val childLetters = childNodeLetters(lst, thisId)
                val childStr = foldr (fn (trie, acc) => acc ^ toString'(trie, thisId)) "" lst
              in
                (case elem
                  of SOME(value) => 
                      labelNode (idStr, f(value)) ^ 
                      allEdgesFrom (thisId, childLetters)
                   | NONE => 
                      labelNode (idStr, "") ^ 
                      allEdgesFrom (thisId, childLetters)) ^ childStr
              end
      in
        prefix ^ (toString' (trie, [#"_", #"R"])) ^ suffix
      end
end

每当我尝试使用上述函数在此实现中插入或查找字符串时:insert,lookup 我收到以下错误:

stdIn:1.2-1.8 Error: unbound variable or constructor: lookup
stdIn:1.2-1.8 Error: unbound variable or constructor: insert

我认为这是一个声明问题,但我不知道如何解决它。 为什么会发生这种情况以及如何在 Trie 数据结构中正确插入或搜索?


首先,如果您没有此代码的知识产权,您应该链接到您找到它的位置而不是重复它,因为您没有提供归属信息。其次,代码似乎运行良好。在这里,我插入了几个键并查找它们:

$ sml trie.sml 
Standard ML of New Jersey v110.79 [built: Tue Aug  8 23:21:20 2017]
[opening trie.sml]
signature DICT =
  sig
    type key = string
    type 'a entry = key * 'a
    type 'a dict
    val empty : 'a dict
    val lookup : 'a dict -> key -> 'a option
    val insert : 'a dict * 'a entry -> 'a dict
    val toString : ('a -> string) -> 'a dict -> string
  end
[autoloading]
[library $SMLNJ-BASIS/basis.cm is stable]
[library $SMLNJ-BASIS/(basis.cm):basis-common.cm is stable]
[autoloading done]
exception InvariantViolationException
structure Trie : DICT
- val foo = Trie.insert (Trie.empty, ("foo", 42));
val foo = - : int Trie.dict
- val bar = Trie.insert (foo, ("fab", 43));
val bar = - : int Trie.dict
- Trie.lookup bar "foo";
val it = SOME 42 : int option
- Trie.lookup bar "fab";
val it = SOME 43 : int option
- Trie.lookup bar "wat";
val it = NONE : int option
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Trie 中插入值 的相关文章

  • SML 警告:使用空列表或 NONE 选项时,类型变量未通用化

    我一生都无法弄清楚为什么以下 SML 函数在我的作业问题中抛出警告 fun my func f ls case ls of gt raise MyException head rest gt case f head of SOME v gt
  • 如何在 SML/NJ 中进行按位与运算?

    我正在编写的程序需要它 重复平方来计算 x n 我似乎找不到它的语法 或者是否支持它 它们可在Word8 and Word结构 let open Word8 infix andb orb xorb notb lt lt gt gt gt g
  • SML 中绑定的价值?

    有人可以解释一下为什么评估后 and 的值一定是 16 这是正确的答案吗 我认为答案 3 是因为我们调用函数 f 并将值 1 和 2 作为函数 f 发送 但看不到值 5 和 10 但我想我错了 val x 1 val y 2 val f f
  • number_in_month 练习(SML 中多个列表的迭代)

    我在 SML 中有两个列表 假设列表 A a b c d e f 和列表B b e 我想计算 B 中每个项目与 A 中每个三元组的第二个元素匹配的次数 输出应该是 2 因为b and e每个在 A 中出现一次 到目前为止 这是我的代码 但是
  • SML 中的霍纳算法? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试实施霍纳算法 http en wikipedia org wiki Horner 27s algorithm
  • 通过索引变量访问 SML 元组

    问题很简单 如何在SML中使用索引变量访问元组 val index 5 val tuple1 1 2 3 4 5 6 7 8 9 10 val correctValue index tuple1 我希望有人能够提供帮助 提前致谢 不存在接受
  • 记录列表上的SML功能

    我试图声明一个函数 该函数将元组内的记录列表作为参数 但语法并不像我希望的那样直观 这就是我想做的 type Player id int privateStack int list fun foo id x xs Player player
  • fn 类型的 ml 函数:'a -> 'b

    功能 fn a gt b 现在 有没有可以定义并具有这种类型的函数 标准机器学习中该函数签名有两种可能的实现 一种使用异常 另一种使用递归 val raises a gt b fn a gt raise Fail some error In
  • 输出在 REPL 中被 # 符号截断

    我编写了一个按预期工作的函数 但我不明白为什么输出是这样的 功能 datatype prop Atom of string Not of prop And of prop prop Or of prop prop XOR A And Not
  • 权重偏左堆:自上而下版本合并的优点?

    我正在自学 它要求推理并实现一个偏向权重的左堆 这是我的基本实现 3 4 b functor WeightBiasedLeftistHeap Element Ordered Heap struct structure Elem Elemen
  • SML 和函数式编码风格

    我开始学习标准机器学习编程语言 https www coursera org course proglang course 在第一个作业中 我尝试编写一个函数is older需要两个日期并评估为true or false 它评估为true如
  • 标准机器学习语法

    我是标准机器学习的新手 并尝试编写以下代码 fun whilestat test stmt1 fn x gt if test x then stmt1 x whilestat test stmt1 else x 问题是它给了我以下错误 w
  • 有类似 Haskell/ML 的 C 编译器吗?

    People have http jlongster com software iphone scheme iphone example 书面games http www artisancoder com 2009 10 scheme hi
  • 基于 SML 的文件查找

    有没有办法使用 SML Basis 库在特定位置打开文件 也就是说 使用操作系统调用来更改位置 而不是扫描文件并丢弃数据 这很棘手 不幸的是 不直接支持搜索 此外 文件位置仅对于二进制文件是透明的 即您使用BinIO结构 1 对于该结构体
  • 如何在SML中使用IntInf或LargeInt?

    我想通过此链接中的 pow 等函数在 SML 中执行大整数计算 http www standardml org Basis int inf html IntInf STR SPEC http www standardml org Basis
  • 这种模式似乎很详尽,但我仍然收到警告

    我正在学习 sml 并编写了以下简单函数 Return a list with every other element of the input list fun everyOther everyOther x x everyOther x
  • SML 中的 'a 和 ''a 有什么区别?

    例如 fun example a a list list a 将有以下签名 a list gt a list 如果我定义不同但内容相同怎么办 例如 fun example a a list list a 它的签名是 a list gt a
  • 解决 SML/NJ 编译管理器中的库冲突

    我正在使用 SML NJ 110 79 其中包括对 Successor ML 项目定义的新结构的支持 其中 Fn https github com SMLFamily BasisLibrary wiki 2015 005 Addition
  • 在 Trie 中插入值

    我在 SML 目录中找到了 Trie 的实现 signature DICT sig type key string concrete type type a entry key a concrete type type a dict abs
  • number_in_month 练习(计算列表中的元素数)

    我一直在尝试使用 SML 对整数 3 元组列表中的元素进行计数 该列表等于给定的整数 但它不起作用 谁能帮我找出下面的代码有什么问题或者为我纠正它 fun number in month x int int int list m int i

随机推荐

  • 如何从同一个类中的静态函数调用公共事件?

    我有一个类 其中包含另一个类的 ObservableCollection 如果类成员之一发生更改 我希望收到通知 因为我需要在 MediaCollection 类中进行一些计算 所以我向该类添加了一个事件 public event Prop
  • 处理大文件或多个文件时 file_put_contents 太慢

    我在用文件放置内容创建视频文件 问题是速度和性能 创建平均大小为 50 mb 的文件平均需要大约 30 到 60 分钟 而且这还只是一个文件 我正在解码字节数组以创建文件 如何提高速度和性能 json str file get conten
  • Unity 3 按约定配置未在 Web 项目中找到类型

    我正在尝试使此约定配置正常工作 但我的 ASP NET MVC5 项目遇到问题 我在 Application Start 方法中添加了以下内容并将其连接到 DependencyResolver public static IUnityCon
  • 在使用 Java 8 重新协商 TLS_1.2 期间,服务器证书更改受到限制

    我对 SSL 还很陌生 并且遇到了一些看似已知的问题 我的应用程序是 SSL 客户端 并调用另一个启用双向 SSL 的组件 两个组件中的证书都是正确的 并且连接有时工作正常 每个服务器都有自己的服务器证书和私钥 但根证书和中间证书相同 服务
  • 如何迭代每隔一个数字

    阅读文档时 我注意到一句话 Rust 没有C stylefor 循环 所以 我想知道 如何制作一个相当于for i 0 i lt 10 i 2 我能想到的方法是这样的 for i in 0 10 if i 2 0 Do stuff Or e
  • 如何获取2d dict python中的所有键

    我有一本形式词典 d 123 2 1 3 1 124 3 1 125 2 1 126 1 1 那么 让我们看看二阶键 123 gt 2 3 124 gt 3 125 gt 2 126 gt 1 所以唯一的二阶键的总数是 1 2 3 现在 我
  • 在 Flash 对象上方显示图像

    我在这里面临着一个棘手的情况 这就是问题 我有一个 Flash 对象 我想在其上显示图像这些是我尝试过的技巧 1 玩转z index 没用 2 将wmode参数设置为透明 不透明 同样没有用 3 使用javascript并仅在页面加载后显示
  • 没有这样的模块“RestKit”与 cocoapods 和 swift

    我在一个全新的项目中遇到了这个问题 RestKit 和 Facebook SDK 都会出现此问题 奇怪的是 SwiftyJSON 工作得很好 我创建了一个全新的 swift 项目和一个 Podfile 其中包含 source https g
  • 当 CURLOPT_HTTPHEADER 需要“Content-Length”时

    我的应用程序的客户端中有此代码 ch curl init url curl setopt ch CURLOPT CUSTOMREQUEST GET curl setopt ch CURLOPT RETURNTRANSFER true cur
  • Ruby on Rails 过滤返回模型对象的属性

    我正在为 Rails 应用程序创建 API 我想返回User用于 API 调用但没有的对象crypted password salt or login token属性 有没有办法做这样的事情 do api fetch user u user
  • 命名空间 + 函数与类上的静态方法

    假设我已经或将要编写一组相关函数 假设它们与数学相关 从组织上来说 我应该 编写这些函数并将它们放入我的MyMath命名空间并通过引用它们MyMath XYZ 创建一个名为MyMath并使这些方法静态并引用类似的MyMath XYZ 为什么
  • iOS-示例中的协议和委托

    好吧 我正在寻找 但没有任何方法对我有用 以下代码基于许多教程和苹果文档 但我无法让它工作 有人可以帮忙吗 代码崩溃于 obj delegatee self 在 B h 类中 respondsToSelector 和 PerformSele
  • 尝试使用工作台将 postgresql 数据库迁移到 mysql 时出错

    我正在尝试按照本教程将 postgresql 数据库迁移到 mysql http mysqlworkbench org 2012 11 how to migrate postgresql databases to mysql using t
  • Healpy python-3..4 在 ubuntu-14.04 上的安装问题

    我是 ubuntu 新手 在 lenovo t410 上使用 ubuntu 14 04 和 python 3 4 为了安装 Healpy 我遵循了以下步骤 我已经使用安装了 python3 dev 包 sudo apt get instal
  • Visual Studio Code / powershell 命令历史记录向上键

    我可以通过什么方式在 Visual Studio Code 中记录之前输入的命令 例如 当我按下向上键时 我可以向上浏览之前的所有命令 如果可能的话 我想将这些记录到文件中 它们本地存储在哪里 我可以用节点之类的东西记录它吗 实际上 我自己
  • 在页面显示到屏幕之前删除 DOM 元素(在 Chrome 扩展中)

    我正在尝试创建一个扩展 该扩展将在页面显示到屏幕上之前删除某些页面元素 按 id 或类 我尝试在文档上使用事件侦听器 以 DOMContentLoaded 作为事件 但 javascript 似乎在页面显示给用户后执行 然后删除它 所以它不
  • 基于 Django 类的视图和表单集

    我有一个基于类的视图称为OrganizationsCreateView它包括附加到模型表单的表单集作为该表单的实例变量 当用户输入数据时 这可以正常工作 可以很好地创建一个新对象 当用户想要向表单集中添加其他行时 我有一个提交按钮 可以触发
  • iOS glGenerateMipmap 是同步的,还是可能是异步的?

    我正在开发一个在 OpenGL ES 中使用大纹理的 iPad 应用程序 当场景首次加载时 我在天花板上看到了几帧的大型黑色伪像 如下图所示 就好像更高级别的 mipmap 尚未填充 在后续帧中 天花板正确显示 当我开始使用 mipmapp
  • 如何使用 mongocxx c++ 驱动程序递归生成 Mongodb 文档?

    如何使用 mongocxx c 驱动程序递归生成 Mongodb 文档 1 我使用 mongocxx c 驱动程序 v 3 和 c 11 2 这是我的 main cpp 方法 它解析十六进制字符串并生成 mongocxx 代码 如下所示 控
  • 在 Trie 中插入值

    我在 SML 目录中找到了 Trie 的实现 signature DICT sig type key string concrete type type a entry key a concrete type type a dict abs