我有一个基于年龄字段按升序排序的Obj类数组。我需要在O(log(N))时间内找到数组中给定最小和最大年龄的Obj项目数。
我认为我不能使用binarySearch,因为.equals仅在名称和年龄相同时才为真。
这是我到目前为止所做的,但我不确定复杂性是什么。
public class Obj {
private String name;
private int age;
private Obj(String name, int age) {
if (name == null) {
throw new IllegalArgumentException();
}
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean equals(Object o) {
if (!(o instanceof Obj)) {
return false;
}
Obj other = (Obj) o;
return name.equals(other.getName()) && age == other.getAge();
}
public static Obj[] loadFromFile(File f) {
// Loads from file and returns an array of Obj
}
}
public static int getObjCountInRange(Obj[] a, int minAge, int maxAge) {
if(a == null || (minAge < 0 || maxAge < 0) || (minAge > maxAge)) {
throw new IllegalArgumentException();
}
int start = 0;
for(int i = 0; i < a.length; i++) {
if(a[i].getAge() >= minAge) {
start = i;
break;
}
}
int end = 0;
for(int i = a.length -1; i > 0; i--) {
if(a[i].getAge() <= maxAge) {
end = i;
break;
}
}
return (end - start) + 1;
}
答案 0 :(得分:0)
编写比较器并使用比较器对数组进行排序。
然后使用第二个二进制搜索签名,它使用比较器和新的Comparator来查找上限和下限。
如果您没有得到完全匹配,您将得到一个负数,这表示如果找到您的值,将其反转,并且您拥有符合您的值的开头/结尾的位置边界条件。
答案 1 :(得分:0)
这个问题与here相同,我提供了 O(logn)实现。
这个想法是通过范围二进制搜索下限和上限。对于您的示例,所有值都在讨论年龄值。