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 0000000000000000000000000000000000000000..154d7e456778c1bcfba1519b95a8d8ab86a6a383 --- /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 0000000000000000000000000000000000000000..154d7e456778c1bcfba1519b95a8d8ab86a6a383 --- /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 0000000000000000000000000000000000000000..c117d6e4ad9bf6eb36de580ba099e33c39511dbc --- /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 0000000000000000000000000000000000000000..09942be220af3fcc8f3d4aca6a6f0e90fd9989c6 --- /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 0000000000000000000000000000000000000000..6d56d6df11122c0e525def5d0d0ebe55ebbc1114 --- /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); + } +}