我有一些具有以下属性的对象(目前为20 000 +)
Object
----------
String name
int rating
我想为所有这些对象创建ELO评级。这意味着以下内容:
要调整彼此匹配的2个对象的ELO,我需要在name
列表中找到这些对象。
显示列表我需要按rating
订购每个对象。
整个程序将用Java实现,但我认为它独立于编程语言。
目前我不确定为此项目选择哪种数据模型。一位朋友建议我使用2-4树来插入name
排序的对象,这样我就可以快速更改每个对象的等级。
然而,对象按照rating
而不是按名称的顺序打印,我不想在每次输出列表时对这么多对象进行排序。
由于我对数据结构很陌生:解决这个问题的常用方法是什么?
创建由rating
排序的另一棵树?
有一个ratings
列表,每个评级都链接到当前具有该评级的每个对象?
编辑:ELO评级是从一组对象到整数的映射。每个对象只获得一个评级,但评级可以有多个与之关联的对象。
答案 0 :(得分:0)
创建按评级排序的另一棵树?有一个评级列表和每个评级链接到目前具有该评级的每个对象?
嗯,这是一种方法,但是因为你有20K +条目,所以也会占用很大的空间。
我现在能想到的最好方法是:
使用multimap与key
= name
和value
= ratings
等数据结构。
这样,每次在multimap中插入新的object
时,都需要O(logN)时间。
要查找具有相同name
使用equal_range的所有评分,这也是O(logN)操作。
希望这有帮助!
答案 1 :(得分:0)
以{8}作为键的HashMap
会在匹配元素时为您提供O(1)效果,保持TreeSet
的评分为Comparator
,您将拥有该项目订购。虽然如果评级发生变化,您将需要重新插入元素。