我有一个关于C++中数百个唯一字符串的列表,我需要检查列表中是否存在一个值,但最好快闪。快速搜索C++中的字符串排序列表
我currenly与使用的std ::串一的hash_set(因为我无法得到它与为const char *工作),像这样:
stdext::hash_set<const std::string> _items;
_items.insert("LONG_NAME_A_WITH_SOMETHING");
_items.insert("LONG_NAME_A_WITH_SOMETHING_ELSE");
_items.insert("SHORTER_NAME");
_items.insert("SHORTER_NAME_SPECIAL");
stdext::hash_set<const std::string>::const_iterator it = _items.find("SHORTER_NAME"));
if(it != _items.end()) {
std::cout << "item exists" << std::endl;
}
有没有人有一个好主意,以便更快搜索方法没有建立一个完整的散列表我自己?
该列表是不会更改的字符串的固定列表。它包含一个受某些bug影响的元素名称列表,并且应该在用新版本打开时即时修复。
我在使用Aho-Corasick之前就已经构建了哈希表,但是我不太愿意添加太多的复杂性。
我很惊讶的答案的数量。最后,我测试了几种方法,结果使用了kirkus和Rob K.的答案。我之前尝试过二分搜索,但我想我有一个小错误实现它(有多难......)。
结果令人震惊...我以为我有一个快速实现使用hash_set ......好吧,结果我没有。下面是一些统计数据(和最终码):
现有5个按键和一个不存在的键的随机查找,50.000倍
我原来的算法,平均需18,62秒
平均检索时间平均为2,49秒
二分查找平均需要0,92秒。
使用gperf生成的完美hashtable进行搜索,平均需要0,51秒。
这是我现在使用的代码:
bool searchWithBinaryLookup(const std::string& strKey) {
static const char arrItems[][NUM_ITEMS] = { /* list of items */ };
/* Binary lookup */
int low, mid, high;
low = 0;
high = NUM_ITEMS;
while(low < high) {
mid = (low + high)/2;
if(arrAffectedSymbols[mid] > strKey) {
high = mid - 1;
}
else if(arrAffectedSymbols[mid] < strKey) {
low = mid + 1;
}
else {
return true;
}
}
return false;
}
注:这是微软VC++所以我不使用从SGI在std ::的hash_set。
我做了一些测试今天上午的gperf使用作为VardhanDotNet建议,这是相当快一点确实如此。
嗯...我想我目前的实现速度够快,但是我会给gperf一个尝试,只是为了体验和比较材料。 – Huppie 2009-01-27 07:30:51