%3F.png)
Em Introdução aos Algoritmos, de Thomas Cormen, existem alguns algoritmos como nesta imagem. Com uma coluna para o código, uma para o custo e outra para os tempos.
Procurei muito, mas não encontrei como fazer.
Responder1
Isso é o que eu faria, se não usasse clrscode
.
\documentclass[11pt]{article}
\usepackage[noend]{algorithmic}
\newcommand{\TITLE}[1]{\item[#1]}
\renewcommand{\algorithmiccomment}[1]{$/\!/$ \parbox[t]{4.5cm}{\raggedright #1}}
% ugly hack for for/while
\newbox\fixbox
\renewcommand{\algorithmicdo}{\setbox\fixbox\hbox{\ {} }\hskip-\wd\fixbox}
% end of hack
\newcommand{\algcost}[2]{\strut\hfill\makebox[1.5cm][l]{#1}\makebox[4cm][l]{#2}}
\begin{document}
\begin{algorithmic}[1]
\TITLE{\textsc{Insertion-Sort}$(A)$}
\algcost{\textit{cost}}{\textit{times}}
\FOR{$j=2$ \TO $A.\mathit{length}$
\algcost{$c_1$}{$n$}}
\STATE $\mathit{key} = A[j]$
\algcost{$c_2$}{$n-1$}
\STATE \COMMENT{Insert $A[j]$ to the sorted sequence $A[1..j-1]$}
\algcost{$0$}{$n-1$}
\STATE $i = j-1$
\algcost{$c_4$}{$n-1$}
\WHILE{$i>0$ \AND $A[i]>key$
\algcost{$c_5$}{$\sum_{j=2}^{n} t_j$}}
\STATE $A[i+1]= A[i]$
\algcost{$c_6$}{$\sum_{j=2}^{n} (t_j-1)$}
\STATE $i = i-1$
\algcost{$c_7$}{$\sum_{j=2}^{n} (t_j-1)$}
\ENDWHILE
\STATE $A[i+1] = \mathit{key}$
\algcost{$c_8$}{$n-1$}
\ENDFOR
\end{algorithmic}
\end{document}
Por favor, observe algumas coisas:
Existem três larguras (em centímetros) que podem precisar de ajustes.
Os custos
for
ewhile
extratos estão entre colchetes e não deve haver espaço entre eles e o colchete de fechamento. Isso é um pouco frágil. O mesmo paraif
e todas as outras instruções de bloco.O custo da linha 3 é exibido próximo à primeira das duas linhas, não à segunda (como no original). Foi mais fácil assim, mas acho que também prefiro.
Esta resposta segue o caminho oposto da resposta do Jubobs, que está usando o clrscode
pacote. Se você preferir usar clrscode
, tenho certeza que encontrará uma maneira de usar corretamente |>
para tabular as colunas extras, embora não esteja bem documentado. Além disso, pode ser preferível por outros motivos, se você quiser que seus algoritmos sejam exatamente iguais aos do livro.
Responder2
(Apenas uma resposta parcial)
Cormen usou seuclrscode
pacotepara a segunda edição do CLRS, mas uma versão "reforçada" dele, chamadaclrscode3e
, para a terceira edição, da qual oClassificação de inserçãoalgoritmo em sua captura de tela é obtido. Para mais detalhes, consulteesse.
O código para composição do algoritmo (massemcolunas "custo" e "tempos") podem ser encontradas na página 6 doclrscode3e
documentação. Este último não menciona como compor colunas. Além disso, o código-fonte do pacote não parece fornecer nenhum mecanismo (não documentado) para isso.
Entretanto, o ambiente de Cormen codebox
é baseado em um tabbing
ambiente; talvez haja algo a ser feito aí, mas não estou tão familiarizado com isso tabbing
...
\documentclass{article}
\usepackage{clrscode3e}
\begin{document}
\begin{codebox}
\Procname{$\proc{Insertion-Sort}(A)$}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li \Do
$\id{key} \gets A[j]$
\li \Comment Insert $A[j]$ into the sorted sequence
$A[1 \twodots j-1]$.
\li $i \gets j-1$
\li \While $i > 0$ and $A[i] > \id{key}$
\li \Do
$A[i + 1] = A[i]$
\li $i \gets i-1$
\End
\li $A[i+1] \gets \id{key}$
\End
\end{codebox}
\end{document}
Responder3
Existe o pacote CLRS, codinome "clrscode3e", a descrição do pacote bem como o .sty
arquivo estão disponíveis no site:http://www.cs.dartmouth.edu/~thc/clrscode/, você pode baixar facilmente o .sty
arquivo e também ler a descrição.
\documentclass{article}
\usepackage{clrscode3e}
\begin{document}
\begin{codebox}
\Procname{$\proc{Insertion-Sort}(A)$}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li \Do
$\id{key} \gets A[j]$
\li \Comment Insert $A[j]$ into the sorted sequence
$A[1 \twodots j-1]$.
\li $i \gets j-1$
\li \While $i > 0$ and $A[i] > \id{key}$
\li \Do
$A[i + 1] = A[i]$
\li $i \gets i-1$
\End
\li $A[i+1] \gets \id{key}$
\End
\end{codebox}
\end{document}