Estou bastante familiarizado com onde usar pilhas, filas e árvores em aplicativos de software, mas nunca usei um Deque (fila dupla dupla) antes. Onde eu normalmente os encontraria na natureza? Estaria nos mesmos lugares que uma Fila, mas com outros itens?
data-structures
Engenheiro Mundial
fonte
fonte
Respostas:
Uma maneira de usar o deque é "envelhecer" os itens. Geralmente é usado como um recurso de desfazer ou histórico. Uma nova ação é inserida no deque. Os itens mais antigos estão na frente. Um limite no tamanho do deque força os itens na frente a serem removidos em algum momento à medida que novos itens são inseridos (envelhecendo os itens mais antigos). Ele fornece uma maneira rápida de acessar as duas extremidades da estrutura, porque você conhece instantaneamente os itens mais antigos e os mais novos para remover a frente e confirmar a ação mais antiga em O (1) ou desfazer em O (1).
fonte
Excelente pergunta. Não me lembro do curso CS 102 mencionando um único aplicativo para a fila dupla.
Até hoje, o único aplicativo que conheço é o agendador de roubo de trabalho mencionado no artigo da Wikipedia .
Funciona essencialmente da seguinte maneira:
Em um modelo de procedimento normal e de thread único, toda chamada de função envia um registro de ativação para a chamada pilha de chamadas . Um registro de ativação contém as variáveis e parâmetros locais dessa chamada. Depois que a chamada para o método é concluída ("retorna"), o último registro de ativação é exibido na pilha de chamadas.
Isso é particularmente importante porque é assim que a recursão é implementada: a estrutura da recursão é representada no estado atual da pilha de chamadas.
Ao paralelizar um algoritmo recursivo, podemos explorar essa propriedade substituindo a pilha de chamadas por uma fila de chamadas. Cada encadeamento na computação obtém sua própria fila de chamadas e envia e lança registros de ativação como em uma execução seqüencial.
Porém, quando um segmento termina seu trabalho (= sua fila de chamadas está vazia), rouba o trabalho de outro segmento, removendo um registro de ativação da fila de chamadas desse segmento, removendo da extremidade "incorreta".
Basicamente, a fila de chamadas atua como duas pilhas de chamadas que agora atendem a dois threads.
fonte