%3F.png)
В Введение в алгоритмы, Томас Кормен, есть некоторые алгоритмы, как на этом изображении. С одним столбцом для кода, одним для стоимости и одним для времени.
Я много искал, но так и не нашел, как это сделать.
решение1
Вот что бы я сделал, если бы не использовал 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}
Обратите внимание на несколько вещей:
Есть три значения ширины (в сантиметрах), которые, возможно, придется подкорректировать.
Стоимость операторов
for
иwhile
находится внутри скобок, и между ними и закрывающей скобкой не должно быть пробела. Это немного хрупко. То же самое дляif
и всех других операторов блока.Стоимость строки 3 отображается рядом с первой из двух строк, а не со второй (как в оригинале). Так было проще, но, думаю, мне тоже так больше нравится.
Этот ответ идет по противоположному пути по сравнению с ответом Jubobs, который использует пакет clrscode
. Если вы предпочитаете использовать clrscode
, я уверен, вы найдете способ правильного использования |>
для табуляции дополнительных столбцов, хотя это не очень хорошо документировано. Кроме того, это может быть предпочтительнее и по другим причинам, если вы хотите, чтобы ваши алгоритмы выглядели точно так же, как в книге.
решение2
(Только частичный ответ)
Кормен использовал свойclrscode
упаковкадля второго издания CLRS, а его «усиленная» версия, называемаяclrscode3e
, для третьего издания, из которогоСортировка вставкойАлгоритм на вашем скриншоте взят. Для получения более подробной информации см.этот.
Код для набора алгоритма (нобезстолбцы «стоимость» и «время») можно найти на странице 6clrscode3e
документация. В последнем не упоминается, как набирать столбцы. Кроме того, исходный код пакета, похоже, не предоставляет никакого (недокументированного) механизма для этого.
Однако среда Кормена codebox
основана на tabbing
среде; возможно, там есть что-то, что можно сделать, но я не настолько хорошо с этим знаком 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}
решение3
Существует пакет CLRS, кодовое название "clrscode3e", описание пакета, а также сам .sty
файл доступны на сайте:http://www.cs.dartmouth.edu/~thc/clrscode/, вы можете легко скачать .sty
файл, а также прочитать описание.
\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}