Classificando uma pilha não ordenada de itens em gavetas com movimentos mínimos da gaveta


7

Há um tempo atrás, eu lavava minhas roupas tarde da noite. Quando trouxe minha roupa de volta ao meu dormitório, comecei a guardá-la.

Meu guarda-roupa está configurado da seguinte maneira:

  • Minhas gavetas são categorizadas pelo tipo de roupa que eles têm, e eu sou muito especial nisso; isso significa que não posso colocar camisetas na gaveta da minha calça (caso contrário, ficarei muito perturbada com isso para dormir). É claro que conheço essa categorização e sei qual gaveta é qual mesmo no escuro.
  • eu tenho N peças de roupa limpas e M gavetas dispostas verticalmente (com a gaveta na parte superior D0)
  • Posso abrir e fechar gavetas como achar melhor, mas se a gaveta Di está aberto, não consigo colocar roupas na gaveta Di+1 (porque está bloqueado por Di)
  • Todas as minhas gavetas já estão fechadas quando entro na sala.
  • Quando terminar, tenho que fechar todas as gavetas abertas.

Considerável cavalheiro que sou, não quero acordar meu colega de quarto (era um dormitório da faculdade, por isso dormimos no mesmo quarto). Resolvi não acender as luzes e fazer o mínimo de barulho possível.

Isso significa que eu tenho que guardar minhas roupas nas seguintes restrições:

  • Não consigo ver a minha bolsa de roupa suja, então só sei o que pego assim que a puxo.
  • Abrir e fechar uma gaveta faz barulho. Puxar itens da minha bolsa de roupas ou colocá-los na gaveta não é o caso.
  • Só posso guardar uma peça de roupa de cada vez; Não posso dobrar como roupas e colocá-las em pilhas (e depois guardá-las) porque o chão está muito sujo e não há espaço nos móveis ao meu alcance.
  • Posso colocar uma peça de roupa de volta na minha bolsa e tirar outra, mas a que eu tirar a seguir pode ser a que acabei de colocar (lembre-se, não tenho controle sobre o que retiro da bolsa).

Diante disso, tenho três perguntas:

  • Como posso guardar minhas roupas enquanto abro e fecho as gavetas o menor número de vezes possível?
  • Alguém mais pensou nesse problema ou em algo semelhante?
  • Esse problema tem aplicações práticas?

Você pode colocar um item silenciosamente de volta na sacola e extrair outra coisa ou deve tratá-lo como uma pilha?
Kyle Jones #

Nunca pensei nisso como uma variável possível. Digamos que eu possa colocar um item de volta e retirar outra coisa (mas o item que eu retiro novamente pode ser o item que eu coloquei de volta).
JesseTG

@KyleJones Com essa estratégia, Jesse pode não dormir com alta probabilidade.
Raphael

11
Existem várias respostas práticas, é claro. 1) Não faça isso enquanto seu colega de quarto estiver dormindo. 2) Crie uma área limpa de espaço para pré-classificação e dobragem. 3) Lave por espécie. 4) Faça uma pré-classificação por gaveta na lavanderia, enquanto retira itens da máquina de lavar. (Pegue uma sacola por gaveta, se não houver espaço limpo lá também.)
Raphael

11
Quanto à questão da ciência da computação: interessante. Acho que é principalmente um exercício de teoria das probabilidades: a menos que você possa obter algum controle sobre o item a seguir, seu algoritmo tem pouco a trabalhar.
Raphael

Respostas:


4

Que tal o seguinte:

  1. Passe pela sua bolsa; dobrar e empilhar itens para gavetasDi e Di+1, i2N, na gaveta Di (que você abre sob demanda).

    Verifique se você possui os itens para Di+1em cima; isso pode exigir bastante reorganização no estilo de panqueca , mas você não parece preocupado com essas operações.

    Observe que sempre há espaço suficiente (duas alturas de gaveta) para fazer isso, supondo que as gavetas sejam aproximadamente iguais e que suas roupas se encaixem nelas como estão.

  2. Para cada gaveta aberta Di,

    • pegue a pilha para Di+1 (e coloque na bolsa, se necessário),
    • Fechar Di,
    • aberto Di+1,
    • coloque a pilha lá dentro e
    • Fechar Di+1.

Este algoritmo requer 2M movimentos das gavetas, se todas as gavetas tiverem roupas, por isso é o pior caso.

Desperdiçará alguns movimentos se houver itens para Di+1 mas não Di; se apenas gavetas ímpares obtiverem itens, executamos o dobro dos movimentos necessários. Como isso é o pior que pode acontecer, ainda temos uma2-aproximação.


2
Uma coisa boa desse algoritmo é que ele é determinístico. Você não precisará rolar nenhum dado que possa acordar seu colega de quarto.
Raphael
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.