计算文件中的唯一单词?良好的线性搜索替代?

时间:2010-08-23 02:07:18

标签: c algorithm string search unique

我正在使用一种天真的方法解决这个问题,我将这些单词放在链表中,然后对其进行线性搜索。但它在大文件中花费了太多时间。

我在考虑使用二进制搜索树,但我不知道它是否适用于字符串。还听说过Skip Lists,还没有真正学到它。

而且我还必须使用C语言......

7 个答案:

答案 0 :(得分:5)

您可以将所有单词放入trie,然后在处理完整个文件后计算单词数。

答案 1 :(得分:4)

二进制搜索树可以很好地处理字符串。

如果您不关心按排序顺序排列单词,则可以使用哈希表。

答案 2 :(得分:3)

你在计算文件中唯一单词的数量吗?

为什么不构造一个简单的哈希表?这样,对于列表中的每个单词,将其添加到哈希表中。任何重复都将被丢弃,因为它们已经存在于哈希表中 - 最后,您可以只计算数据结构中的元素数量(通过存储计数器并在每次添加到表时递增它)。

答案 3 :(得分:1)

我将这些单词放在一个链表中,然后对其进行线性搜索。
如果要检查W是否存在,那么您将浏览整个列表,然后它肯定会很长。 O(n ^ 2),其中n是列表的大小。

最简单的方法可能是哈希。你自己很容易实现(不像一些树结构)甚至C应该有一些库。你会得到O(n)的复杂性。

编辑一些C哈希表实现
http://en.wikipedia.org/wiki/Hash_table#Independent_packages

答案 4 :(得分:1)

如果您使用的是UNIX系统,则可以使用bsearch()hsearch()系列函数代替线性搜索。

答案 5 :(得分:1)

对您的算法的第一次升级可能是对列表进行排序,因此,您的直线搜索可能会更快(您只搜索直到找到一个比您更大的元素),但这仍然是一个天真的解决方案。

最好的方法是二进制搜索树,甚至更好的是前缀树(或trie,在其他答案中已经提到过)。

在“C编程语言”中从K& R您可以得到您正在寻找的确切示例。 “自动引用数据结构”(6.5)的第一个例子是二进制搜索树,用于计算字符串中每个单词的出现次数。 (你不需要数:P)

结构是这样的:

struct tnode {
        char *word;
        struct tnode *left;
        struct tnode *right;
};

在本书中,您可以看到您想要做的整个示例。

二进制搜索树适用于任何可接受订单的数据结构,并且优于列表中的直线搜索。

抱歉我的英语很差,如果我说的话我错了,请纠正我,我非常喜欢C:p

编辑:我无法在其他答案中添加评论,但我已经阅读了OP的一篇文章,说“列表没有排序,所以我不能使用二进制搜索”。在链表上使用二进制搜索是无稽之谈。为什么?当对随机元素的访问速度很快时,二进制搜索是有效的,就像在数组中一样。在双链表中,您的最差访问权限将是n / 2.但是,您可以在列表中添加大量指针(访问关键元素),但这是一个糟糕的解决方案..

答案 6 :(得分:1)

如果你需要一些简单易用的东西,那么man tsearch用于简单的二叉搜索树。但这是纯二进制搜索树,不平衡。

根据唯一单词的数量,普通C数组+ realloc()+ qsort() + bsearch()也可能是一个选项。这就是我在普通便携式C中需要简单快速线性搜索时使用的。(否则,如果可能,我选择C ++和std :: map / std :: set。)

更高级的选项通常是特定于平台的(例如Linux上的glib)。

P.S。另一个非常容易实现的结构是hash。字符串效率较低但很容易实现。通过在问题上投入记忆,可以非常迅速地快速制造。