Nov D: De største tal

Best-/worst-case for get_big, Big O, og en lineær top-five-algoritme.

Funktionen nedenfor tager som input en liste med tal og returnerer en ny liste med alle tal større end 1000:

def get_big(numbers):
    big_numbers = []
    for num in numbers:
        if num > 1000:
            big_numbers.append(num)
    return big_numbers

Hver sammenligning (num > 1000) og hver tilføjelse (big_numbers.append(num)) tæller som 1 operation. Længden af numbers er $n$.

Spørgsmål D.1

Hvad er henholdsvis best-case og worst-case tidskompleksiteten $T(n)$ af funktionen målt i antal operationer?

Vis svar Skjul svar
Svar D.1

Algoritmen gennemløber alle $n$ tal og sammenligner med 1000 ($n$ sammenligninger). Alle tal større end 1000 tilføjes til den nye liste.

  • Best-case (alle tal $\leq 1000$): $T(n)=n$.
  • Worst-case (alle tal $>1000$): $T(n)=2n$.

Best: $T(n)=n$; worst: $T(n)=2n$

Spørgsmål D.2

Hvad er kompleksiteten i store-O notation?

Vis svar Skjul svar
Svar D.2

Både best- og worst-case er lineære (største term proportional med $n$).

$O(n)$

En simpel måde at finde de fem største tal er at sortere listen:

top_five = sorted(numbers)[-5:]

Kompleksiteten af sortering er $O(n\log n)$. Alternativt kan man bruge:

top_five = numbers[0:5]
smallest_in_top_five = min(top_five)
for num in numbers[5:]:
    if num > smallest_in_top_five:
        top_five.remove(smallest_in_top_five)
        top_five.append(num)
        smallest_in_top_five = min(top_five)

Algoritmen starter med de første fem tal. Herefter gennemløbes resten; hver gang et tal er større end det mindste i top_five, erstattes det mindste. Til sidst indeholder top_five de fem største tal.

Spørgsmål D.3

Hvad skal gælde for listen numbers for at opnå henholdsvis et best-case og et worst-case tilfælde?

Vis svar Skjul svar
Svar D.3

Best-case: de fem største tal ligger først på listen, så top_five aldrig skal opdateres.

Worst-case: hvert nyt tal er større end det mindste i top_five — fx hvis listen er sorteret i stigende rækkefølge.

Best: fem største først; worst: stigende / altid opdater

Spørgsmål D.4

Hvad er kompleksiteten af denne algoritme i store-O notation?

Vis svar Skjul svar
Svar D.4

Algoritmen gennemløber alle tal og foretager en konstant, $O(1)$, mængde beregninger for hvert element (listen top_five har fast længde 5). Samlet er algoritmen $O(n)$.

$O(n)$