在 Java 中的输入数组中,如何找到相等值对的数量?
In an input array in Java, how do I find the number of pairs of values that are equal?
我正在尝试制作一个 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)
,因为 HashSet
和 HashMap
的插入和删除平均 O(1)
,但是O(n)
在最坏的情况下。如果在最坏的情况下 O(n*log(n))
对你很重要,你应该 select 第一个选项以及相应的 select 排序算法。一些排序算法的最坏情况复杂度为 O(n2)。
我正在尝试制作一个 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)
,因为 HashSet
和 HashMap
的插入和删除平均 O(1)
,但是O(n)
在最坏的情况下。如果在最坏的情况下 O(n*log(n))
对你很重要,你应该 select 第一个选项以及相应的 select 排序算法。一些排序算法的最坏情况复杂度为 O(n2)。