Java 在排序数组中查找属性介于范围之间的项?
我有一个基于年龄字段按升序排序的Obj类数组。我需要在O(log(N))时间内找到数组中具有给定最小和最大年龄的Obj项的数量 我认为我不能使用binarySearch,因为只有当姓名和年龄相同时,.equals才是真的 这就是我到目前为止所做的,但我不确定复杂性是什么Java 在排序数组中查找属性介于范围之间的项?,java,sorting,search,Java,Sorting,Search,我有一个基于年龄字段按升序排序的Obj类数组。我需要在O(log(N))时间内找到数组中具有给定最小和最大年龄的Obj项的数量 我认为我不能使用binarySearch,因为只有当姓名和年龄相同时,.equals才是真的 这就是我到目前为止所做的,但我不确定复杂性是什么 public class Obj { private String name; private int age; private Obj(String name, int age) {
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;
}
公共类Obj{
私有字符串名称;
私人互联网;
私有对象(字符串名称,整数){
if(name==null){
抛出新的IllegalArgumentException();
}
this.name=名称;
这个。年龄=年龄;
}
公共字符串getName(){
返回名称;
}
公共整数getAge(){
回归年龄;
}
公共布尔等于(对象o){
如果(!(o Obj实例)){
返回false;
}
Obj其他=(Obj)o;
返回name.equals(other.getName())和&age==other.getAge();
}
公共静态对象[]loadFromFile(文件f){
//从文件加载并返回Obj数组
}
}
公共静态int getObjCountInRange(Obj[]a,int minAge,int maxAge){
如果(a==null | | | | | maxAge<0)| |(minAge>maxAge)){
抛出新的IllegalArgumentException();
}
int start=0;
for(int i=0;i=minAge){
开始=i;
打破
}
}
int end=0;
对于(int i=a.length-1;i>0;i--){
if(a[i].getAge()编写一个比较器,并使用比较器对数组进行排序
然后使用第二个二进制搜索签名,该签名将比较器与新的比较器结合使用,以查找上界和下界
如果没有得到精确的匹配,则会得到一个负数,这表示如果找到值,将其反转,然后得到满足边界条件的值的开始/结束位置。这个问题与我给出的O(logn)实现相同
这个想法是通过对下限和上限进行范围二进制搜索。例如,所有值都在谈论年龄值。那么问题出在哪里?@Aashray我认为OP需要帮助编写一个算法,在排序数组中,在O(Log n)中查找两点之间的值时间复杂性。没有什么可以阻止您查看Collections.binarySearch后面的代码,复制它并修改它以按字段进行比较……您真正需要的是使用minAge(O(log(N))查找值,使用maxAge(O(log(N))再次查找值)然后它们之间的值的子集就是你的结果威尔,我特别需要O(logn),但我不确定我的解决方案的复杂度。@Jack 0你当前的代码从一开始就扫描所有数组元素以获得第一个匹配,然后从结尾开始扫描所有元素以获得最后一个匹配-这就是O(n)因为在最坏的情况下,你会扫描整个集合。二进制搜索会跳到每个范围的中间,然后决定从哪里开始。我不确定它是否已经按照我们用来识别边界条件的字段进行了排序。如果它已经按照该字段进行了排序,则不排序,这将是多余的。