【问题标题】:Haskell trie functions - Inserting values and searchingHaskell tr​​ie 函数 - 插入值和搜索
【发布时间】:2011-11-03 23:36:47
【问题描述】:

trie的类型是

data Trie a = TrieNode (Maybe a) [(Char, Trie a)]
deriving Show

我想编写一个接收键值对和前缀树的函数。 然后我希望它返回包含键值对的符号表。如果键已存在,则新值应替换旧值。

例子:

trieInsert ("abc",10) emptyTrie == 
    TrieNode Nothing [
        ('a', TrieNode Nothing [
            ('b', TrieNode Nothing [
                ('c', TrieNode (Just 10) [])])])]

我还希望能够在 trie 中搜索并找到以某个前缀开头的键。 示例:

findTrie "c" oneTrie -> ["at","in"]
findTrie "ca" oneTrie -> ["z","r"]

【问题讨论】:

  • Tree 和 Trie 是不同的数据结构。您可以编辑帖子以便不使用 trie 而不是树,反之亦然?这是作业吗?如果是 - 添加作业标签
  • 请注意,您的示例是错误的:findTrie "c" 的结果必须包含findTrie "ca" 的结果。所以第一行应该是findTrie "c" oneTrie -> ["at", "in", "z", "r"]

标签: search haskell prefix trie


【解决方案1】:

除非你正在寻求家庭作业方面的帮助,否则有许多不同的 hackage 尝试实现方式:

http://hackage.haskell.org/packages/archive/pkg-list.html(在那里搜索“trie”)

尝试需要大量代码来实现,所以不要指望这里的人提供完整的实现——我们只能提供一些线索。因此,我们需要知道您面临哪些问题,以便我们帮助您继续前进。

一般提示是使用 where 开始自上而下的开发,解构参数并使用 undefined 代替尚未开发的部分:

第 1 步:

trieInsert (keyH : keyT) value (TrieNode oldValue oldChars) = undefined

第 2 步:

然后想想一些最简单的“基本”案例:

trieInsert [] value (TrieNode _ oldChildren) = TrieNode (Just value) oldChildren
trieInsert (keyH : keyT) value (TrieNode oldValue oldChars) = undefined

在这个例子中,第一行是“如果我们添加一个空键,那么这个值必须在根节点被替换,并且子节点必须保持原样”。第二行写着:'如果我们添加一个非空键,那么......'

第 3 步:

trieInsert [] value (TrieNode _ oldChildren) = TrieNode (Just value) oldChildren
trieInsert (keyH : keyT) value (TrieNode oldValue oldChars) = TrieNode oldValue newChildren where 
    newChildren = undefined

第二行现在显示:“如果我们添加一个非空键,那么我们将 oldValue 保持原样并以某种方式修改孩子”。

然后在第 4 步详细说明 newChildren 等等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-05
    • 1970-01-01
    • 2015-02-14
    • 2013-06-04
    • 2014-03-29
    • 2021-08-27
    • 2014-02-01
    • 1970-01-01
    相关资源
    最近更新 更多