Școala Româno-Britanică
Modulul 4 Clasa a IX-a | Python

Ora 4: Sortarea cu listă de frecvențe

Ce vei învăța astăzi: Sortarea cu listă de frecvențe

Rezultat practic: Sortezi date cu valori într-un interval mic folosind lista de frecvențe (Competența 3.2).

Competența 3.2 Săptămâna 19

Înainte de a începe

De ce contează? Când valorile sunt numere întregi dintr-un interval mic (note de la 1 la 10, punctaje de la 0 la 100), lista de frecvențe sortează fără nicio interschimbare, mult mai rapid decât selecția sau bulele.

Ce știi deja?

Ai folosit liste cu index și ai văzut cum o buclă poate număra valori, de exemplu suma unor termeni generați. Cum ai număra, doar cu o buclă, de câte ori apare nota 10 într-o listă de note?

Ideea-cheie: Pe fiecare poziție i a unei liste de frecvențe reținem de câte ori apare valoarea i, apoi afișăm fiecare valoare de atâtea ori cât arată frecvența ei.
SINTEZĂ TEORETICĂ ȘI EXEMPLE GHIDATE

Ce vei învăța astăzi?

După această lecție vei învăța să sortezi o listă cu ajutorul unei liste de frecvențe (o listă în care fiecare poziție i arată de câte ori apare valoarea i), o metodă rapidă pentru valori dintr-un interval mic.

Ideea listei de frecvențe
Când este utilă (valori într-un interval mic)
Construirea frecvențelor și afișarea sortată
Avantajele metodei

Ideea listei de frecvențe

Definiție: O listă de frecvențe reține, pe fiecare poziție i, de câte ori apare valoarea i în șir. Apoi parcurgem pozițiile în ordine și afișăm fiecare valoare de atâtea ori cât arată frecvența ei.

Analogia cu tabelul de note

Este ca un tabel cu notele clasei: o căsuță pentru fiecare notă posibilă (1, 2, ..., 10), în care punem câte o însemnare pentru fiecare elev.

La final, citim căsuțele în ordine și scriem notele: cinci note de 5, trei note de 7, și așa mai departe.

Când este utilă lista de frecvențe

Este utilă când valorile sunt numere întregi dintr-un interval mic (între o valoare minimă și una maximă apropiate), de exemplu note de la 1 la 10 sau punctaje de la 0 la 100.

Dacă valorile sunt foarte mari și diferite, lista de frecvențe ar fi uriașă, așa că folosim alte metode.

Situație Metoda recomandată Motivul
Note de la 1 la 10 Lista de frecvențe Interval mic, rapid și simplu
Scoruri de la 0 la 100 Lista de frecvențe Interval rezonabil (101 valori)
Valori mari, oricât de diferite Selecția minimului sau bulele Nu depind de mărimea valorilor

Implementarea

Pașii sunt: (1) construim lista fr, cu 0 pe fiecare poziție (această pregătire a listei se numește inițializare); (2) pentru fiecare valoare x creștem fr[x] cu 1; (3) parcurgem pozițiile și afișăm fiecare valoare de câte ori apare.

Exemplu: sortarea notelor (1-10)

fr = [0, 0, ..., 0] (max + 1 elemente) pentru fiecare x din listă execută fr[x] = fr[x] + 1 pentru i = 1, max execută de fr[i] ori: scrie i
Python - lista de frecvențe
note = [7, 5, 9, 5, 8, 7, 10, 5]
fr = [0] * 11

for x in note:
    fr[x] = fr[x] + 1

for i in range(1, 11):
    for _ in range(fr[i]):
        print(i, end=" ")

Observă: nota 5 apare de 3 ori, deci 5 este afișat de 3 ori. Rezultatul: 5 5 5 7 7 8 9 10.

Avantajele metodei

Lista de frecvențe este foarte rapidă pentru intervale mici, nu face nicio interschimbare și păstrează valorile identice împreună.

Viteză

O singură parcurgere pentru frecvențe, apoi o afișare simplă

Fără interschimbări

Nu mutăm elemente, doar numărăm aparițiile

Exercițiu de completare

Completează descrierea sortării cu lista de frecvențe:

Construim o listă de ______ în care fiecare poziție arată de câte ori apare valoarea. Lista se inițializează cu ______. Pentru fiecare valoare x scriem fr[x] ______ 1. La final parcurgem pozițiile cu o buclă ______.

Bancă de cuvinte:
frecvență 0 += for

Test de înțelegere

Test rapid - lista de frecvențe:

1. Sortarea cu lista de frecvențe este potrivită când:

2. Lista de frecvențe pentru note de la 1 la 10 are:

3. După sortare, valoarea 5 apare de:

Test suplimentar - verifică ce ai reținut

Test rapid suplimentar - lista de frecvențe:

1. Lista de frecvențe este eficientă când valorile sunt:

2. frecv[x] reține:

3. Complexitatea sortării cu lista de frecvențe este:

Ai grijă la: lista de frecvențe trebuie să aibă o poziție pentru fiecare valoare posibilă: pentru note de la 1 la 10 ai nevoie de 11 elemente ([0] * 11), altfel accesul fr[10] iese în afara listei.

Aprofundare

Lista de frecvențe nu sortează doar: ea numără aparițiile fiecărei valori, ceea ce o face utilă și pentru alte întrebări, de exemplu „care este valoarea care apare cel mai des?" (moda unui șir de note).

  • Valori care nu încep de la 0 sau 1: dacă valorile sunt în intervalul [min, max], folosim un decalaj: frecvența valorii x se ține pe poziția x - min, iar lista are max - min + 1 elemente.
  • Valori negative: cu decalajul de mai sus putem sorta și valori negative, pentru că poziția se calculează relativ la minim.
  • Memorie: lista de frecvențe consumă memorie proporțională cu intervalul de valori, nu cu numărul de elemente; pentru un interval de un milion de valori, lista devine mare și metoda devine nepotrivită.
  • Fără interschimbări: metoda nu mută elementele, ci doar le numără; valorile identice rămân întotdeauna grupate.
  • Verificarea corectitudinii: suma tuturor frecvențelor trebuie să fie egală cu numărul total de valori citite; aceasta este o verificare rapidă pe hârtie.
  • Complexitate: construirea frecvențelor parcurge lista o singură dată (n operații), iar afișarea parcurge intervalul (max operații); în total O(n + max).
APLICARE ȘI REZOLVARE DE PROBLEME

PbInfo - Sortare cu listă de frecvențe

Enunț:

Cerință: Se citesc n note, numere întregi între 1 și 10. Să se afișeze notele sortate crescător, folosind lista de frecvențe.

Date de intrare:

Programul citește de la tastatură numărul n, apoi cele n note.

Date de ieșire:

Programul va afișa notele sortate crescător, separate prin spații.

Restricții și precizări:

n este un număr natural, cu 1 <= n <= 1000, iar elementele sunt numere întregi.

Exemplu:

Intrare:

8
7 5 9 5 8 7 10 5

Ieșire:

5 5 5 7 7 8 9 10
Cum gândim soluția:
  1. Citim n și vectorul v
  2. Construim fr = [0] * 11 și incrementăm fr[x] pentru fiecare notă x
  3. Parcurgem i de la 1 la 10 și afișăm i de fr[i] ori
Scrie soluția în Python:
Soluție corectă:
Soluție Python
n = int(input())
v = list(map(int, input().split()))
fr = [0] * 11

for x in v:
    fr[x] = fr[x] + 1

for i in range(1, 11):
    for _ in range(fr[i]):
        print(i, end=" ")

Ce învățăm: construim frecvențele întâi, apoi folosim o buclă dublă pentru a afișa fiecare valoare de câte ori apare.

PbInfo - Frecvența maximă

Enunț:

Cerință: Se citesc n note, numere întregi între 1 și 10. Să se afișeze nota care apare de cele mai multe ori și de câte ori apare.

Date de intrare:

Programul citește de la tastatură numărul n, apoi cele n note.

Date de ieșire:

Programul va afișa valoarea cu frecvența maximă și frecvența ei.

Restricții și precizări:

n este un număr natural, cu 1 <= n <= 1000, iar elementele sunt numere întregi.

Exemplu:

Intrare:

8
7 5 9 5 8 7 5 5

Ieșire:

5 4
Cum gândim soluția:
  1. Construim lista de frecvențe fr
  2. Calculăm frecvența maximă cu max(fr)
  3. Găsim valoarea cu fr.index(m)
Scrie soluția în Python:
Soluție corectă:
Soluție Python
n = int(input())
v = list(map(int, input().split()))
fr = [0] * 11

for x in v:
    fr[x] = fr[x] + 1

m = max(fr)
print(fr.index(m), m)

Ce învățăm: max() ne dă frecvența cea mai mare, iar index() ne spune care valoare are acea frecvență.

EXERCIȚII PRACTICE

Exercițiul Practic: Sortarea cu lista de frecvențe

Sarcini de lucru

Aplică sortarea cu lista de frecvențe în programe complete și explorează detalii despre note.

Sarcina 1: 10 note descrescător

Cerință: Scrie un program care citește 10 note și le afișează sortate descrescător, folosind lista de frecvențe.

Soluție:
note = []
for i in range(10):
    note.append(int(input()))

fr = [0] * 11
for x in note:
    fr[x] = fr[x] + 1

for i in range(10, 0, -1):
    for _ in range(fr[i]):
        print(i, end=" ")

Verifică: pentru notele 7 5 9 5 8 7 10 5 8 6 se afișează 10 9 8 8 7 7 6 5 5 5. Parcurgem pozițiile de la 10 în jos.

Sarcina 2: Câte note de fiecare fel

Cerință: Scrie un program care citește n note și afișează, pentru fiecare notă întâlnită, de câte ori apare.

Soluție:
n = int(input())
v = list(map(int, input().split()))
fr = [0] * 11

for x in v:
    fr[x] = fr[x] + 1

for i in range(1, 11):
    if fr[i] > 0:
        print(i, "apare de", fr[i], "ori")

Verifică: cu notele 7 5 9 5 8 se afișează câte o linie pentru fiecare notă întâlnită, cu frecvența ei.

Scrie pe caiet - De reținut

Titlul lecției

Sortarea cu listă de frecvențe

Definiția lecției

Lista de frecvențe este o metodă de sortare foarte rapidă pentru valori întregi dintr-un interval mic, de exemplu note de la 1 la 10 sau punctaje de la 0 la 100. Construim o listă fr în care poziția i reține de câte ori apare valoarea i în șir: pentru fiecare x executăm fr[x] = fr[x] + 1. La final parcurgem pozițiile în ordine și afișăm fiecare valoare i de fr[i] ori, obținând lista sortată fără nicio interschimbare. Metoda păstrează valorile identice împreună și consumă memorie proporțională cu intervalul de valori, nu cu numărul elementelor. De exemplu, pentru notele [7, 5, 9, 5, 8, 7, 10, 5], frecvențele sunt fr[5] = 3, fr[7] = 2, fr[8] = 1, fr[9] = 1, fr[10] = 1, iar afișarea dă 5 5 5 7 7 8 9 10.

Definiții esențiale

Algoritmul cheie - pseudocod

fr = [0, 0, ..., 0] (max + 1 elemente) pentru fiecare x din listă execută fr[x] = fr[x] + 1 pentru i = 1, max execută de fr[i] ori: scrie i

Algoritmul cheie - cod Python

Python - sortarea notelor cu frecvențe
note = [7, 5, 9, 5, 8, 7, 10, 5]
fr = [0] * 11

for x in note:
    fr[x] = fr[x] + 1

for i in range(1, 11):
    for _ in range(fr[i]):
        print(i, end=" ")

Greșeli comune de evitat

Sfaturi practice și trucuri

Exemplu practic

Profesorul centralizează notele clasei la o evaluare și le afișează ordonate crescător, folosind lista de frecvențe pentru note de la 1 la 10:

Python - note ordonate cu frecvențe
note = [7, 5, 9, 5, 8, 7, 10, 5]
fr = [0] * 11

for x in note:
    fr[x] = fr[x] + 1

for i in range(1, 11):
    for _ in range(fr[i]):
        print(i, end=" ")

Verifică: pentru notele de mai sus se afișează 5 5 5 7 7 8 9 10.