java - 在 Java 的输入数组中,如何找到相等值对的数量?

标签 java arrays variables time cumulative-sum

我正在尝试制作一个 O(nlogn) 算法来确定对数 输入数组中相等的值。我想做的是将数组的每个值存储在另一个变量中,并继续将当前值与以前的值进行比较,看看是否匹配,如果匹配,则计数器加一。

int current value; 
int previous value; 
    for(int j = 0; j < array.length; j++){
        current value = array[k]
        previous value = array[k-1]

令我感到困惑的是运行时间必须为 O(nlogn),所以我想知道这是否是解决此类问题的正确方法,或者是否有更好更方便的方法这样做的方式。

伪代码:

n = array.length
for k - 1 to n do
    if k == k-1 
    then
increment counter by 1

最佳答案

您可以对数组进行排序并比较相邻值,这是一种选择。那么你的复杂度将是 O(n*log(n))

另一种选择是使用临时 HashSet 和结果 HashMap 作为对的计数器来跟踪已经访问过的元素:

public static <T> Map<T, Integer> findPairs(List<T> elements) {
    Set<T> tracked = new HashSet<>();
    Map<T, Integer> result = new HashMap<>();
    for (T element : elements)
        if (!tracked.add(element)) {
            result.merge(element, 1, Math::addExact);
            tracked.remove(element);
        }
    return result;
}

这个方法给你 O(n) 因为 HashSetHashMap 的插入和删除是 O(1) 平均,但在最坏的情况下O(n)。如果在最坏的情况下 O(n*log(n)) 对您来说很重要,您应该选择第一个选项并相应地选择排序算法。一些排序算法的最坏情况复杂度为 O(n2)。

关于java - 在 Java 的输入数组中,如何找到相等值对的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32856908/

相关文章:

Java MD5 哈希,我该怎么办?

c - Domino 程序问题

c++ - 如何在运行时设置数组大小而不构造对象?

java - switch 语句不兼容类型

java - 使用不同的范围访问子类和父类中的相同变量

java - 如何分析 Java Mission Control 中的异常?

c++ - 为什么 C++ 禁止声明无类型的参数?

java - 如何将 int 分配给 String 变量?

php - 每个 parent 有多少个特定项目的 child ?

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP