[Aprendizado de máquina] [Sistema operacional] [Rede] [Algoritmo e estrutura de dados] Resumo do conhecimento

Aprendizado de máquina

O que fazer quando L1 não é condutivo

sistema operacional

Diferença de pilha

A diferença entre heap e stack:

1. A diferença na alocação do espaço da pilha:

1) Stack (sistema operacional): automaticamente alocado e liberado pelo sistema operacional, armazenando valores de parâmetros de função, valores de variáveis ​​locais, etc. Seu modo de operação é semelhante à pilha na estrutura de dados;

2) Heap (sistema operacional): Geralmente, é alocado e liberado pelo programador.Se o programador não liberá-lo, o sistema operacional pode recuperá-lo no final do programa.O método de alocação é semelhante a uma lista vinculada.

Dois, a diferença entre os métodos de armazenamento em cache da pilha:

1) A pilha usa o cache de primeiro nível, eles geralmente estão no espaço de armazenamento quando são chamados e são liberados imediatamente após a chamada;

2) O heap é armazenado no cache de segundo nível e o ciclo de vida é determinado pelo algoritmo de coleta de lixo da máquina virtual (não que possa ser reciclado depois de se tornar um objeto órfão). Portanto, a velocidade de chamada desses objetos é relativamente baixa.

Pilha: na memória, o tipo de dados de referência é armazenado. O tamanho do tipo de dados de referência não pode ser determinado. A pilha é, na verdade, o espaço de armazenamento de uma estrutura de lista vinculada que usa o espaço espalhado na memória. O tamanho da pilha é diretamente determinado pelo tamanho do tipo de referência., A mudança do tamanho do tipo de referência afeta diretamente a mudança do heap

Stack: É o tipo de valor armazenado na memória, o tamanho é 2M, se exceder, será reportado um erro e a memória irá transbordar

Três, a diferença da estrutura de dados da pilha:

Heap (estrutura de dados): Heap pode ser considerada como uma árvore, como: classificação de heap;

Pilha (estrutura de dados): uma estrutura de dados first-in-last-out.

Características: primeiro a entrar, último a sair

Quais são as situações de estouro de pilha

1) A matriz local é muito grande. Quando a matriz dentro da função é muito grande, pode causar estouro de pilha.

2) Existem muitos níveis de chamadas recursivas. A função recursiva realizará uma operação de empilhamento de pilha quando estiver em execução. Quando a pilha for acionada muitas vezes, também causará um estouro de pilha. 3) O ponteiro ou matriz está fora dos limites. Essa situação é mais comum, como copiar uma string ou processar a entrada do usuário e assim por diante.

Algoritmo e estrutura de dados

Organizar

Classificação de contagem / classificação de balde

Complexidade de tempo O (N + K) O (N + K)O ( N+K ) , use o tempo para o espaço, quandoO (k)> O (n log ⁡ (n)) O (k)> O (n \ log (n))O ( k )>O ( nlo g ( n ) ) não é tão eficiente quanto a classificação baseada em comparação

topK dá 3 soluções

1) Método de eliminação parcial - Obtenha TopK com a ajuda de "classificação por bolha"

Idéias: (1) Você pode evitar a classificação de todos os dados, apenas a classificação de parte; (2) A classificação por bolha é que cada rodada de classificação terá um valor máximo, então K rodadas de classificação podem obter TopK.

Complexidade de tempo e complexidade de espaço: (1) Complexidade de tempo: uma rodada de classificação é O (N), então a complexidade de tempo total de classificação K vezes é: O (KN). (2) Complexidade do espaço: O (K), usado para armazenar o topK obtido, ou O (1) para percorrer os últimos K elementos do arranjo original.

2) Método de eliminação parcial - Obtenha TopK com a ajuda da estrutura de dados "heap"

Idéias: (1) Pilha: é dividida em uma grande pilha superior (o elemento superior é maior do que todos os outros elementos) e uma pequena pilha superior (os outros elementos no topo são menores do que todos os outros elementos). (2) Usamos uma pequena pilha superior para fazer isso. (3) Retire K elementos e coloque-os em outro array, e construa uma pilha desses K elementos. (4) Em seguida, percorra os dados da posição do subscrito K, desde que o elemento seja maior do que o topo da pilha, atribuímos o topo da pilha ao elemento e reajustamos à pequena pilha superior. (5) Após o loop, o array heap de K elementos é o TopK de que precisamos.

Complexidade de tempo e complexidade de espaço: (1) Complexidade de tempo: Cada vez que K elementos são construídos, a complexidade de tempo é: O (KlogK), mais os ciclos de NK, a complexidade de tempo total é O ((K + (NK)) logK), que é, O (NlogK), onde K é o número de TopKs a serem adquiridos e N é o volume total de dados. (2) Complexidade do espaço: O (K), só precisa criar uma matriz de tamanho K para armazenar topK

3) Divida e conquiste-obtenha TopK com a ajuda do método de "classificação rápida"

Idéias: (1) Por exemplo, se houver 1 bilhão de dados, para encontrar um Top1000, primeiro dividimos 1 bilhão de dados em 1.000 partes, cada uma com 1 milhão de partes de dados. (2) Encontre o Top 1000 correspondente em cada cópia e integre-o em um array para obter 1 milhão de dados, filtrando assim 999 %% dos dados. (3) Use a classificação rápida para realizar uma classificação "redonda" desses 1 milhão de dados. Após uma rodada de classificação, o número apontado pelo ponteiro é considerado S e a matriz será dividida em duas partes. Uma parte é maior que S e registrada como Si, e a outra é menor que S é indicada como Sj. (4) Se o número de elementos Si for maior que 1000, realizamos outra rodada de classificação na matriz Si ​​e novamente dividimos Si em Si e Sj. Se o elemento de Si for menor que 1000, então precisamos obter elementos de 1000 contagens (Si) em Sj, ou seja, classificar Sj (5) recursivamente para obter TopK.

Complexidade do tempo e complexidade do espaço: (1) Complexidade do tempo: Uma cópia da complexidade do tempo de obtenção do TopK: O ((N / n) logK). Então todos os compartilhamentos são: O (NlogK), mas no método dividir e conquistar, usaremos recursos multi-core e multi-máquina.Por exemplo, temos S threads para processar ao mesmo tempo. Então, a complexidade do tempo é: O ((N / S) logK). Depois disso, é realizada a classificação rápida, e a complexidade de tempo de um tempo é: O (N). Supondo que o resultado seja obtido após a classificação M vezes, a complexidade de tempo é: O (MN). Portanto, a complexidade de tempo total é de aproximadamente O (MN + (N / S) logK). (2) Complexidade do espaço: Se uma matriz for necessária para cada cópia, a complexidade do espaço é O (N).

Método de tabela de hash para lidar com conflitos

a priori

Número Cattleya

[Algoritmo] Chocado! ! ! O número de Cattleya mais detalhado da história! ! !

Correspondência de gráfico bipartido

Filtro Bloom

Bitmap

Árvore vermelho-preto / árvore balanceada

Grande quantidade de dados, realizando pesquisa e classificação

1), método de bitmap

O método de bitmap é um método relativamente novo que vi na programação de pérolas.A ideia é mais engenhosa e eficiente.
Exemplo de cenário de uso: classificar a quantidade de dados 2G é um requisito básico.

Dados: 1. Cada dado não ultrapassa 800 milhões; 2. O tipo de dados é int; 3. Cada dado é repetido no máximo uma vez.

Memória: até 200M de memória podem ser usados ​​para operação.

Em primeiro lugar, julgue a memória ocupada. Cada dado não ultrapassa 800 milhões. Então, qual é o conceito de 800 milhões.

**

1 byte = 8 bits (位)

1024 byte = 8 * 1024 bit = 1k

1024 k = 8 1024 1024 bit = 1M = 8388608 bit

**

Ou seja, 1M = 8388608 bits

A ideia básica do método de bitmap é usar um bit para representar um número. Por exemplo, se o dígito 3 for 1, significa que 3 apareceu nos dados. Se for 0, significa que 3 não apareceu nos dados. Portanto, quando a condição aparece na questão de que cada dado é repetido no máximo uma vez, podemos considerar o uso do método de bitmap para classificar o big data.

Portanto, se você usar o método de bitmap para classificar essa questão, quanta memória ele ocupa? Sabendo da pergunta que cada dado não ultrapassa 800 milhões, então precisamos de 800 milhões de bits, ocupando 800000000/8388608 = 95M de espaço e atendendo às condições de usar até 200M de memória para operação. Este também é o problema que pode ser resolvido usando o método de bitmap. Uma fundação.

2), método de classificação de heap

A classificação de heap é um dos quatro métodos de classificação com uma complexidade de tempo média de nlogn. Sua vantagem reside em seu excelente desempenho ao encontrar os primeiros n máximos e mínimos de M números. Portanto, quando os primeiros m valores máximos ou mínimos devem ser encontrados nos dados massivos e outros valores não são necessários, o método de classificação de heap funciona bem.

Cenário de uso: Encontre os 100 maiores números de 100 milhões de inteiros

degrau:

(1) Leia os primeiros 100 dígitos e construa a pilha máxima. (A classificação de heap é usada aqui para tornar a complexidade do espaço muito baixa. Para classificar 100 milhões de números, mas só precisa ler 100 números por vez, ou definir outras bases, não há necessidade de ler todos os dados de uma vez, reduzindo a reivindicação de memória)

(2) Leia os números restantes em sequência, compare com o heap máximo e mantenha o heap máximo. O número de leituras por vez é uma página do disco e os dados de cada página são comparados sequencialmente ao heap, o que economiza tempo de E / S.

(3) Classifique a pilha para obter 100 máximos ordenados.

A classificação de heap é um algoritmo comum, mas entender seus cenários de uso pode nos ajudar a entendê-lo melhor.

3), uma estratégia mais geral de dividir e conquistar

Os estrategistas de dividir e conquistar têm uma solução universal para problemas complexos comuns.Embora em muitos casos, a solução da estratégia de dividir e conquistar não seja a solução ideal, é muito versátil. O núcleo do método de dividir e conquistar é abstrair um problema complexo em vários problemas simples por meio da decomposição.

Cenário de aplicação: dados 10G, algoritmo de classificação em uma única máquina com memória 2G

Em minha opinião, este cenário não introduz se os dados estão duplicados, nem dá o escopo dos dados, nem busca o número máximo. Embora dividir para conquistar possa exigir muito tempo de E / S, ainda é viável resolver esse problema.

degrau:

(1) Extraia amostras de big data e divida os dados a serem classificados em vários intervalos com aproximadamente o mesmo número de amostras, por exemplo: 1-100, 101-300 ...

(2) Divida o arquivo de big data em vários pequenos arquivos de dados. Aqui, o número de IOs e recursos de hardware deve ser considerado. Por exemplo, o número de pequenos arquivos de dados pode ser definido como 1G (a memória deve ser reservada para o uso de o programa durante a execução)

(3) Use o algoritmo ideal para classificar os dados do pequeno arquivo de dados e armazene os resultados da classificação de acordo com o intervalo dividido pela etapa 1.

(4) Processe os arquivos de resultado de classificação em cada intervalo de dados e, finalmente, obtenha um arquivo de resultado de classificação para cada intervalo

(5) Combine os resultados da classificação de cada intervalo. Divida e conquiste o big data em pequenos dados para processamento e depois mescle.

Acho que você gosta

Origin blog.csdn.net/TQCAI666/article/details/114083464
Recomendado
Clasificación