2011-09-02 8 views
7

documentation z Data.Array brzmi:Jak szybki jest Data.Array?

Haskell zapewnia wieloostrzowych tablic, które mogą być traktowane jako funkcji, których domeny są izomorficzne do sąsiadujących podzbiorów całkowitymi. Funkcje ograniczone w ten sposób można skutecznie zrealizować w postaci ; w szczególności programista może rozsądnie spodziewać się szybkiego dostępu do komponentów.

Zastanawiam się, jak szybko mogą być (!) i (//). Czy mogę oczekiwać od nich złożoności O (1), jak bym od ich imperatywnych odpowiedników?

Odpowiedz

5

Ogólnie, tak, powinieneś być w stanie oczekiwać O (1) od !, chociaż nie jestem pewien, czy jest to zagwarantowane przez standard.

Możesz chcieć zobaczyć pakiet wektorowy, jeśli chcesz mieć szybsze tablice (za pomocą fuzji strumieniowej). Jest również lepiej zaprojektowany.

Należy pamiętać, że // jest prawdopodobnie O (n), chociaż musi przejść przez tę listę (tak, jak zrobiłby to imperatywny program). Jeśli potrzebujesz dużo mutacji, możesz użyć MArray lub MVector.

+1

'(//)' jest faktycznie linarem w _ rozmiar tablicy_, ponieważ musi on utworzyć nową kopię tablicy. Korzystając z tablic zmiennych, spodziewam się, że będzie on liniowy pod względem liczby aktualizacji. – hammar

+0

@hammar jest liniowy w obu, ponieważ musi skopiować tablicę, a także iterować na liście. // jest raczej bezużyteczny w trybie MArray, ponieważ nie potrzebujesz funkcji aktualizacji zbiorczej. – alternative

+0

Tak, oczywiście. Ma to jednak znaczenie tylko wtedy, gdy aktualizujesz niektóre elementy więcej niż jeden raz. – hammar