文件中出现的单词数 - 复杂性?

时间:2013-02-06 16:21:15

标签: algorithm sorting hashtable

鉴于我有一个单词的文件:

1)如果我选择一个哈希表来存储单词 - >算一下,找到特定单词出现的时间复杂度是什么?

2)我怎样才能按字母顺序返回这些词?

如果我选择了哈希表,我知道1)的时间复杂度将是O(n)来解析所有单词而O(1)来得到特定单词的计数。

我没有看到如何订购哈希表以及时间复杂度是多少。有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

可排序的哈希映射本质上变成了二叉树。在java中,您可以看到TreeMap在查找和插入时使用O(log n)实现SortableMap接口。

如果您想获得最佳理论性能,请使用带有O(1)查找和插入的HashMap,然后使用带有O(n)的桶/基数排序进行显示/迭代

实际上,对字符串使用基数排序将比快速排序O(n log n)表现更差。

答案 1 :(得分:0)

您对(1)的分析是正确的。

大多数哈希表实现(我知道)没有隐式排序。

要获取有序列表,您必须对列表进行排序(O(n log n)),列表上的查询将需要O(log n)

理论上你可以定义一个哈希操作和实现,它可以进行排序,但是要使它分布良好(为了使它高效)将是困难的,只是排序会更简单。

如果它是包含大量重复项的文件,最好的想法可能是首先使用散列来消除重复,然后遍历散列表以获取非重复项列表并对其进行排序。

答案 2 :(得分:0)

使用哈希表有两个缺点1-它们不按排序方式存储数据,2 - 哈希值的计算通常很耗时。在最坏的情况下,它们还具有插入/删除/查找的线性复杂性。

我的建议是使用Trie来存储您的文字。其中插入/查找具有保证的O(1)(字数)。对Trie的预订遍历将给出Trie中单词的排序列表。