Как найти k наиболее частые элементы, используя структуру коллекций Java?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как найти k наиболее частые элементы, используя структуру коллекций Java?

Сообщение Anonymous »

У меня есть множество целых чисел, и я должен найти наиболее частые элементы k . Решение в идеале должно работать в o (n log k) сложности времени с использованием коллекций Java. Сортировка всех элементов требует o (n log n) , что неэффективно, когда n большой. Я ищу более оптимизированный подход.
Что я попробовал и что я ожидал hashmap для подсчета частоты каждого элемента. Затем я отсортировал записи, используя collections.sort () , но этот подход работает в O (n log n) , что не является оптимальным. Я исследовал, используя PriorityQueue (MinHeap) или TreeMap , но я борюсь с их правильной реализацией. В частности, я не уверен, как эффективно поддерживать k наиболее частые элементы во время итерации по частоте.

Код: Выделить всё

import java.util.*;

public class KMostFrequent {
public static List topKFrequent(int[] nums, int k) {
Map frequencyMap = new HashMap();
for (int num : nums) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}

List entryList = new ArrayList(frequencyMap.entrySet());
entryList.sort((a, b) -> b.getValue() - a.getValue());  // Sorting in descending order

List result = new ArrayList();
for (int i = 0; i < k; i++) {
result.add(entryList.get(i).getKey());
}
return result;
}

public static void main(String[] args) {
int[] nums = {1, 1, 1, 2, 2, 3};
int k = 2;
System.out.println(topKFrequent(nums, k));  // Expected Output: [1, 2]
}
}
Проблема с этим кодом:
Шаг сортировки (

Код: Выделить всё

entryList.sort()
) принимает o (n log n) , что неэффективно для большого n . Вместо сортировки я считаю, что использование minHeap (приоритет) или treeMap может улучшить производительность.
Кроме того, я искал существование. Решения, но в основном обнаружили подходы к сбору. Sort () , которые не соответствуют желаемой эффективности. Некоторые посты предлагают использовать MinHeap, но я борюсь с поддержанием правильной структуры кучи, итерации по карте.

Подробнее здесь: https://stackoverflow.com/questions/794 ... -framework
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»