Java 降低时间复杂度
我有一个对象列表,其中包含一个Java 降低时间复杂度,java,enums,hashmap,time-complexity,Java,Enums,Hashmap,Time Complexity,我有一个对象列表,其中包含一个statusEnum。现在,我想返回所有属于特定状态列表的对象 一个简单的解决方案是在对象列表上循环,然后在提供的状态枚举列表上循环另一个for。。。然而,这会起作用,它会使O(n)^2的时间复杂度增加。有没有办法把它减少到O(n) 我不能改变地图。我唯一能想到的另一个解决方案是维护另一个基于StatusEnum作为键的映射,但这样会大大增加空间复杂性 编辑 我有对象的hashMap(我说的是列表) 这是我为其他人设计的代码 public List<MyO
statusEnum
。现在,我想返回所有属于特定状态列表的对象
一个简单的解决方案是在对象列表上循环,然后在提供的状态枚举列表上循环另一个for。。。然而,这会起作用,它会使O(n)^2的时间复杂度增加。有没有办法把它减少到O(n)
我不能改变地图。我唯一能想到的另一个解决方案是维护另一个基于StatusEnum作为键的映射,但这样会大大增加空间复杂性
编辑
- 我有对象的hashMap(我说的是列表)
这是我为其他人设计的代码
public List<MyObjects> getObjectsBasedOnCriteria (List<ObjectStatus> statuses, String secondCriteria){
EnumSet<ObjectStatus> enumSet = EnumSet.copyOf(statuses);
for (Map.Entry<Long, MyObject> objEntry : myObjs.entrySet()){
MyObjects obj = objEntry.getValue();
if (enumSet.contains(obj.getStatus()) && obj.equals(secondCriteria)){
...
}
}
}
public List getObjectsBasedOnCriteria(列表状态、字符串条件){
EnumSet EnumSet=EnumSet.copyOf(状态);
对于(Map.Entry对象:myObjs.entrySet()){
MyObjects obj=objEntry.getValue();
if(enumSet.contains(obj.getStatus())&&obj.equals(secondCriteria)){
...
}
}
}
假设您有一个正常数量的状态,特别是如果您有一个状态枚举,您可以使用枚举集来匹配状态或哈希映射
即使不这样做,时间复杂度也是O(n*m)
其中n
是条目数,m
是要查找的状态数。一般情况下,假设您拥有的记录比您正在检查的状态多得多
由于Java编译方式的限制,可能的枚举值的数量限制为几千,因此这始终是枚举的上限。使用一个集合来保存StatusEnum(可能是一个EnumSet
),并使用Set.contains(object.getStatus())
或其他方法检查每个实例的状态是否在该集合中
EnumSet
和HashSet
中的查找是O(1),因此解决方案是线性的(假设每个对象只有一个状态)EnumSet.contains
比HashSet.contains
具有枚举值更有效;但是,选择与总体时间复杂度无关。使用集合来保存StatusEnum(可能是EnumSet),并使用Set.contains(object.getStatus())
或其他方法检查每个实例的状态是否在该集合中。EnumSet和HashSet中的查找是O(1),因此解决方案是线性的(假设每个对象只有一个状态)。“我无法更改映射”。什么地图?你说了…谢谢。让我看看EnumSet