ყველაზე K ხშირი ელემენტები


Რთული ტური საშუალო
ხშირად ეკითხებიან Amazon Apple Bloomberg ByteDance Capital One eBay Facebook Google microsoft Oracle ჯიბის ძვირფასი ქვები
Array Hash ჰაშინგი ბევრი

პრობლემის განცხადება

ზევით K ხშირი ელემენტები მივეცით მასივი nums [], იპოვნეთ k ყველაზე ხშირად მომხდარი ელემენტები.

მაგალითები

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

 

ყველაზე K ხშირი ელემენტები

nums[] = {1}
k = 1
1

გულუბრყვილო მიდგომა Top K- ის ხშირი ელემენტების მიმართ

  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

კოდი

Java კოდი ყველაზე K ხშირი ელემენტებისათვის

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 ++ კოდი ტოპ K– ის ხშირი ელემენტებისათვის

#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– ის ხშირი ელემენტებისათვის

უკეთესი მიდგომაა ელემენტისა და სიხშირის მაქსიმალური გროვა, სიხშირის მიხედვით, k ზედიდან მეტის ამოღება იძლევა პასუხს.

  1. აშენების რუკა ელემენტისა და სიხშირის მოცემულ მასივში გადაკვეთის გზით.
  2. აშენების მაქს რუქიდან სიხშირის მიხედვით.
  3. ამოიღეთ ზემოდან ბევრი k ჯერ და ეს არის პასუხი.

კოდი ყველაზე პოპულარული K ელემენტებისთვის

ჯავის კოდი

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 შესვლა N + N), აქ N არის ელემენტების რაოდენობა. რადგან უარეს შემთხვევაში შეყვანის ყველა რიცხვი შეიძლება განსხვავებული იყოს.
O (log N) ფაქტორი მოდის იმის გამო, რომ საჭიროა ელემენტის მაქსიმალური გროვაში ან პრიორიტეტულ რიგში ჩასმა.

სივრცის სირთულე

O (N), რადგან ჩვენ ვინახავთ N ელემენტების იონს უარეს შემთხვევაში. სივრცის სირთულე ხაზოვანია.

ლიტერატურა