当前位置:网站首页>Tas (file d'attente prioritaire)
Tas (file d'attente prioritaire)
2022-07-02 12:07:00 【La nourriture n'est pas bonne.】
Table des matières
Obtenir l'élément chef d'équipe
🥬La nature du tas

Résumé:UnArbre binaire completParTraversée séquentielle Comment stocker dans un tableau ,L'utilisation principale de cette méthode est la représentation du tas.
🥬Classification des piles

🥬Réglage vers le bas du tas
Il y a maintenant un tableau, Logiquement, c'est un arbre binaire complet. ,On passe parNoeud racineAu débutAjustement vers le bas L'algorithme peut l'ajuster à un petit tas ou à un gros tas .L'algorithme de réglage vers le bas a une prémisse:Les sous - arbres gauche et droit doivent être un tas,Pour ajuster.
Prenons par exemple le petit tas:
1、 Comparez d'abord les noeuds gauche et droit de l'enfant ,Prenez le minimum.
2、 Comparez ce noeud enfant plus petit avec le noeud père , Si le noeud de l'enfant <Noeud père,Echange,Au contraire,Pas d'échange..
3、En boucle, Si l'indice du noeud enfant dépasse la limite , Ça veut dire que c'est la fin ,C'est fini..
Exemple de code:
//parent: Noeud racine de chaque arbre
//len: Position finale du réglage de chaque arbre
public void shiftDown(int parent,int len){
int child=parent*2+1; //Parce que le tas est un arbre binaire complet,Pas d'enfant de gauche, pas d'enfant de droite, Donc au moins il y a un enfant de gauche ,Au moins.1Un enfant
while(child<len){
if(child+1<len && elem[child]<elem[child+1]){
child++;// Les noeuds de deux enfants sont comparés à la valeur la plus faible
}
if(elem[child]<elem[parent]){
int tmp=elem[parent];
elem[parent]=elem[child];
elem[child]=tmp;
parent=child;
child=parent*2+1;
}else{
break;
}
}
}
🥬Construction de piles
public void creatHeap(int[] arr){
for(int i=0;i<arr.length;i++){
elem[i]=arr[i];
useSize++;
}
for(int parent=(useSize-1-1)/2;parent>=0;parent--){//Indice de tableau de0C'est parti.
shiftDown(parent,useSize);
}
}
La complexité spatiale de la construction du réacteur est O(N), Parce que le tas est un arbre binaire complet , Un arbre binaire plein est aussi un arbre binaire complet , Nous utilisons des arbres binaires (Dans le pire des cas)Pour prouver.
🥬Empiler vers le haut
Il y a une pile. , Nous devons insérer des données à la fin du tas , Et l'ajuster , Pour garder la structure du tas , C'est le réglage vers le haut .
Prenons l'exemple d'un tas de:
Exemple de code:
public void shiftup(int child){
int parent=(child-1)/2;
while(child>0){
if(elem[child]>elem[parent]){
int tmp=elem[parent];
elem[parent]=elem[child];
elem[child]=tmp;
child=parent;
parent=(child-1)/2;
}else{
break;
}
}
}
🥬Opérations courantes du tas
Dans la file d'attente
Ajouter des éléments au tas , Est d'ajouter à la dernière position , Ensuite, en faisant un ajustement vers le haut .
public boolean isFull(){
return elem.length==useSize;
}
public void offer(int val){
if(isFull()){
elem= Arrays.copyOf(elem,2*elem.length);//Expansion de la capacité
}
elem[useSize++]=val;
shiftup(useSize-1);
}
Hors de la file d'attente
Supprimer les éléments du tas , En échange du dernier élément , Et puis réduire la taille du tableau entier d'un , Dernier ajustement vers le bas , L'élément supérieur de la pile est supprimé .
public boolean isEmpty(){
return useSize==0;
}
public int poll(){
if(isEmpty()){
throw new RuntimeException("La file d'attente prioritaire est vide");
}
int tmp=elem[0];
elem[0]=elem[useSize-1];
elem[useSize-1]=tmp;
useSize--;
shiftDown(0,useSize);
return tmp;
}
Obtenir l'élément chef d'équipe
public int peek() {
if (isEmpty()) {
throw new RuntimeException("La file d'attente prioritaire est vide");
}
return elem[0];
}
🥬TopK Questions
Voilà.6Données,S'il te plaît.3Maximum de données. Comment on fait avec les piles ?
Comment résoudre le problème:
1、Si je te le demandeKLes plus grands éléments,Pour construire un petit tas de racines.
2、Si je te le demandeKLes plus petits éléments,Pour construire un grand tas de racines.
3、NoKLes grands éléments.Construire un petit tas,L'élément supérieur de la pile estKLes grands éléments.
4、NoKPetits éléments.Construire un tas de,L'élément supérieur de la pile estKLes grands éléments.
Par exemple,:S'il te plaît.nMaximum de données
Exemple de code:
public static int[] topK(int[] array,int k){
//Créer une taille deKUn petit tas de racines
PriorityQueue<Integer> minHeap=new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
//Traverser les éléments du tableau,AvantkÉléments mis en file d'attente
for(int i=0;i<array.length;i++){
if(minHeap.size()<k){
minHeap.offer(array[i]);
}else{
//Dek+1Début des éléments, Comparer séparément avec les éléments supérieurs
int top=minHeap.peek();
if(array[i]>top){
// Pop - up avant stockage
minHeap.poll();
minHeap.offer(array[i]);
}
}
}
// Placer les éléments du tas dans le tableau
int[] tmp=new int[k];
for(int i=0;i< tmp.length;i++){
int top=minHeap.poll();
tmp[i]=top;
}
return tmp;
}
public static void main(String[] args) {
int[] array={12,8,23,6,35,22};
int[] tmp=topK(array,3);
System.out.println(Arrays.toString(tmp));
}
Résultats:
Tri des tableaux
Encore une fois, si vous voulez trier un tableau de petit à grand , Avec un grand ou un petit tas de racines ?
---->Gros tas de racines
Exemple de code:
public void heapSort(){
int end=useSize-1;
while(end>0){
int tmp=elem[0];
elem[0]=elem[end];
elem[end]=tmp;
shiftDown(0,end);// Supposons qu'il s'agisse d'un grand tas de racines
end--;
}
}
🥬Résumé
C'est ce qu'il y a aujourd'hui,Si vous avez des questions, veuillez laisser un message dans la section commentaires.
边栏推荐
猜你喜欢
GGHIGHLIGHT: EASY WAY TO HIGHLIGHT A GGPLOT IN R
HR wonderful dividing line
H5, add a mask layer to the page, which is similar to clicking the upper right corner to open it in the browser
CONDA common command summary
Data analysis - Matplotlib sample code
Differences between nodes and sharding in ES cluster
自然语言处理系列(二)——使用RNN搭建字符级语言模型
5g era, learning audio and video development, a super hot audio and video advanced development and learning classic
HOW TO ADD P-VALUES ONTO A GROUPED GGPLOT USING THE GGPUBR R PACKAGE
PgSQL string is converted to array and associated with other tables, which are displayed in the original order after matching and splicing
随机推荐
求16以内正整数的阶乘,也就是n的阶层(0=<n<=16)。输入1111退出。
to_bytes与from_bytes简单示例
倍增 LCA(最近公共祖先)
Find the factorial of a positive integer within 16, that is, the class of n (0= < n < =16). Enter 1111 to exit.
HOW TO CREATE A BEAUTIFUL INTERACTIVE HEATMAP IN R
机械臂速成小指南(七):机械臂位姿的描述方法
(C language) 3 small Codes: 1+2+3+ · · +100=? And judge whether a year is a leap year or a normal year? And calculate the circumference and area of the circle?
Map和Set
How does Premiere (PR) import the preset mogrt template?
Leetcode209 subarray with the smallest length
【2022 ACTF-wp】
深入理解P-R曲线、ROC与AUC
(C语言)3个小代码:1+2+3+···+100=?和判断一个年份是闰年还是平年?和计算圆的周长和面积?
数据分析 - matplotlib示例代码
post请求体内容无法重复获取
YYGH-BUG-04
基于Arduino和ESP8266的连接手机热点实验(成功)
Applet link generation
Test shift left and right
HOW TO CREATE AN INTERACTIVE CORRELATION MATRIX HEATMAP IN R