BST <string> vs vector <string> + binary search </string> </string>

时间:2011-05-27 22:45:41

标签: c++

找到某些字符串更好(空间/时间):

  1. 使用字符串向量(按字母顺序排列)和二进制搜索。

  2. 使用字符串的BST(也按字母顺序排列)。

  3. 或两者都相似?

2 个答案:

答案 0 :(得分:3)

两者都有优势,并且取决于您的使用场景。

如果您的使用场景可以分为几个阶段,那么排序后的矢量会更有效:加载所有内容,然后对其进行排序,然后查看内容而不更改任何内容。

如果您的方案涉及在不同时间插入,搜索和删除事物,并且您无法将其分解为阶段,则树结构将更适合您。 (在这种情况下,向量可能会增加开销,因为在中间插入是很昂贵的。)

Effective STL中有一个非常好的讨论,Loki中有一个排序的矢量实现。

答案 1 :(得分:3)

假设二进制搜索树是平衡的(如果你使用std :: set则会是这样),那么这两者都是O(n)空间和O(log n)时间。所以理论上它们是可比较的。

在实践中,矢量将占用更少的空间,因此可能由于局部效应而稍微更快。但可能还不够重要,因为std :: set支持O(log n)插入,O(log n)删除,并且有一个简单的接口,我建议使用std :: set。

那说...如果你关心的只是查询而你不需要按顺序枚举字符串,std :: tr1 :: unordered_set(或boost :: unordered_set或C ++ 0x std :: unordered_set)将比任何一个快得多,特别是如果集合很大。哈希表摇滚。