【发布时间】:2012-10-22 17:00:48
【问题描述】:
我希望这个问题足够具体,可以被认为适合 StackOverflow。我检查了常见问题解答,我认为这是合格的,因为它是特定的并且与编程相关。
我正在用 Java 实现一个复杂的数据挖掘算法(FP-growth)。该算法的一些初始阶段要求我扫描一个大型数据库并保持对找到的每个项目类型的运行计数。这似乎非常适合Hashbag 接口。我在 Apache Commons 中找到了一个似乎对我有用。
所以现在,我的 HashBag 充满了 [itemType, count] 条目(对)。稍后在算法中,我需要对这些对执行大量类似列表的操作。在某些情况下,我必须按 itemType 对集合进行排序。在其他情况下,我必须按计数排序。这似乎非常适合List 接口。
我的结论是我必须将我的 Hasbag 转换为列表。然而不知何故,它感觉很脏,就像是在浪费空间和时间。有没有更聪明的方法来做到这一点,或者经常遇到编程问题,您必须在不同的时间以不同的方式处理您的集合,而转换是一种必要的邪恶?
另一种选择是制作我自己的界面,它确实是一个列表,但允许“袋式”添加。每次我想添加一些东西时,我都必须保持列表排序并使用自定义比较器执行二进制搜索。构建该集合可能比构建一个 Hashbag 需要更长的时间,但我会在最后节省转换步骤。关于哪个更可取的想法?
谢谢!
【问题讨论】:
-
回想一下,对集合进行排序已经是一个 O(n log(n)) 操作。复制和排序会使 O(n + n log(n)) = O(n (1 + log(n)) - 不是微不足道的增加,但也不是一个戏剧性的增加。放不同的是,排序已经将集合的每个元素移动到几个不同的内存位置。如果排序本身不会,再次移动(复制)它们可能不会降低性能。
标签: java list collections bag