二进制搜索树与MultiMap

时间:2012-12-11 19:22:00

标签: java data-structures guava binary-search-tree memory-efficient

我必须解决的问题是我必须在树中输入IP地址前缀和与之关联的数据,以便以后查询。我正在从一个文件中读取这些地址,该文件可能包含多达1600万条记录,文件可能有重复,我也必须存储这些文件。

我编写了自己的二叉搜索树,但了解到Java中的TreeMap是使用红黑树实现的,但TreeMap不能包含重复项。

我希望查询花费O(logn)时间。
数据结构需要在Ram中,所以我也不确定我将如何存储1600万个节点。

我想问一下:使用像番石榴这样的库在多地图中插入Ips会不会影响性能?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

使用内置库,经过测试记录并且维护得很好,通常是一种很好的做法。
它还将帮助您了解番石榴的更多信息。一旦你开始使用它“只做一件事”,你很可能会意识到你可以用更多的东西来让你的生活更轻松。

另外,另一种方法是使用TreeMap<Key,List<MyClass>>而不是TreeMap<Key,MyClass>作为Multimap的自定义实现。


关于内存 - 你应该尽量减少你的数据(使用高效的数据结构,不需要“wasty”String,例如存储IP,有更便宜的替代品,利用它们。

另外请注意 - 通过使用virtual memory(实际上对于64位机器 - 它最有可能足够多),操作系统将能够为您提供比您拥有的RAM更多的内存。但是,它很可能效率低于专用于磁盘的DS(例如B+ trees)。


<强>备选方案:
作为TreeMap的替代方案 - 您可能对其他数据结构感兴趣(每种结构都有其优点和缺点):

  • hash table - 在java中实现为HashMap。您的类型将为HashMap<Key,List<Value>>。它允许O(1)个案例查询,但最坏情况可能会衰减到O(n)。它也不允许有效的范围查询
  • trie或更具空间效率的版本 - radix tree。允许O(1)访问每个密钥,但通常的空间效率低于备选方案。使用此方法,您将使用DS实施Map界面,您的类型将为Map<Key,List<Value>>
  • B+ tree,它针对磁盘进行了更优化 - 如果您的数据太大而无法容纳在RAM中。