鉴于我有一个单词的文件:
1)如果我选择一个哈希表来存储单词 - >算一下,找到特定单词出现的时间复杂度是什么?
2)我怎样才能按字母顺序返回这些词?
如果我选择了哈希表,我知道1)的时间复杂度将是O(n)来解析所有单词而O(1)来得到特定单词的计数。
我没有看到如何订购哈希表以及时间复杂度是多少。有什么帮助吗?
答案 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中单词的排序列表。