我有3组项目(名称)。 第1组约有2,1k项,第2组约为7,6k,第3组约为21k。 我需要搜索这些组。 我需要一个更好的提示。我想要把所有的都放在bin树中:
GTree* t = g_tree_new((GCompareFunc)g_ascii_strcasecmp);
and search like this:
goup = g_tree_lookup(t, (gpointer *)itemName);
或者制作3个字符串数组会更有效:
char g1[2300][14];
char g2[8000][14];
char g3[78000][14];
像这样搜索(未选中,伪代码):
int isvalueinarray(char val, char *g[][14];, int size){
int i;
for (i=0; i < size; i++) {
if (memcmp(val, g[i], strlenth) == 0)
return true;
}
return false;
}
int i group=0;
if (isvalueinarray(itemName, g2, 7800) ) group = 2;
if (isvalueinarray(itemName, g1, 2300) ) group = 1;
或者有更好的解决方案吗?
答案 0 :(得分:4)
数学上最快的是将所有内容放在一棵树中并进行O(logN)二进制搜索。因为Log(3N)比3 * Log(N)快。 (N是每个数组的大小)
但是在任何情况下你都不会使用你编写的伪代码进行搜索,你总是在一组庞大的数据中进行二进制搜索。你写的那个有复杂度O(N),而二进制搜索有O(logN)。
答案 1 :(得分:2)
如果您想要最渐进有效的方法来查找字符串是否在一组可以预处理的字符串中,您可以考虑使用a trie。构造时间是线性的(O(L),其中L是三组中所有字符串长度的总和),查找时间与您要查找的字符串大小呈线性关系(在您的情况下) ,14)。
二叉搜索树也是一个不错的选择,为您提供对数(在字符串集大小上)的性能。这可能会慢一点,但可能更容易实现。请注意,预处理(将三个集合中的所有字符串插入树中)需要N * log(N)时间,其中N是设置大小的总和。
不要在数组中使用线性搜索,它太慢了。