我不知道这是否是询问算法的地方。但是让我们看看我是否得到任何答案...... :)
如果有什么不清楚的地方,我很乐意澄清事情。
我刚刚在 python 中实现了一个Trie 。然而,有一点似乎比它应该的更复杂(作为一个喜欢简单的人)。也许有人遇到过类似的问题?
我的目标是通过将子树的最大公共前缀存储在其根中来最小化节点数量。例如,如果我们有单词stackoverflow、stackbase和stackbased,那么树看起来像这样:
[s]tack
[o]verflow ______/ \_______ [b]ase
\___ [d]
请注意,仍然可以认为边缘具有一个字符(子节点的第一个字符)。
Find -query 很容易实现。 插入并不难,但比我想要的要复杂一些.. :(
我的想法是一个接一个地插入键(从一个空的 trie 开始),首先搜索要插入的键 k(Find (k)),然后在本地重新排列/拆分节点查找过程停止。结果有4种情况:(设k是我们要插入的键,k'是节点的键,搜索结束的地方)
- k 与 k' 相同
- k 是 k' 的“正确”前缀
- k' 是 k 的“正确”前缀
- k 和 k' 共享一些共同的前缀,但没有出现 (1)、(2) 或 (3) 的情况。
似乎每个案例都是独一无二的,因此意味着对 Trie 的不同修改。但是:真的那么复杂吗?我错过了什么吗?有更好的方法吗?
谢谢 :)