Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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 该算法具有二进制搜索和while循环,其时间复杂度是多少?_Java_Algorithm_Time Complexity - Fatal编程技术网

Java 该算法具有二进制搜索和while循环,其时间复杂度是多少?

Java 该算法具有二进制搜索和while循环,其时间复杂度是多少?,java,algorithm,time-complexity,Java,Algorithm,Time Complexity,我试图计算findingDup算法的运行时复杂性,因为我不确定它是O(n)还是O(logn)。我的目标是实现一个次线性算法,找出int值的重复次数。您可以假设给定的数组int[]A总是被排序的。如果您有任何其他问题,请在下面留下 public class Controller { public static void main(String[] args){ int[] A = {-1, 2, 3, 5, 6, 6, 6, 9, 10};

我试图计算findingDup算法的运行时复杂性,因为我不确定它是O(n)还是O(logn)。我的目标是实现一个次线性算法,找出int值的重复次数。您可以假设给定的数组int[]A总是被排序的。如果您有任何其他问题,请在下面留下

public class Controller {
    
    public static void main(String[] args){
        
        int[] A = {-1, 2, 3, 5, 6, 6, 6, 9, 10};
        
        int value = 6;
        
        System.out.println(findingDup(A, value));
        
    }// end main
    
    public static int findingDup(int[] a, int x){
        
        int counter = 0;
        
        int index = binarySearch(a, x); // index = 4 
        
        int leftIndex = index - 1;      // leftIndex = 3
        int rightIndex = index + 1;     // rightIndex = 5
        
        if(index == -1){
            return 0;
        }
        else if(a[index] == x){
            counter++;
        }
        
        // checking if all numbers are dups
        if(a[0] == a[a.length - 1]){
            return a.length;
        }
        
        if(leftIndex >= 0){
            
            while(a[leftIndex] == x){
                counter++;
                leftIndex--;
                
                if(leftIndex < 0){
                    break;
                }
                
            }
            
        }
        
        if(rightIndex <= a.length - 1){
           
            while(a[rightIndex] == x){
                counter++;
                rightIndex++;
                
                if(rightIndex > a.length - 1){
                    break;
                }
                
            }
            
        }
        
        return counter;
        
    }// end method
    
    public static int binarySearch(int[] a, int x){
    
    int low = 0, high = a.length - 1;
    
    while(low <= high){
        
        int mid = (low + high) / 2;
        
        if(a[mid] < x){
            low = mid + 1;
        }
        else if(a[mid] > x){
            high = mid - 1;
        }
        else{
            return mid;
        }
    }
    
    return -1;
    
    }// End Method
    
    
}// end class
公共类控制器{
公共静态void main(字符串[]args){
int[]A={-1,2,3,5,6,6,6,9,10};
int值=6;
System.out.println(findingDup(A,value));
}//端干管
公共静态int findingDup(int[]a,int x){
int计数器=0;
int index=binarySearch(a,x);//index=4
int leftIndex=index-1;//leftIndex=3
int rightIndex=index+1;//rightIndex=5
如果(索引==-1){
返回0;
}
else如果(a[索引]==x){
计数器++;
}
//检查是否所有数字都是重复的
如果(a[0]==a[a.length-1]){
返回a.length;
}
如果(leftIndex>=0){
while(a[leftIndex]==x){
计数器++;
左索引--;
if(leftIndex<0){
打破
}
}
}
如果(右索引a.长度-1){
打破
}
}
}
返回计数器;
}//结束方法
公共静态int二进制搜索(int[]a,int x){
int低=0,高=a。长度-1;
while(低x){
高=中-1;
}
否则{
中途返回;
}
}
返回-1;
}//结束方法
}//末级
您的代码是O(k+logn),其中“k”是值出现在列表中的次数

如果k=O(n),则降解为O(n)

例如,在列表为[6,6,6,6,6,…]的极端情况下,您将处理所有元素

您仍然可以通过运行多个二进制搜索来解决此问题

首先运行它以查找“value”的第一个匹配项,然后再次运行它以查找大于value的第一个数字(搜索value+1)

需要修改二进制搜索算法以返回第一次出现的值,如果找不到该值,则返回更大的值

到目前为止,它发现了任何事件,不能保证是第一次也不能保证是最后一次

您的二进制搜索具有以下条件:

if (smaller) {...}
else if (larger) {...}
else {we have found it!}
所以它可以返回任何事件

您应该寻找以下索引:

a[mid - 1] < value && a[mid] >= value
a[mid-1]=value
mid-1可以小于0,因此需要首先检查该值


如果不是这样,我们还没有找到第一个匹配项,需要向左或向右移动索引。

请详细说明如何再次运行二进制搜索以找到不同的匹配项?我仍然不知道你会怎么做。扩大答案。