java - 搜索数字在排序数组中出现次数的最有效方法

标签 java arrays

我正在寻找一种有效的方法来查找特定数字在排序数组中出现的次数。

我当前的代码:

public class Numbers {

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

最佳答案

由于数组是排序的,如注释中所述,您可以执行 2 个二进制搜索以找到数组中出现数字的最低索引和出现数字的最高索引。添加二进制搜索以查找一些 索引,您将获得 O(log n) 算法。

用一些不同的数组值尝试这段代码。

public static void main(final String[] args) {
    final int numberToCount = 7;

    final int[] x = new int[]{1,2,3,4,4,6,6,6,6,7,7,7,7,7,8,8,8,8,8,8};

    final int indexOfKnownOccurence = Arrays.binarySearch(x, numberToCount);
    if (indexOfKnownOccurence < 0) {
        System.out.println("No instances of the number found");
        return;
    }

    final int lowerBound = findIndexOfFirstOccurence(x, numberToCount, 0, indexOfKnownOccurence);

    final int upperBound = findIndexOfLastOccurence(x, numberToCount, indexOfKnownOccurence, x.length - 1);

    System.out.println("Lower bound: " + lowerBound);
    System.out.println("Upper bound: " + upperBound);
    System.out.println("Number of occurrences: " + (upperBound - lowerBound + 1));
}

//Binary search for start index
public static int findIndexOfFirstOccurence(final int[] x, final int numberToFind, final int startIndex, final int endIndex) {
    if (startIndex == endIndex) {
        return startIndex;
    } else if (x[startIndex] == numberToFind) {
        return startIndex;
    } else if (startIndex + 1 == endIndex) {
        return endIndex;
    }

    final int midIndex = startIndex + (int)Math.floor((endIndex - startIndex) / 2);

    if (x[midIndex] == numberToFind) {
        return findIndexOfFirstOccurence(x, numberToFind, startIndex, midIndex);
    } else {
        return findIndexOfFirstOccurence(x, numberToFind, midIndex, endIndex);
    }
}

//Binary search for end index
public static int findIndexOfLastOccurence(final int[] x, final int numberToFind, final int startIndex, final int endIndex) {
    if (startIndex == endIndex) {
        return endIndex;
    } else if (x[endIndex] == numberToFind) {
        return endIndex;
    } else if (startIndex + 1 == endIndex) {
        return startIndex;
    }

    final int midIndex = startIndex + (int)Math.floor((endIndex - startIndex) / 2);

    if (x[midIndex] == numberToFind) {
        return findIndexOfLastOccurence(x, numberToFind, midIndex, endIndex);
    } else {
        return findIndexOfLastOccurence(x, numberToFind, startIndex, midIndex);
    }
}

关于java - 搜索数字在排序数组中出现次数的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37731444/

相关文章:

java - 用正则表达式中的路径递归替换正则表达式查找

java - 如何在 java 中对 UDP 数据包进行 ip 欺骗/更改源地址/原始套接字编程?

java - 用java读取带有特殊字符的xml文件

c - 指向数组的指针的表示是什么?

arrays - 浏览器正在输出对象数组。请帮我摆脱这些

python - 如何对 numpy 数组进行排序以找到最小坐标?

java - 更改 Tomcat 默认日志严重性

java - 重新部署war时需要重启tomcat吗?

c - 在 C/C++ 中初始化大小未知的数组

php - 使用 php 从 mysql 表创建基于类别的数组