Maison >Java >javaDidacticiel >Introduction aux scénarios d'application et aux méthodes d'implémentation du tas Java
Laissez le parent marquer le nœud qui doit être ajusté et l'enfant marque l'enfant gauche du parent (remarque : si le parent a un enfant, il doit d'abord avoir un enfant gauche)
Si l'enfant gauche du parent existe, c'est-à-dire : enfant
Si l'enfant droit du parent existe , trouvez le plus petit enfant parmi les enfants de gauche et de droite, et laissez l'enfant le marquer
Comparez le parent avec l'enfant plus petit, si :
le parent est plus petit que le plus petit enfant, l'ajustement se termine Sinon : échanger le parent avec le plus petit enfant, une fois l'échange terminé, le plus grand élément du parent. Un déplacement vers le bas peut empêcher le sous-arbre de satisfaire les propriétés du tas, il doit donc continuer à être ajusté vers le bas, c'est-à-dire parent = enfant ; enfant = parent*2+1, puis passez à l'étape 2.
public void shiftDown(int[] elem,int parent,int len){ int cur=parent*2+1; while(cur<len){ if(cur+1<len){ if(elem[cur+1]<elem[cur]){ cur++; } } if(this.elem[cur]<this.elem[parent]) { swap(cur, parent); } parent=cur; cur=parent*2+1; } }
Pour une séquence normale, nous devons commencer à ajuster à partir de son premier nœud parent avec un nœud gauche jusqu'à ce que l'arbre entier satisfasse les propriétés d'un tas.
Le tas doit être un arbre binaire complet, et un arbre binaire complet est également un arbre binaire complet. D'après le calcul suivant, la complexité temporelle de la création d'un tas est O(n)
Mettez l'élément à insérer à la fin du tas. tas, S'il ne peut pas être libéré, augmentez la capacité
Ajustez le nœud nouvellement inséré vers le haut jusqu'à ce qu'il réponde aux propriétés du tas
【Ajustement vers le haut】
public void shiftUp(int elem[],int child){ int parent=(child-1)/2; while(parent>=0){ if(elem[child]>elem[parent]){ swap(child,parent); child=parent; parent=(child-1)/2; }else{ break; } } }
class Solution { public int[] smallestK(int[] arr, int k) { int[] array=new int[k]; if(arr==null||arr.length<=k||k==0){ return array; } PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->b-a); int i=0; for(;i<k;++i){ queue.offer(arr[i]); } while(i<arr.length){ if(arr[i]<queue.peek()){ queue.poll(); queue.offer(arr[i]); } i++; } int size=queue.size(); for(int j=0;j<size;++j){ array[j]=queue.poll(); } return array; } }IV. Introduction aux interfaces communes 1 Caractéristiques de PriorityQueue Le framework de collection Java fournit deux types de files d'attente prioritaires, PriorityQueue et PriorityBlockingQueue. PriorityQueue n'est pas sécurisé pour les threads et PriorityBlockingQueue est sécurisé pour les threads. Cet article présente principalement PriorityQueue. [PriorityQueue] Notes d'utilisation :
int newCapacity = oldCapacity + ((oldCapacity (ancienneCapacité + 2) :PriorityQueue utilise deux méthodes : Comparble et Comparator. 1. Comparble est la méthode de comparaison interne par défaut. Si l'utilisateur insère un objet de type personnalisé, l'objet doit implémenter l'interface Comparble et remplacer la méthode compareTo 2. utilisateur Lors de l'insertion d'un objet de type personnalisé, vous devez fournir une classe de comparaison qui implémente l'interface Comparator et remplace la méthode de comparaison(ancienneCapacité >> ; 1));
// 用户自己定义的比较器:直接实现Comparator接口,然后重写该接口中的compare方法即可 class IntCmp implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { return o2-o1; } } PriorityQueue<Integer> p = new PriorityQueue<>(new IntCmp());
构造器 | 功能介绍 |
PriorityQueue() | 创建一个空的优先级队列,默认容量是11 |
PriorityQueue(int initialCapacity) |
创建一个初始容量为initialCapacity的优先级队列,注意: initialCapacity不能小于1,否则会抛IllegalArgumentException异 常 |
PriorityQueue(Collection extends E> c) |
用一个集合来创建优先级队列 |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!