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

时间:2015-09-30 02:46:26

标签: java arrays variables time running-total

我正在尝试制作一个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

1 个答案:

答案 0 :(得分:3)

您可以对数组进行排序并比较相邻值,它是一个选项。您的复杂性为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)提供了HashSet,因为HashMapO(1)的插入和删除平均为O(n) ,但O(n*log(n))在最坏的情况下。如果在最坏的情况下让 adr addr, .L.dct_add_switch ldr offset, [addr, ta, lsl #2] add addr, addr, offset, uxtw br addr .L.dct_add_switch: .word .L.dct_add_4 - .L.dct_add_switch .word .L.dst_add_4 - .L.dct_add_switch 变得很重要,您应该选择第一个选项以及相应地选择排序算法。一些排序算法将O(n 2 )作为最坏情况的复杂性。