Programação  
 
Rede de conhecimento computador >> Programação >> Programação em Java >> Content
Como posso gerenciar e manipular eficientemente grandes quantidades de dados usando heaps em java?
As pilhas são excelentes estruturas de dados para gerenciar e manipular dados com eficiência quando você precisa encontrar repetidamente o elemento mínimo ou máximo. Em Java, a classe `PriorityQueue` fornece uma implementação de heap (min-heap por padrão). Veja como você pode usar efetivamente pilhas para gerenciar e manipular grandes conjuntos de dados:

1. Compreendendo o básico

* Propriedade de heap: Um heap mantém um pedido específico. Em um min-heap, a chave do nó pai é sempre menor ou igual às chaves de seus filhos. Em um max-heap, a chave do nó pai é sempre maior ou igual às chaves de seus filhos.

* `priorityqueue` em java: `Priorityqueue` implementa um min-heap por padrão. Você pode personalizá-lo para ser um max-heap usando um `comparador 'personalizado.

* complexidade do tempo:
* `add (elemento)`:o (log n) em média (onde n é o número de elementos na pilha)
* `remover ()` (remove a raiz, min ou max):o (log n)
* `peek ()` (retorna a raiz):O (1)
* `contém (elemento)`:O (n) no pior caso. Os montes não são * eficientes para a busca de elementos arbitrários.
* Construindo uma pilha de uma matriz:O (n)

2. Técnicas principais e casos de uso

* Encontrando os K menores/maiores elementos: Este é um aplicativo de heap clássico.

* k menor:
1. Crie um max-heap of size `k` a partir dos primeiros elementos` k` do seu conjunto de dados.
2. Itera através dos demais elementos. Se um elemento for menor que a raiz do max-heap, remova a raiz e insira o novo elemento.
3. Após o processamento de todos os elementos, o Max-heap conterá os elementos mais menores `k`.

* k maior:
1. Crie um min-heap de tamanho `k` a partir dos primeiros elementos` k` do seu conjunto de dados.
2. Itera através dos demais elementos. Se um elemento for maior que a raiz do min-heap, remova a raiz e insira o novo elemento.
3. Após o processamento de todos os elementos, o Min-Heap conterá os maiores elementos `K`.

`` `Java
importar java.util.priorityQueue;
importar java.util.comparator;
importar java.util.list;
importar java.util.arraylist;

classe pública heepexamples {

Lista de estática pública findKlar MAI (int [] nums, int k) {
PriorityQueue mineap =new priorityQueue <> (); // min-heap por padrão

para (int num:nums) {
if (mineap.size () mineap.add (num);
} else if (num> mineap.peek ()) {
mineap.poll (); // Remova o menor
mineap.add (num); // Adicione o novo elemento maior
}
}

// converte a pilha em uma lista (opcional, para pedidos específicos)
List Klargest =new ArrayList <> (MINHEAP);
klargest.sort (comparator.verseverOrder ()); // classificar descendo para o maior ao menor

Retornar Klar Maior;
}

Lista de estática pública findksMalest (int [] nums, int k) {
PriorityQueue maxheap =new priorityQueue <> (comparator.verseverOrder ()); // max-heap

para (int num:nums) {
if (maxheap.size () maxheap.add (num);
} else if (num maxheap.poll (); // Remova o maior
maxheap.add (num); // Adicione o novo elemento menor
}
}

// converte a pilha em uma lista (opcional, para pedidos específicos)
Lista ksmalest =new ArrayList <> (maxheap);
ksmallest.sort (comparador.naturalorder ()); // classifica ascendendo para o menor para o maior

retornar Ksmalest;
}

public static void main (string [] args) {
int [] dados ={5, 2, 9, 1, 5, 6};
int k =3;

Lista Maior =Findklar MAGER (Data, K);
System.out.println ("K Maior:" + Maior); // Saída:K Maior:[9, 6, 5]

Lista menor =findksMalest (dados, k);
System.out.println ("K menor:" + menor); // Saída:K menor:[1, 2, 5]
}
}
`` `

* Mesclagem K Listas classificadas:

1. Crie um min-heap para armazenar o primeiro elemento de cada lista. Cada elemento na pilha deve armazenar o valor * e * o índice da lista de onde veio.
2. Remova repetidamente o elemento mínimo da pilha. Este é o próximo elemento na lista classificada mesclada.
3. Se a lista da qual o elemento removido veio tiver mais elementos, adicione o próximo elemento dessa lista à pilha.
4. Continue até que a pilha esteja vazia.

`` `Java
importar java.util.priorityQueue;
importar java.util.list;
importar java.util.arraylist;

classe pública MergesortedLists {

Classe estática privada implementos de nó comparável {
int valor;
int listIndex;
int elementIndex;

public node (int valor, int listindex, int elementIndex) {
this.value =value;
this.ListIndex =listIndex;
this.ElementIndex =ElementIndex;
}

@Override
public int compareto (nó outro) {
return integer.compare (this.value, outros.value);
}
}

Lista estática pública MergeksortedLists (Lista > listas) {
List MergedList =new ArrayList <> ();
PriorityQueue mineap =new priorityQueue <> ();

// Adicione o primeiro elemento de cada lista ao heap
for (int i =0; i if (! lists.get (i) .isempty ()) {
mineap.add (novo nó (lists.get (i) .get (0), i, 0));
}
}

while (! minhap.isempty ()) {
Nó corrente =mineap.poll ();
MergedList.add (current.value);

int listIndex =current.listIndex;
int elementIndex =current.ElementIndex;

// Adicione o próximo elemento da mesma lista se houver
if (elementIndex + 1 mineap.add (novo nó (lists.get (listIndex) .get (elementIndex + 1), listIndex, elementIndex + 1));
}
}

Return MergedList;
}

public static void main (string [] args) {
Lista > lists =new ArrayList <> ();
lists.add (list.of (1, 4, 7));
lists.add (list.of (2, 5, 8));
lists.add (list.of (3, 6, 9));

List mescle =MergeksortEdLists (listas);
System.out.println ("Lista mesclada:" + mesclada); // Saída:Lista mesclada:[1, 2, 3, 4, 5, 6, 7, 8, 9]
}
}
`` `

* Aplicações de fila de prioridade:

* Programação de tarefas: Priorize tarefas com base na urgência e execute -as em ordem.
* Algoritmos de gráfico (Dijkstra, A*): Os nós da loja a serem visitados com base na distância estimada da fonte.
* simulação de eventos: Eventos de processo em ordem cronológica.

3. Considerações importantes para dados grandes

* Gerenciamento de memória: Se o seu conjunto de dados for * extremamente * grande e não se encaixa na memória, considere:
* Classificação externa (Mesclar classificar com heaps): Divida os dados em pedaços menores que se encaixam na memória, classificam cada pedaço (usando pilhas ou outros métodos) e, em seguida, mescla os pedaços classificados usando uma pilha. Isso envolve a leitura e a gravação de dados no disco.
* Algoritmos de streaming: Algoritmos projetados para processar dados em um único passe, minimizando o uso da memória. Embora uma pilha pura possa não ser adequada para streaming em todos os casos, você pode usar técnicas como a amostragem de reservatórios em conjunto com os montes.

* Comparador personalizado: Para objetos complexos, implemente um `comparador` que define como seus objetos devem ser comparados na pilha.

* Coleção de lixo: Grandes montes podem pressionar o coletor de lixo. Esteja atento à criação e descarte de objetos para evitar gargalos de desempenho.

* perfil: Use ferramentas de perfil para identificar pontos de desempenho de desempenho em seu código. Isso pode ajudá -lo a determinar se as operações da pilha são o gargalo e se você precisa otimizá -las ainda mais.

* Tipos primitivos (quando possível): Se você estiver trabalhando com tipos primitivos (por exemplo, `int`,` double`), considere usar um `int []` `ou` double [] `como o armazenamento subjacente para o seu heap, em vez de objetos` integer` ou `duplo '. Isso pode reduzir a sobrecarga da memória e melhorar o desempenho. Você então implementaria a lógica da heap (usando índices de matriz). Isso é necessário apenas em cenários extremamente sensíveis ao desempenho.

* pré-alocação: Se você conhece o tamanho máximo aproximado da sua pilha com antecedência, pré-aloce o `priorityQueue 'com essa capacidade. Isso pode impedir que as operações de redimensionamento, o que pode ser caro.

Exemplo:priorizando entradas de log

Imagine que você está processando um grande arquivo de log e precisa extrair as entradas de log mais críticas com base em uma pontuação de gravidade.

`` `Java
importar java.util.priorityQueue;
importar java.util.comparator;
importar java.util.list;
importar java.util.arraylist;

classe Logentry {
Mensagem de string;
severidade int;

public Logentry (mensagem de string, gravidade int) {
this.Message =message;
this.severity =gravidade;
}

@Override
public string tostring () {
Retorne "Logentry {" +
"mensagem ='" + mensagem +' \ '' +
", gravidade =" + gravidade +
'}';
}
}

classe pública Loganalyzer {

Lista de estática pública FindtCritical (List logs, int n) {
PriorityQueue mineap =new priorityQueue <> (comparator.comparingInt (LogEntry ::getSeverity));

para (logentry log:logs) {
if (mineap.size () mineap.add (log);
} else if (log.getSeverity ()> mineap.peek (). getSeverity ()) {
mineap.poll ();
mineap.add (log);
}
}

List criticallogs =new ArrayList <> (MINHEAP);
criticallogs.sort (comparador.comparingInt (LogEntry ::getSeverity) .reversed ());
devolver críticos;
}

public static void main (string [] args) {
List logs =new ArrayList <> ();
logs.add (new Logentry ("Erro de baixa prioridade", 1));
logs.add (new Logentry ("Aviso de Prioridade Média", 5));
logs.add (new Logentry ("Erro crítico - falha no sistema", 10));
logs.add (new Logentry ("Outro evento de baixa prioridade", 2));
logs.add (new Logentry ("edição de rede de alta prioridade", 8));
logs.add (new Logentry ("Problema de banco de dados de médio prioridade", 6));

int n =3;
List Crítico =FindingSurcritical (logs, n);
System.out.println ("Logs mais críticos:" + crítico);
// Saída:mais críticos logs:[logentry {message ='Erro crítico - fiagem do sistema', gravidade =10}, logentry {message ='alta edição de rede de alta prioridade', gravidade =8}, Logentry {message ='Problema de banco de dados de prioridade média', gravidade =6}]
}
}
`` `

em resumo:

Os montes são poderosos para encontrar valores extremos (min/max) e priorizar elementos em um conjunto de dados. Ao lidar com grandes quantidades de dados, esteja atento ao uso da memória, considere as técnicas de classificação externas, se necessário, e fide seu código para identificar e abordar gargalos de desempenho. A classe `PriorityQueue` em Java é um ponto de partida conveniente, mas pode ser necessário personalizá -la ou implementar sua própria lógica de heap para casos de uso específicos e restrições de memória.

Anterior :

Próximo :
  Os artigos relacionados
·Como Chegar Jar Referências em Java Projeto 
·Como formatar a largura de carros alegóricos em Java 
·Como Redesenhar um problema no Java 
·Como alterar cores em Java Com Eventos 
·Como: iReport para NetBeans 
·A diferença entre interface e classe abstrata 
·Formato Java para Floating pontos decimais 
·Como se conectar com JSP Servlet 
·Como fazer um método usando JDBC 
·Como aumentar a alocação de memória virtual em Java 
  Artigos em destaque
·Três principais benefícios de ENUM 
·Como converter um ano a dois dígitos em PHP 
·Qual é a diferença entre JRE e Java SE 
·Como usar uma DLL em VB.NET 
·Como parar uma consulta no MySQL 
·Como remover duplicatas em listas em Python 
·Turing Tipos booleanos 
·Como posso determinar o número de iterações que um l…
·Filas e Pilhas Explicada 
·Como enviar e-mail HTML com VB.NET 
Cop e direita © Rede de conhecimento computador https://ptcomputador.com Todos os Direitos Reservados