ajudar a resolver problemas interessantes. Catalogar as estruturas de dados usadas na Zwift, evidenciando como estruturas customizadas podem ser benéficas. Apresentar o processo decisório que pode levar um time a escolher implementar uma estrutura de dados customizada. 3 1. CONTEXTO Que tipo de problemas são resolvidos na Zwift? 2. ESTUDO DE CASO Por que resolvemos alguns problemas usando estruturas customizadas?
de Voronoi listrado que balanceia jogadores entre servidores. 2. STRIPES Similar ao Stripes, mas em 2D. Divide os jogadores em linhas e depois em células com o mesmo número de jogadores. 3. BRICKWALL Divide recursivamente o espaço (e o conjunto de jogadores) até que cada célula possa ser atribuído a um único servidor. 4. KD-TREE Atribui focos de Voronoi aleatoriamente e verifica se a solução é viável (se não há jogadores demais no mesmo servidor). 1. VORONOI 19
maioria dos casos com um desempenho razoável. Para tanto, é quase sempre necessário fazer escolhas que não necessariamente refletem a realidade de quem vai usar. 22
▷ Até 300 mil jogadores no índice ▷ Consulta sobre os 100 vizinhos mais próximos de cada jogador. 300 mil × 100 = 30 milhões de vizinhos gerados a cada 3 segundos.
análise a se fazer sobre a aplicabilidade de uma estrutura a um problema é a complexidade esperada da solução. Eficiência de Cache Estruturas bem modeladas colocam dados correlatos em posições próximas na memória, otimizando a eficiência de cache da solução. Otimização de Espaço Um aspecto geralmente menos importante que os outros, mas ainda relevante. Entretanto, otimizar espaço às vezes pode ser a diferença entre caber no cache L1 ou ter que rodar direto da RAM. GC Pressure Em sistemas de alta frequência, é importante evitar alocações desnecessárias. O custo de GC às vezes pode ser bastante significativo. E as pausas às vezes catastróficas. Preocupações importantes sobre estruturas de dados.
1 2 0 Representando árvore binária completa em array (Representação em largura) Vantagem: nós de uma mesma camada ficam próximos no array. Filhos de N: N*2, N*2+1. Representação comum em binary heaps.