Сделай сам: Top K часто встречающихся элементов – изучение нескольких методов на примерах кода

В этой статье блога мы рассмотрим различные методы поиска K самых часто встречающихся элементов в заданном списке или массиве. Проблема состоит в том, чтобы определить K элементов, которые наиболее часто встречаются во входных данных. Мы предоставим примеры кода на Python, Java и C++ для каждого обсуждаемого метода.

Метод 1: использование хеширования

Один из распространенных подходов к решению этой проблемы — использование хеширования. Мы можем создать хеш-таблицу для хранения частоты каждого элемента во входном списке. Затем мы можем отсортировать хеш-таблицу по частоте и вернуть K верхних элементов.

Вот пример реализации на Python:

def top_k_frequent_elements(nums, k):
    frequency = {}
    for num in nums:
        frequency[num] = frequency.get(num, 0) + 1

    sorted_elements = sorted(frequency.items(), key=lambda x: x[1], reverse=True)
    return [element[0] for element in sorted_elements[:k]]

Метод 2: использование сортировки

Другой подход — сортировка входного списка на основе частоты встречаемости каждого элемента. После сортировки мы можем выбрать K верхних элементов.

Вот пример реализации на Java:

import java.util.*;
public class TopKFrequentElements {
    public List<Integer> topKFrequent(int[] nums, int k) {
        Map<Integer, Integer> frequency = new HashMap<>();
        for (int num : nums) {
            frequency.put(num, frequency.getOrDefault(num, 0) + 1);
        }

        List<Map.Entry<Integer, Integer>> sortedElements = new ArrayList<>(frequency.entrySet());
        sortedElements.sort((a, b) -> b.getValue() - a.getValue());

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

        return result;
    }
}

Метод 3: использование кучи

Мы также можем использовать минимальную или максимальную кучу, чтобы эффективно найти K самых частых элементов. Поддерживая кучу размером K, мы можем перебирать элементы и продолжать обновлять кучу на основе частоты подсчета.

Вот пример реализации на C++ с использованием максимальной кучи:

#include <iostream>
#include <queue>
#include <unordered_map>
#include <vector>
std::vector<int> topKFrequent(std::vector<int>& nums, int k) {
    std::unordered_map<int, int> frequency;
    for (int num : nums) {
        frequency[num]++;
    }

    std::priority_queue<std::pair<int, int>> maxHeap;
    for (auto it = frequency.begin(); it != frequency.end(); ++it) {
        maxHeap.push(std::make_pair(it->second, it->first));
        if (maxHeap.size() > k) {
            maxHeap.pop();
        }
    }

    std::vector<int> result;
    while (!maxHeap.empty()) {
        result.push_back(maxHeap.top().second);
        maxHeap.pop();
    }

    return result;
}

В этой статье мы рассмотрели три различных метода поиска K самых частых элементов. Мы обсудили подход хеширования, сортировки и использование кучи. У каждого метода есть свои плюсы и минусы, а выбор зависит от конкретных требований задачи и входных данных.

Понимая эти методы и их реализацию на Python, Java и C++, вы сможете эффективно решить проблему K самых часто встречающихся элементов в своих проектах программирования.