Top K көп кездешүүчү элементтер


Кыйынчылык деңгээли орто
Көп суралган Amazon алма Bloomberg ByteDance Capital One Окшош Facebook Гугл Microsoft Oracle Чөнтөк Gems
согуштук тизме таштанды Hashing Куча

Маселени билдирүү

Жогорудагы K элементтеринде биз ан согуштук тизме nums [], k көп кездешүүчү элементтерди табыңыз.

мисалы,

nums[] = {1, 1, 1, 2, 2, 3}
k = 2
1 2

 

Top K көп кездешүүчү элементтер

nums[] = {1}
k = 1
1

Top K Frequent Elements үчүн жөнөкөй мамиле

  1. Куруу карта берилген массивде өтүү менен элементтин жана жыштыктын.
  2. Картанын жазууларын жыштыктын азайыш тартибине ылайык иреттеңиз.
  3. Сорттолгон картанын биринчи k элементтери жооп берет.

мисал

nums [] = {1, 1, 2, 3, 3, 3, 4} жана k = 2

Элементтердин жана жыштыктын картасын түзүү
карта = {(1, 2), (2, 1), (3, 3), (4, 1)}

Картаны жыштыктын азайган тартибине ылайык иреттеңиз
иреттелген карта = {(3, 3), (1, 2), (2, 1), (4, 1)}

Биринчи k жазуулар жооп берүүгө көмөктөшөт
ans = 3 1

коду

Top K Frequent Elements үчүн Java Code

import java.util.*;

class TopKFrequentElements {
    private static void printKFrequent(int[] nums, int k) {
        // Length of nums array
        int n = nums.length;

        // Build the map from nums array
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            if (map.containsKey(nums[i])) {
                map.put(nums[i], map.get(nums[i]) + 1);
            } else {
                map.put(nums[i], 1);
            }
        }

        // Sort the map, according to decreasing order of frequency and store in a set
        TreeSet<Element> set = new TreeSet<>(new Comparator<Element>() {
            @Override
            public int compare(Element o1, Element o2) {
                return Integer.compare(o2.freq, o1.freq);
            }
        });

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            Element curr = new Element(entry.getKey(), entry.getValue());
            set.add(curr);
        }

        // First k elements of the sorted map contributes to the answer
        int index = 0;
        for (Element element : set) {
            System.out.print(element.value + " ");
            index++;
            if (index == k)
                break;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // Example 1
        int nums[] = new int[]{1, 1, 1, 2, 2, 3};
        int k = 2;

        printKFrequent(nums, k);

        // Example 2
        nums = new int[]{1};
        k = 1;

        printKFrequent(nums, k);
    }

    // class representing a element and value pair
    static class Element {
        int value;
        int freq;

        public Element(int value, int freq) {
            this.value = value;
            this.freq = freq;
        }
    }
}

C ++ коду - Top K Frequent Elements

#include <bits/stdc++.h>
using namespace std;

// structure representing a element and value pair
struct Element {
    int value;
    int freq;
    
    Element(int v, int f) {
        value = v;
        freq = f;
    }
};

// Comparator to sort elements according to decreasing order of frequency
struct ElemetComp {
    bool operator()(const Element &e1, const Element & e2) {
        return (e2.freq < e1.freq);
    }
};

void printKFrequent(int *nums, int k, int n) {
    // Build the map from nums array
    unordered_map<int, int> map;
    for (int i = 0; i < n; i++) {
        if (map.find(nums[i]) == map.end()) {
            map.insert(make_pair(nums[i], 1));
        } else {
            map[nums[i]] = map.find(nums[i])->second + 1;
        }
    }
    
    // Sort the map, according to decreasing order of frequency and store in a set
    set<Element, ElemetComp> set;
    unordered_map<int, int>:: iterator itr;
    for (itr = map.begin(); itr != map.end(); itr++) {
        Element curr(itr->first, itr->second);
        set.insert(curr);
    }
    
    // First k elements of the sorted map contributes to the answer
    int index = 0;
    for (auto it = set.begin(); it != set.end(); it++) {
        cout<<it->value<<" ";
        index++;
        if (index == k)
            break;
    }
    cout<<endl;
}

int main() {
    // Example 1
    int nums[] = {1, 1, 1, 2, 2, 3};
    int k = 2;

    printKFrequent(nums, k, 6);

    // Example 2
    int nums2 = {1};
    k = 1;

    printKFrequent(nums, k, 1);
    
    return 0;
}

Комплекстик анализ

Убакыт татаалдыгы

O (N * журналы (N)), себеби биз картаны колдондук. Карта элементтерди киргизүү үчүн N журналы убакытты талап кылат.

Космостун татаалдыгы

O (N), бул жерге элементтерди ушул мейкиндикке жооп берген картага киргизип жатабыз. N элементин киргизгендиктен, мейкиндиктин татаалдыгы да O (N). Бул жерде N айырмаланган элементтердин санын белгилеген. Эң жаманы, бардык сандар бир-биринен айырмаланып турушу мүмкүн.

Top K Frequent Elements үчүн оптималдуу ыкма

Жакшы ыкма - элементтин жыштыгын жана жыштыгын максималдуу кылып, жыштыкка ылайык, үймөктүн чокусун k жолу алып салуу жооп берет.

  1. Куруу карта берилген массивде өтүү менен элементтин жана жыштыктын.
  2. Куруу макс үймөгү картадагы жыштыкка ылайык.
  3. Үймөктүн үстүнкү бөлүгүн k жолу алып салыңыз, бул жооп болот.

Top K Frequent Elements коду

Java Code

import java.util.*;

class TopKFrequentElements {
    private static void printKFrequent(int[] nums, int k) {
        // Length of nums array
        int n = nums.length;

        // Build the map from nums array
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            if (map.containsKey(nums[i])) {
                map.put(nums[i], map.get(nums[i]) + 1);
            } else {
                map.put(nums[i], 1);
            }
        }

        // Construct a max heap of element and frequency according to frequency
        PriorityQueue<Element> heap = new PriorityQueue<>(new Comparator<Element>() {
            @Override
            public int compare(Element o1, Element o2) {
                return Integer.compare(o2.freq, o1.freq);
            }
        });

        // Build heap
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            heap.add(new Element(entry.getKey(), entry.getValue()));
        }

        // First k elements of heap contributes to the answer
        for (int i = 0; i < k; i++) {
            System.out.print(heap.poll().value + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        // Example 1
        int nums[] = new int[]{1, 1, 1, 2, 2, 3};
        int k = 2;

        printKFrequent(nums, k);

        // Example 2
        nums = new int[]{1};
        k = 1;

        printKFrequent(nums, k);
    }

    // class representing a element and value pair
    static class Element {
        int value;
        int freq;

        public Element(int value, int freq) {
            this.value = value;
            this.freq = freq;
        }
    }
}

C ++ коду

#include <bits/stdc++.h>
using namespace std;

// structure representing a element and value pair
struct Element {
    int value;
    int freq;
    
    Element(int v, int f) {
        value = v;
        freq = f;
    }
};

// Comparator to sort elements according to decreasing order of frequency
struct ElementComp {
    bool operator()(const Element &e1, const Element & e2) {
        return (e1.freq < e2.freq);
    }
};

void printKFrequent(int *nums, int k, int n) {
    // Build the map from nums array
    unordered_map<int, int> map;
    for (int i = 0; i < n; i++) {
        if (map.find(nums[i]) == map.end()) {
            map.insert(make_pair(nums[i], 1));
        } else {
            map[nums[i]] = map.find(nums[i])->second + 1;
        }
    }
    
    // Construct a max heap of element and frequency according to frequency
    priority_queue<Element, vector<Element>, ElementComp> heap;
    for (auto itr = map.begin(); itr != map.end(); itr++) {
        Element element(itr->first, itr->second);
        heap.push(element);
    }
    
    // First k elements of heap contributes to the answer
    for (int i = 0; i < k; i++) {
        Element curr = heap.top();
        heap.pop();
        cout<<curr.value<<" ";
    }
    cout<<endl;
}

int main() {
    // Example 1
    int nums[] = {1, 1, 1, 2, 2, 3};
    int k = 2;

    printKFrequent(nums, k, 6);

    // Example 2
    int nums2 = {1};
    k = 1;

    printKFrequent(nums, k, 1);
    
    return 0;
}

Комплекстик анализ

Убакыт татаалдыгы

O (k log N + N), бул жерде N - элементтердин саны. Себеби эң начар учурда, киргизилген сандардын бардыгы айырмаланып турушу мүмкүн.
O (log N) коэффициенти элементти максималдуу үймөк же артыкчылыктуу кезекке киргизүү убактысына байланыштуу келет.

Космостун татаалдыгы

O (N), анткени биз N элементтерди эң ​​начар сактайбыз. Космостун татаалдыгы сызыктуу.

шилтемелер