나이 필드를 기준으로 오름차순으로 정렬 된 Obj 클래스의 배열이 있습니다. O (log (N)) 시간에 배열의 주어진 최소 및 최대 나이 내에 나이가있는 Obj 항목의 수를 찾아야합니다.범위 사이의 속성을 사용하여 정렬 된 배열에서 항목을 찾으십니까?
.equals는 이름과 나이가 같을 때만 true이기 때문에 binarySearch를 사용할 수 있다고는 생각하지 않습니다.
이것은 내가 지금까지 해 온 것입니다. 그러나 나는 그 복잡성이 무엇인지 잘 모릅니다.
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;
}
그래서 뭐가 문제 야? – Aashray
@Aashray O (Log n) 시간 복잡도의 정렬 된 배열에서 두 지점 사이의 값을 찾을 알고리즘을 작성하는 데 OP가 도움이 필요하다고 생각합니다. – christopher
당신이 코드를 바라 보는 것을 막을 수있는 아무것도 Collections.binarySearch가 아니고 복사해서 필드와 비교하도록 수정하는 것 ... 정말 필요한 것은 minAge (O (log (N))로 값을 찾는 것입니다. maxAge (O (log (N) again)와 값 사이의 값의 부분 집합이 결과입니다. – radai