Превратить программу с квадратичным временем в линейную с помощью моноида?

Дублирование из: Как напечатать выровненный массив numpy с метками строк и столбцов (текст)?

Но, пожалуйста, обратитесь к этому отклику Энди П., обратите внимание, что вы также может печатать все без ярлыков точно так же, как [

]. Этот код по существу является реализацией scoffey выше, но он не имеет трех ограничений символов и немного более мощный. Вот мой код:

    def format__1(digits,num):
        if digits

running

    import numpy
    x = numpy.array([[85, 86, 87, 88, 89],
                     [90, 191, 192, 93, 94],
                     [95, 96, 97, 98, 99],
                     [100,101,102,103,104]])
    row_labels = ['Z', 'Y', 'X', 'W']
    column_labels = ['A', 'B', 'C', 'D', 'E']
    printmat(x,row_labels=row_labels, col_labels=column_labels)

дает

         A   B   C   D   E
    Z [ 85  86  87  88  89]
    Y [ 90 191 192  93  94]
    X [ 95  96  97  98  99]
    W [100 101 102 103 104]

Это также будет выход, если «x» были всего лишь вложенными python вместо массива numpy.

0
задан Sereja Bogolubov 19 January 2019 в 09:03
поделиться

1 ответ

После оригинальной статьи Х. Берда, ведущим примером этого утверждения является обращение списка для односвязных списков, которое можно определить как

reverse([a : x]) = append(reverse x, a)

В прямой реализации добавить [115 ] до конца хвоста x требуется n-1 операций поиска, чтобы найти конец, и количество операций для reverse x, так что общее усилие составляет (n-1)+...+2+1=n*(n-1)/2.

В линейной реализации используется асимметричная сложность операции append, поскольку append(x,y) имеет стоимость, пропорциональную длине x, в то время как длина y не играет никакой роли. В качестве частичной операции append является эндоморфизмом в пространстве списков, append(x) y = append(x,y). Теперь представьте перевернутый список как результат объединения этих эндоморфизмов

reverse([a1,a2,...,an])=append(an) ... append(a2) append(a1) []

, из которых восстановление списка является операцией с линейными затратами. Ранее квадратичная «основная» стоимость «скрыта» в управлении стеком операций. Однако, в конце концов, это на самом деле не нужно, так как восстановление результирующего списка может начинаться с извлечения первого элемента. Для этого нужен «накопительный элемент», в том же диком псевдокоде

reverse(x) = reverse_recursion(x,[])

где

reverse_recursion([a : x], y) = reverse_recursion(x, [a : y])

с

reverse_recursion([], y) = y
0
ответ дан LutzL 19 January 2019 в 09:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: