Aby móc jasno przekazać idee zawarte w tutaj, najpierw muszę podać kilka prostych definicji. Mówiąc o algorytmie, mam na myśli abstrakcyjną specyfikację procesu. Kiedy mówię o implementacji, mam na myśli sposób, w jaki algorytm jest faktycznie programowany. Wreszcie, kiedy mówię o programie lub aplikacji, mam na myśli zbiór takich implementacji algorytmów współpracujących ze sobą. To powiedziawszy, łatwo jest zobaczyć, jak algorytm można zaimplementować na wiele różnych sposobów (na przykład jedna implementacja może korzystać z listy, a inna może używać tablicy). Każda z tych implementacji będzie miała inną wydajność i są one powiązane, ale nie równoważne, ze złożonością czasową algorytmu. Dla osób niezaznajomionych z ostatnim terminem każdy algorytm ma następujące dwie podstawowe właściwości
* Złożoność czasowa: Ta właściwość odnosi się do liczby obliczeń, które algorytm musi wykonać, w odniesieniu do wielkości otrzymywanych danych wejściowych. Istnieją różne narzędzia matematyczne do pomiaru tej złożoności, z których najpowszechniejszym jest notacja Big-O, która mierzy najgorszy scenariusz dla algorytmu.
* Złożoność przestrzeni: ta właściwość odnosi się do ilości pamięci wymaganej do wykonania algorytmu, ponownie w odniesieniu do rozmiaru danych wejściowych, które otrzymuje, i można ją również zmierzyć za pomocą tych samych narzędzi matematycznych. Powszechnie wiadomo, że nieefektywny algorytm zaimplementowany bardzo wydajnie może być o rząd wielkości wolniejszy niż wydajny algorytm zaimplementowany nieefektywnie. Oznacza to, że w większości przypadków wybór algorytmu jest znacznie ważniejszy niż optymalizacja implementacji.
Podczas oceny algorytmu należy wziąć pod uwagę wiele innych kwestii niż wspomniane wcześniej złożoności, takie jak wykorzystanie zasobów wydajności (na przykład przepustowość Internetu), a także inne właściwości, takie jak bezpieczeństwo lub trudność implementacji. Nie będziemy zagłębiać się w te tematy w tej książce. Jeśli jednak chcesz, aby Twój kod działał dobrze, musisz formalnie przestudiować struktury danych i algorytmy