有效排序的数据结构,支持重复键

时间:2012-01-11 12:48:53

标签: java sorting data-structures tree duplicates

我正在寻找一种有效插入对象的数据结构。我想根据特定变量的值(在本例中为适应度)来命令这些对象(在本例中为个体)。

数据结构应允许重复键,因为特定的适应值可能出现在不同的个体中。这是一个问题,因为例如TreeMap数据结构不允许重复键。我更喜欢使用这种类型的树状结构,因为它的效率为O(log N)。

如果我将个体插入有序列表中,效率将降至O(n),并且在插入个体后对其进行排序也不会非常有效。

是否存在高效的数据结构,保持个人订购并支持重复密钥?

我将在创建数据结构后经常添加和删除条目,因此在创建结构后对对象进行排序将非常昂贵。

4 个答案:

答案 0 :(得分:8)

Apache CommonsGuava都支持多重映射,这正是您所需要的。

或者,根据您的用例,您可以在ArrayList中收集元素,然后在O( n lg n )总时间内对其进行排序。

或者,您可以定义一个比较,如果拟合度相等,则首先检查适应度和项目的其他区别属性。

答案 1 :(得分:3)

在经典计算机科学中,您正在寻找的数据结构称为Priority Queue

从Java 1.5开始,标准java类库就有了一个实现:java.util.PriorityQueue

我会用它。

答案 2 :(得分:1)

如果你想使用常规TreeMap,你可以使它存储值包装器而不是值本身。然后,这些包装器将使用相同的密钥存储多个。

否则,您可以使用基于二叉搜索树的某种排序列表结构。我刚刚写了一篇文章,可以在这里找到:http://www.scottlogic.co.uk/2010/12/sorted_lists_in_java/但我确信存在更多的标准实现。这种结构的优点是contains(Object)方法在时间对数而不是线性时间内运行。

答案 3 :(得分:0)

如果您只关注所有个人的订单,并且之后不添加任何新个人,那么排序ArrayList可能是最快的选择。

否则,您可以使用TreeSet,并使用比较器首先按适应性进行比较,然后按identity hash code进行比较,如果拟合度相等(或通过任何其他不同的属性)。因此,您的所有对象都会有所不同,但它们将按健康状态进行排序。