Vai al contenuto principale
ProdottiStrumenti desktopTASTECADVisualizzazione disegniTASTEFILESGestione fileTASTEFTPTrasferimento fileTASTESSHSpazio di lavoro remotoTASTEZIPCompressione ed estrazioneStrumenti per sviluppatoriTASTECODEAmbiente di sviluppo integrato per RustTASTESTUDIOAmbiente integrato di sviluppo e testTASTEETLIntegrazione dati (ETL)ServerTASTEREMOTEServer di desktop remotoTASTEGEOServer geospazialeTASTEMAILSpazio di lavoro emailIniziaDownloadDocumentazioneAcquistaTutti i prodotti
Marketplace
Notizie
TecnologiaNotizieNotizie di sviluppo di oggiDocumentazioneLinguaggi di programmazioneRustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDartFramework frontend webNext.jsReactVue.js · NuxtSvelteKitAngularFramework serverSpring BootDjangoFastAPIASP.NET CoreNestJS · ExpressFramework per app e desktopTauriFlutterReact NativeElectronAlgoritmiBasi degli algoritmiAlgoritmi fondamentaliAlgoritmi avanzatiAlgoritmi pratici
CommunityProgettiLog di sviluppoPromptProblemi degli strumenti di IAVetrinaGuida alla community
CollaboraTrasferimento tecnicoRealizzazione del sito webRealizzazione di app desktopPipeline di rilascio e pagamentoPartner commercialeContatti
ServiziDesktop remotoPacchetti di installazione su misura
TASTEDEV
Prodotti

Strumenti desktop

TASTECADApri con leggerezza anche i disegni più complessiTASTEFILESSolo i file che servono, alla massima velocitàTASTEFTPLa via più ordinata per i tuoi fileTASTESSHUn legame più solido tra te e i tuoi serverTASTEZIPComprimi più veloce, estrai più sicuro

Strumenti per sviluppatori

TASTECODEModifica, compila, esegui il debug e testa app Rust in un'unica finestraTASTESTUDIODalla modifica ai test remoti e alle correzioni IA approvateTASTEETLSposta i dati guardando i valori

Server

TASTEREMOTEUn desktop remoto che gira sul tuo serverTASTEGEOUn server geospaziale compatibile con GeoServer, ricostruito in RustTASTEMAILRiprendi il controllo della tua posta

Inizia

DownloadUltime versioni di ogni prodottoDocsCome usare ogni prodottoAcquistaAbbonamenti e licenze perpetueTutti i prodottiTutti i prodotti a colpo d’occhio
Tutti i prodotti
MarketplaceNotizie
Tecnologia

Notizie

Notizie di sviluppo di oggiAnnunci ufficiali su linguaggi, framework, GitHub e IADocumentazioneGuide a linguaggi, framework e algoritmi

Linguaggi di programmazione

RustTypeScriptJavaScriptPythonGoC#JavaCC++KotlinDart

Framework

Framework frontend webNext.jsReactVue.js · NuxtSvelteKitAngular
Framework serverSpring BootDjangoFastAPIASP.NET CoreNestJS · Express
Framework per app e desktopTauriFlutterReact NativeElectron

Algoritmi

Basi degli algoritmiAnalisi della complessità · Ordinamento · Ricerca · Strutture dati di base · Alberi e heapAlgoritmi fondamentaliVisita dei grafi · Cammini minimi e alberi ricoprenti · Programmazione dinamica · Algoritmi greedy · Divide et impera · BacktrackingAlgoritmi avanzatiAlgoritmi sulle stringhe · Matematica e teoria dei numeri · Manipolazione dei bit · Alberi di segmenti · Union-FindAlgoritmi praticiStrategia per colloqui di programmazione · Cache LRU · Rate limiting · Hashing consistente
Tutta la documentazione di sviluppo
Community
ProgettiScopri sviluppatori e lavoriLog di sviluppoDecisioni e lezioni appresePromptIstruzioni riutilizzabiliProblemi degli strumenti di IAProblemi e alternative di Claude, Codex, GeminiVetrinaRisultati completatiGuida alla communityCome sviluppiamo in modo aperto
Collabora
Trasferimento tecnicoApp native in Rust ed eguiRealizzazione del sito web10 lingue, account, documentazione e downloadRealizzazione di app desktopRust ed egui, senza WebViewPipeline di rilascio e pagamentoFirma, MSI, deb, rpm, AppImage, hashPartner commercialeConsigliaci e ricevi il 30%ContattiSviluppo, partnership e investimenti
Servizi
Desktop remotoRaggiungi il tuo computer dal browserPacchetti di installazione su misuraSolo il necessario, impostazioni precaricate
Acquista
IT
한국어EnglishDeutschEspañolFrançaisItalianoPortuguês (Brasil)日本語简体中文繁體中文
Accedi
Accedi
TASTEDEV

Dai piccoli strumenti a uno sviluppo migliore.

support@tastedev.netSostieni TASTEDEV
ProdottiGamma di prodottiAcquistaDocsDownloadMarketplaceAssistenza
CommunityProgettiLog di sviluppoPromptProblemi degli strumenti di IAVetrina
NormeInformativa sulla privacyTermini di servizioCondizioni di abbonamentoRimborsiLinee guida della community
AccountAccediRegistrati
Visitatori
Oggi
012345678901234567890123456789012345678901234567890123456789
Ieri
012345678901234567890123456789012345678901234567890123456789
Visualizzazioni totali
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
Società
GXSOFT
Rappresentante
CHOI YOUNG GU
Numero di registrazione
853-44-00368
Indirizzo
9F V24, 351 Gyeongin-ro, Michuhol-gu, Incheon, Republic of Korea
Telefono
+82-10-4404-1523
E-mail
whitecalvin@tastedev.net
Responsabile privacy
CHOI YOUNG GU

© 2026 TASTEDEVLe informazioni sui prodotti si basano su fonti di sviluppo verificate.Rilasciato · in miglioramento

Documentazione di Analisi della complessità
Analisi della complessità
Complexity Analysis ConceptsHow It Works: From Counting Operations to the Master TheoremImplementation: Measuring Three Growth RatesComplexity: Common Classes, Amortized Cost and SpacePractice ProblemsReal-World Use
Discussioni

Guida a Analisi della complessità · 4/6

Complexity: Common Classes, Amortized Cost and Space

Per ora questo capitolo è disponibile solo in inglese.

This chapter compares the growth rates you meet most often, uses amortized analysis to explain why appending to a dynamic array is "O(1) on average", and covers space complexity including the recursion stack.

Common complexity classes

ClassNameTypical exampleWhen n doubles
O(1)ConstantArray indexing, hash lookup (average)Unchanged
O(log n)LogarithmicBinary search, balanced tree lookupOne more step
O(n)LinearLinear search, summing2x
O(n log n)LinearithmicMerge sort, heapsortA bit more than 2x
O(n²)QuadraticAll pairs, insertion sort (worst)4x
O(2ⁿ)ExponentialListing all subsetsSquared (2x per extra element)
O(n!)FactorialListing all permutationsExplodes

Rough operation counts make the gaps obvious:

nlog₂ nn log₂ nn²2ⁿn!
103.3331001,024about 3.6 × 10⁶
1006.666410⁴about 1.3 × 10³⁰about 9.3 × 10¹⁵⁷
1,00010about 10⁴10⁶about 10³⁰¹out of reach
10⁶20about 2 × 10⁷10¹²out of reachout of reach

As a rule of thumb, compiled languages do around 10⁸ simple operations per second and Python around 10⁷. At n = 10⁵ an O(n²) algorithm needs 10¹⁰ operations, tens of seconds even in C++. That estimate is how you read the input limits of a coding problem:

Input size nRoughly feasible in one second
about 10O(n!),
Domande su questo capitolo?
Capitolo precedenteImplementation: Measuring Three Growth RatesCapitolo successivoPractice Problems
O(2ⁿ · n)
about 20O(2ⁿ)
about 500O(n³)
about 5,000O(n²)
10⁵ to 10⁶O(n log n), O(n)
largerO(log n), O(1)

Amortized analysis: appending to a dynamic array

Python's list, C++'s std::vector and Java's ArrayList allocate a bigger array and copy every element when the current one is full. That one append costs O(n), but if capacity grows by a constant factor, n appends cost O(n) in total, so each costs O(1) amortized.

Doubling the capacity copies 1 + 2 + 4 + ... elements; the last term is smaller than n, so the sum is always below 2n. Growing by a fixed amount instead (say 10 slots) copies 10 + 20 + 30 + ... elements, which adds up to O(n²).

def total_copies(n, grow):
    capacity, size, copies = 1, 0, 0
    for _ in range(n):
        if size == capacity:
            copies += size              # copy existing elements to the new array
            capacity = grow(capacity)
        size += 1
    return copies

for n in (1_000, 10_000, 100_000):
    doubling = total_copies(n, lambda c: c * 2)
    plus_ten = total_copies(n, lambda c: c + 10)
    print(n, doubling, plus_ten)
# 1000 1023 49600
# 10000 16383 4996000
# 100000 131071 499960000

Doubling stays proportional to n (under 2n), while growing by ten multiplies the copies by about 100 when n grows tenfold. Unlike average-case analysis, amortized analysis involves no probability: it is a guarantee over the whole sequence of operations. CPython's list grows by about 1.125x plus a small constant, which still gives amortized O(1). You can watch the allocation change only occasionally:

import sys

items, last = [], sys.getsizeof([])
for i in range(40):
    items.append(i)
    size = sys.getsizeof(items)
    if size != last:
        print(len(items), size)   # only lengths where a reallocation happened
        last = size

Space complexity

Total space includes the input; auxiliary space excludes it. An "in-place" algorithm usually means O(1) or O(log n) auxiliary space. Every recursive call uses a stack frame, so recursion depth is a space cost.

def sum_recursive(items, i=0):      # time O(n), stack space O(n)
    if i == len(items):
        return 0
    return items[i] + sum_recursive(items, i + 1)

def sum_iterative(items):           # time O(n), auxiliary space O(1)
    total = 0
    for x in items:
        total += x
    return total

print(sum_iterative(range(100_000)))   # 4999950000
# sum_recursive(list(range(100_000))) exceeds the default recursion limit (about 1000): RecursionError
AlgorithmTime (worst)Auxiliary space
Linear searchO(n)O(1)
Binary search (loop)O(log n)O(1)
Binary search (recursive)O(log n)O(log n)
Merge sortO(n log n)O(n)
QuicksortO(n²), average O(n log n)O(log n) on average
Two-sum (hash map)O(n) averageO(n)

Summary

  • Differences between classes dwarf constant factors as n grows, and input limits tell you which class you need.
  • Dynamic arrays grow by a factor, which makes append amortized O(1); growing by a fixed amount makes it O(n²) overall.
  • Space complexity includes auxiliary memory and recursion depth.

0 commenti

Commenti principaliPrima i più recenti

Accedi · Accedi per lasciare un commento.