我正在寻找一个C ++容器类,这很像多图,但略有不同。容器将存储成对的字符串。但是当我使用密钥K从容器中检索项目时,我想找到K以项目自己的密钥开头的所有项目。
E.G。如果我使用键“abcde”,我想找到带有“adc”和“abcde”键的项目,而不是“abcqz”。
或者以伪C ++形式:
multimap2<string, string> myMultiMap;
myMultiMap.insert( pair("abcde", "hello"));
myMultiMap.insert( pair("abc", "Hi"));
myMultiMap.insert( pair("abcqz", "goodbye"));
// prints 2
cout << myMultiMap.count("abcde") << endl;
// prints "hello" and "Hi"
cout << myMultiMap.everything_which_matches("abcde") << endl;
// prints "Hi"
cout << myMultiMap.everything_which_matches("abc") << endl;
// prints "goodbye"
cout << myMultiMap.everything_which_matches("abcqz") << endl;
插入时间不重要,但我需要快速访问这些项目。是否可以通过创建一个特殊的&lt;正常的Multimap来做到这一点。运营商?我的预感是,我需要正常&lt;用于插入的操作符,以及用于检索的特殊操作符。
感谢
雨果
答案 0 :(得分:11)
我建议使用trie。
基本上你有一棵树,每个唯一字符有1个节点。 对于查找和插入,您的算法将为O(m),其中m是字符串的长度。
所以按照你的例子:
"abcde", "hello"
"abc", "Hi"
"abcqz", "goodbye"
然后你会有以下特里:
a
|
b
|
c (c holds data of hi)
/ \
d q
| |
e z (z holds data of goodbye) (e holds data of hello)
要进行查找,只需从根节点(上面未显示的根节点)开始,然后按照输入字符串中的下一个字符进行操作。每次到达具有数据结果的节点时,都会将其作为输出字符串之一包含在内。
所以搜索abcde会给你:“嗨”,“你好”如你所愿。它不会给你“再见”,因为你没有遍历那个结果节点。
答案 1 :(得分:1)
首先,使用std :: multimap,您不能有不同的插入和检索顺序。
其次,任何总排序都不足以达到您的目的,这意味着它不会将您想要的答案集作为间隔呈现。
我要么搜索所有前缀,每次都有一个查找(你可以通过记住下一个较短前缀的长度等来优化它)或者使用Trie(而不是需要更少空间的PATRICIA trie)。