【发布时间】:2011-10-07 22:18:07
【问题描述】:
给定一个记录列表,我试图计算每个作者写了多少条记录。显而易见的方法是使用地图,键是作者的姓名,值是递增的计数。但是有没有更有效的方法来做到这一点,而无需每次迭代都进行查找?
如果我事先知道作者,我可以为每个作者创建变量并在不查找的情况下递增它们,然后在完成读取输入后最终创建地图。但是我只知道数据中的几个作者。
提前致谢。
【问题讨论】:
标签: java collections hash map
给定一个记录列表,我试图计算每个作者写了多少条记录。显而易见的方法是使用地图,键是作者的姓名,值是递增的计数。但是有没有更有效的方法来做到这一点,而无需每次迭代都进行查找?
如果我事先知道作者,我可以为每个作者创建变量并在不查找的情况下递增它们,然后在完成读取输入后最终创建地图。但是我只知道数据中的几个作者。
提前致谢。
【问题讨论】:
标签: java collections hash map
您基于作者姓名与计数的映射的解决方案非常好(如果您使用 HashMap,它的总体平均时间复杂度为O(n))。
如果我是你,我会使用这种方法,直到我可以证明它不合适(太慢、使用太多内存等),然后我才会尝试用可以解决出现问题的方法替换它。那一天很可能永远不会到来。
【讨论】:
使用 Java HashMap 进行查找的平均情况是 O(1),这意味着它不会显着增加您的运行时间。
除非您真的试图从中挤出一切,否则您可能只是过度优化。
【讨论】:
如果作者的数量相对于记录的总数较少,哈希查找将是这种情况下最有效的技术。
如果记录已经排序(或者你有某种 btree 索引,它也是排序结构),则可以使用更有效的算法。
【讨论】:
您可能会发现 TObjectIntHashMap 比 HashMap 更有效,但两者都相当有效。您应该能够在几毫秒内扫描 10 万条记录。如果这还不够快,您可以在添加/更新/删除记录时维护一个计数图,以便您只需查找即可。
【讨论】: