用于查找x在排序数组中出现的次数的高效算法

时间:2016-05-04 09:43:14

标签: java algorithm search

我得到了一个n个整数值和一个整数x的排序数组。查找x出现在此数组中的次数最有效的算法是什么?

我想到二进制搜索,当我到达x然后我左右分开以查看是否有更多的x添加到我的计数中,但我想知道是否有任何其他解决方案。

3 个答案:

答案 0 :(得分:2)

好吧,如果数组中x的出现次数与数组的长度相比可以认为是常量,那么你的二进制搜索方法会给你一个O(log(N)算法,你可以& #39; t做得更好。

但是,例如,如果数组的所有元素都是x,或者一半元素是x,那么算法的第二部分(split left and right to see if there is more x to add to my count)将采用线性时间。

如果使用另外两个二进制搜索来查找数组中第一个x和最后一个x的索引,则可以避免这种情况。你可以这样做,例如,在x-1和x + 1上运行二进制搜索(假设这是一个int数组)。

无论数组中有多少x,这都会给你O(log(N))运行时间。

答案 1 :(得分:0)

它的整数和列表已排序。

使用拆分搜索算法,在索引处拆分:

indexToSplit = (int) x*(an - a1)/n

其中:

x is your integer to find
an is the last integer in the list
a1 is the first integer in the list
n is the size of the list

假设您的列表从最低到最高排序

这是一种启发式,可以优于二进制排序,但取决于列表中整数的均匀分布情况

答案 2 :(得分:-1)

这应该有用。

public class Numbers{

    public static void main(String[] args){
        int[] x = new int[]{1,2,3,4,8,7,6,7,7,7,5};
        int number = 0;
        for (int i = 0; i < x.length; i++){
            if (x[i] == n){
                number++;
            }
        }
        System.out.println(number);
    }

}

x - 数组标题; n - 您提到的x整数。