减少时间复杂性

时间:2016-02-08 15:45:24

标签: java enums hashmap time-complexity

我有包含statusEnum的对象列表。现在,我想返回属于特定提供状态列表的所有对象。

一个简单的解决方案是在对象列表上循环,然后在statusEnums提供的列表上循环另一个for循环...但是这会起作用,它会使O(n)^ 2的时间复杂度。有没有办法可以将它减少到O(n)?

我无法更改地图。我能想到的唯一其他解决方案是维护基于statusEnums的另一个映射作为键,但这会大大增加空间复杂度。

修改

  • 我有对象的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)){
        ...
        }
    }
}

2 个答案:

答案 0 :(得分:2)

使用Set来保存statusEnums(可能是EnumSet),并使用set.contains(object.getStatus())或其他任何内容检查每个实例的状态是否在该集合中。

EnumSetHashSet中的查找是O(1),因此解决方案是线性的(假设每个对象只有一个状态)。 EnumSet.contains比枚举值HashSet.contains效率更高;但是,选择与总体时间复杂度无关。

答案 1 :(得分:0)

假设你有一些合理的状态,例如,如果你有一个状态枚举,你可以使用EnumSet来匹配状态或HashMap。

即使您不这样做,时间复杂度为O(n * m),其中n是条目数,m如果您要查找的状态数。通常,假设您将拥有比您正在检查的状态更多的记录。

由于Java编译方式的限制,可能的枚举值的数量限制为几千,因此这始终是枚举的上限。