Haskell tr​​ie函数 - 插入值和搜索

时间:2011-11-03 23:36:47

标签: search haskell prefix trie

特里的类型是

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

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

示例:

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"]

1 个答案:

答案 0 :(得分:2)

除非你正在寻找家庭作业的帮助,否则有很多不同的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等等