Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 降低时间复杂度_Java_Enums_Hashmap_Time Complexity - Fatal编程技术网

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