【问题标题】:Which is the better Searching algorithm ??哪个是更好的搜索算法?
【发布时间】:2014-02-06 19:23:23
【问题描述】:

我有 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;

或者有更好的解决方案吗?

【问题讨论】:

  • 您要查找字符串还是子字符串?你想准确搜索什么?
  • 测量,测量,测量。
  • 如果组已排序,您可以使用binary search algorithm,它应该非常快。

标签: c algorithm glib


【解决方案1】:

数学上最快的方法是将所有内容都放在一棵树中并执行 O(logN) 二进制搜索。因为 Log(3N) 比 3 * Log(N) 快。 (N是每个数组的大小)

但在任何情况下,您都不会使用您编写的伪代码进行搜索,您总是在大量数据中进行二进制搜索。你写的复杂度是 O(N),而二分查找复杂度是 O(logN)。

【讨论】:

    【解决方案2】:

    如果您想要最渐近有效的方法来查找一个字符串是否在一组可以预处理的字符串中,您可以考虑使用a trie。构造时间是线性的(O(L),其中 L 是三组中所有字符串长度的总和),查找时间与您正在寻找的字符串的大小成线性关系(在您的情况下, 14).

    二叉搜索树也是一个不错的选择,它为您提供对数(关于字符串集的大小)的性能。这可能会慢一些,但可能更容易实现。请注意,预处理(将三个集合的所有字符串插入树中)需要 N * log(N) 时间,其中 N 是集合大小的总和。

    不要在数组中使用线性搜索,太慢了。

    【讨论】:

    • 非常有趣。你知道 c 中 trie 的任何稳定实现吗?
    • 我用 C 写的不多,一直更喜欢 C++。但是,这是一篇很好的文章,它解释了 trie 是如何工作的,也有一个 C 代码:simplestcodings.blogspot.ch/2012/11/…
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2021-04-29
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2015-12-19
    相关资源
    最近更新 更多