我使用了一种简单的方法来解决这个问题,我将单词放在一个链表中,然后对其进行线性搜索。但它在大文件中占用了太多时间。
我在考虑使用二进制搜索树,但我不知道它是否适用于字符串。我也听说过跳过列表,但还没有真正学会它。
而且我还必须使用C语言。
发布于 2010-08-23 10:43:13
算法的第一个升级可能是对列表进行排序,因此,您的线性搜索可能会更快(您只能搜索到比您的元素大的一个元素),但这仍然是一个天真的解决方案。
最好的方法是二进制搜索树,更好的是前缀树(或trie,已经在其他答案中提到)。
在K&R的“C编程语言”中,你可以找到你想要的东西的确切例子。“自动引用的数据结构”(6.5)的第一个例子是用于计算字符串中每个单词的出现次数的二进制搜索树。(你不需要计算:P)
其结构类似于:
struct tnode {
char *word;
struct tnode *left;
struct tnode *right;
};在这本书中,你可以看到你想要做的事情的整个例子。
二进制搜索树可以很好地处理任何可以接受订单的数据结构,并且比列表中的线性搜索更好。
对不起,我的英语很差,如果我说错了,请纠正我,我对C :p很不了解。
编辑:我不能给其他答案添加评论,但是我读到了来自OP的评论:“列表没有排序,所以我不能使用二进制搜索”。在链表上使用二进制搜索是无稽之谈。为什么?当对随机元素的访问速度很快时,对分搜索是有效的,比如在数组中。在双向链表中,最差的访问将是n/2。但是,您可以在列表中放置许多指针(访问关键元素),但这是一个糟糕的解决方案。
发布于 2010-08-23 10:09:28
您可以将所有单词放入trie中,然后在处理完整个文件后计算单词数。
发布于 2010-08-23 10:12:44
二进制搜索树可以很好地处理字符串。
如果你不关心单词的排序,你可以只使用哈希表。
https://stackoverflow.com/questions/3544306
复制相似问题