From bb924f7c31efa118bf43c5452d682e09db841860 Mon Sep 17 00:00:00 2001 From: mygitf <“940580927@.qq.com> Date: Tue, 15 Dec 2020 20:55:35 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Main.java" | 26 ++++++ .../MaxHeap.java" | 91 +++++++++++++++++++ .../\350\277\233\351\230\266/Main.java" | 26 ++++++ .../\350\277\233\351\230\266/MaxHeap.java" | 91 +++++++++++++++++++ .../PriorityQueue.java" | 35 +++++++ .../\350\277\233\351\230\266/Queue.java" | 7 ++ .../\350\277\233\351\230\266/Solution.java" | 51 +++++++++++ 7 files changed, 327 insertions(+) create mode 100644 "\344\275\234\344\270\232/\345\237\272\347\241\200\345\244\247\351\241\266\345\240\206/Main.java" create mode 100644 "\344\275\234\344\270\232/\345\237\272\347\241\200\345\244\247\351\241\266\345\240\206/MaxHeap.java" create mode 100644 "\344\275\234\344\270\232/\350\277\233\351\230\266/Main.java" create mode 100644 "\344\275\234\344\270\232/\350\277\233\351\230\266/MaxHeap.java" create mode 100644 "\344\275\234\344\270\232/\350\277\233\351\230\266/PriorityQueue.java" create mode 100644 "\344\275\234\344\270\232/\350\277\233\351\230\266/Queue.java" create mode 100644 "\344\275\234\344\270\232/\350\277\233\351\230\266/Solution.java" diff --git "a/\344\275\234\344\270\232/\345\237\272\347\241\200\345\244\247\351\241\266\345\240\206/Main.java" "b/\344\275\234\344\270\232/\345\237\272\347\241\200\345\244\247\351\241\266\345\240\206/Main.java" new file mode 100644 index 0000000..154d7e4 --- /dev/null +++ "b/\344\275\234\344\270\232/\345\237\272\347\241\200\345\244\247\351\241\266\345\240\206/Main.java" @@ -0,0 +1,26 @@ +import java.util.Random; + +public class Main { + public static void main(String[] args) { + int n=10000; + MaxHeap max = new MaxHeap<>(); + Random random = new Random(); + for(int i = 0;i> { + private ArrayList data; + public MaxHeap(){ + data = new ArrayList<>(); + } + public MaxHeap(int capacity){ + data = new ArrayList<>(capacity); + } + public MaxHeap(ArrayList arrayList){ + int index = parent(arrayList.size()-1); + for(int i =index;i>=0;i--){ + siftDown(i); + } + data = arrayList; + } + //·µ»Ø¶ÑÖÐÊý×éÔªËØµÄ¸öÊý + public int size(){ + return data.size(); + } + //Åж϶ÑÖÐÊÇ·ñΪ¿Õ + public boolean isEmpty(){ + return data.isEmpty(); + } + //µÃµ½¸¸½ÚµãµÄË÷ÒýÖµ + public int parent(int index){ + if(index<=0){ + throw new RuntimeException("indexÖµ²»ºÏ·¨"); + } + return (index-1)/2; + } + //µÃµ½×óº¢×Ó + public int leftChild(int index){ + return index*2+1; + } + //µÃµ½ÓÒº¢×Ó + public int rightChild(int index){ + return index*2+2; + } + public void add(E e){ + data.add(e); + siftUp(data.size()-1); + } + private void siftUp(int k) { + while(k>0&&data.get(parent(k)).compareTo(data.get(k))<0){ + swap(data,k,parent(k)); + k = parent(k); + } + } + //È¡³ö¶ÑÖеÄ×î´óÖµ + public E extractMax(){ + E ret = findMax(); + //½»»»¸ùºÍ×îºóÒ»¸öÒ¶×Ó½Úµã + swap(data, 0, data.size()-1); + //ɾ³ý½»»»ºóµÄ¸ù + data.remove(data.size()-1); + siftDown(0); + return ret; + } + private void siftDown(int k) { + while(leftChild(k)0){ + //j = right(k); = j++ + j++; + } + if(data.get(k).compareTo(data.get(j))>=0){ + break; + } + swap(data, k, j); + k =j; + } + + } + public E findMax() { + if(data.size()==0){ + throw new RuntimeException("this is a empth heap"); + } + return data.get(0); + } + //È¡³ö¶ÑµÄ×î´óÔªËØ,²¢Ìæ»»³ÉÔªËØe + public E replace(E e){ + E max = findMax(); + data.add(0,e); + siftDown(0); + return max; + } + } diff --git "a/\344\275\234\344\270\232/\350\277\233\351\230\266/Main.java" "b/\344\275\234\344\270\232/\350\277\233\351\230\266/Main.java" new file mode 100644 index 0000000..154d7e4 --- /dev/null +++ "b/\344\275\234\344\270\232/\350\277\233\351\230\266/Main.java" @@ -0,0 +1,26 @@ +import java.util.Random; + +public class Main { + public static void main(String[] args) { + int n=10000; + MaxHeap max = new MaxHeap<>(); + Random random = new Random(); + for(int i = 0;i> { + private ArrayList data; + public MaxHeap(){ + data = new ArrayList<>(); + } + public MaxHeap(int capacity){ + data = new ArrayList<>(capacity); + } + public MaxHeap(ArrayList arrayList){ + int index = parent(arrayList.size()-1); + for(int i =index;i>=0;i--){ + siftDown(i); + } + data = arrayList; + } + //·µ»Ø¶ÑÖÐÊý×éÔªËØµÄ¸öÊý + public int size(){ + return data.size(); + } + //Åж϶ÑÖÐÊÇ·ñΪ¿Õ + public boolean isEmpty(){ + return data.isEmpty(); + } + //µÃµ½¸¸½ÚµãµÄË÷ÒýÖµ + public int parent(int index){ + if(index<=0){ + throw new RuntimeException("indexÖµ²»ºÏ·¨"); + } + return (index-1)/2; + } + //µÃµ½×óº¢×Ó + public int leftChild(int index){ + return index*2+1; + } + //µÃµ½ÓÒº¢×Ó + public int rightChild(int index){ + return index*2+2; + } + public void add(E e){ + data.add(e); + siftUp(data.size()-1); + } + private void siftUp(int k) { + while(k>0&&data.get(parent(k)).compareTo(data.get(k))<0){ + swap(data,k,parent(k)); + k = parent(k); + } + } + //È¡³ö¶ÑÖеÄ×î´óÖµ + public E extractMax(){ + E ret = findMax(); + //½»»»¸ùºÍ×îºóÒ»¸öÒ¶×Ó½Úµã + swap(data, 0, data.size()-1); + //ɾ³ý½»»»ºóµÄ¸ù + data.remove(data.size()-1); + siftDown(0); + return ret; + } + private void siftDown(int k) { + while(leftChild(k)0){ + //j = right(k); = j++ + j++; + } + if(data.get(k).compareTo(data.get(j))>=0){ + break; + } + swap(data, k, j); + k =j; + } + + } + public E findMax() { + if(data.size()==0){ + throw new RuntimeException("this is a empth heap"); + } + return data.get(0); + } + //È¡³ö¶ÑµÄ×î´óÔªËØ,²¢Ìæ»»³ÉÔªËØe + public E replace(E e){ + E max = findMax(); + data.add(0,e); + siftDown(0); + return max; + } + } diff --git "a/\344\275\234\344\270\232/\350\277\233\351\230\266/PriorityQueue.java" "b/\344\275\234\344\270\232/\350\277\233\351\230\266/PriorityQueue.java" new file mode 100644 index 0000000..c117d6e --- /dev/null +++ "b/\344\275\234\344\270\232/\350\277\233\351\230\266/PriorityQueue.java" @@ -0,0 +1,35 @@ +public class PriorityQueue > implements Queue { + private MaxHeap maxHeap; + public PriorityQueue() { + maxHeap = new MaxHeap<>(); + } + public PriorityQueue(MaxHeap maxHeap){ + this.maxHeap = new MaxHeap<>(); + } + @Override + public void enqueue(E e) { + maxHeap.add(e); + } + + @Override + public E dequeue() { + return maxHeap.extractMax(); + } + + @Override + public E getFront() { + return maxHeap.findMax(); + } + + @Override + public int getSize() { + return maxHeap.size(); + } + + @Override + public boolean isEmpty() { + return maxHeap.isEmpty(); + } + + +} \ No newline at end of file diff --git "a/\344\275\234\344\270\232/\350\277\233\351\230\266/Queue.java" "b/\344\275\234\344\270\232/\350\277\233\351\230\266/Queue.java" new file mode 100644 index 0000000..09942be --- /dev/null +++ "b/\344\275\234\344\270\232/\350\277\233\351\230\266/Queue.java" @@ -0,0 +1,7 @@ +public interface Queue { + void enqueue(E e); + E dequeue(); + E getFront(); + int getSize(); + boolean isEmpty(); +} \ No newline at end of file diff --git "a/\344\275\234\344\270\232/\350\277\233\351\230\266/Solution.java" "b/\344\275\234\344\270\232/\350\277\233\351\230\266/Solution.java" new file mode 100644 index 0000000..6d56d6d --- /dev/null +++ "b/\344\275\234\344\270\232/\350\277\233\351\230\266/Solution.java" @@ -0,0 +1,51 @@ +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +public class Solution { + private static class Freq implements Comparable{ + int e,freq; + public Freq(int e,int freq) { + this.e = e; + this.freq = freq; + } + @Override + public int compareTo(Freq o) { + return o.freq-this.freq; + } + + } + public static void main(String[] args) { + int [] nums = {1,1,1,2,2,3}; + int k = 2; + topKEle(nums,k); + } + //1.ͳ¼ÆÊý×éÿ¸öÔªËØ³öÏֵįµÂÊ + //2.½«ÔªËغͳöÏֵįµÂʼӹ¤³ÉÒ»¸ö¶ÔÏó·ÅÈëµ½ÓÅÏȶÓÁÐÖÐ + //3.»ñÈ¡ÓÅÏȶÓÁÐÖеÄÔªËØ²¢Êä³ö + private static void topKEle(int[] nums, int k) { + Map map = new HashMap<>(); + for(int num:nums){ + if(map.containsKey(num)){ + map.put(num, map.get(num)+1); + }else{ + map.put(num, 1); + } + } + //ÓÅÏȶÓÁÐ + PriorityQueue pq = new PriorityQueue(); + for(int key:map.keySet()){ + if(pq.getSize()pq.getFront().freq){ + pq.dequeue(); + pq.enqueue(new Freq(key,map.get(key))); + } + } + //Êä³ö + ArrayList list = new ArrayList<>(); + while(!pq.isEmpty()){ + list.add(pq.dequeue().e); + } + System.out.println(list); + } +} -- Gitee