我正在寻找一种有效插入对象的数据结构。我想根据特定变量的值(在本例中为适应度)来命令这些对象(在本例中为个体)。
数据结构应允许重复键,因为特定的适应值可能出现在不同的个体中。这是一个问题,因为例如TreeMap数据结构不允许重复键。我更喜欢使用这种类型的树状结构,因为它的效率为O(log N)。
如果我将个体插入有序列表中,效率将降至O(n),并且在插入个体后对其进行排序也不会非常有效。
是否存在高效的数据结构,保持个人订购并支持重复密钥?
我将在创建数据结构后经常添加和删除条目,因此在创建结构后对对象进行排序将非常昂贵。
答案 0 :(得分:8)
Apache Commons和Guava都支持多重映射,这正是您所需要的。
或者,根据您的用例,您可以在ArrayList
中收集元素,然后在O( n lg n )总时间内对其进行排序。
或者,您可以定义一个比较,如果拟合度相等,则首先检查适应度和项目的其他区别属性。
答案 1 :(得分:3)
答案 2 :(得分:1)
如果你想使用常规TreeMap
,你可以使它存储值包装器而不是值本身。然后,这些包装器将使用相同的密钥存储多个。
否则,您可以使用基于二叉搜索树的某种排序列表结构。我刚刚写了一篇文章,可以在这里找到:http://www.scottlogic.co.uk/2010/12/sorted_lists_in_java/但我确信存在更多的标准实现。这种结构的优点是contains(Object)
方法在时间对数而不是线性时间内运行。
答案 3 :(得分:0)
如果您只关注所有个人的订单,并且之后不添加任何新个人,那么排序ArrayList可能是最快的选择。
否则,您可以使用TreeSet,并使用比较器首先按适应性进行比较,然后按identity hash code进行比较,如果拟合度相等(或通过任何其他不同的属性)。因此,您的所有对象都会有所不同,但它们将按健康状态进行排序。