Explici frecvența
Identifici numărul de apariții al unei valori.
Construirea și utilizarea listei de frecvențe
Identifici numărul de apariții al unei valori.
Asociezi fiecărei valori din domeniu o poziție în lista de frecvențe.
Parcurgi domeniul în ordine și adaugi fiecare valoare de numărul ei de ori.
Identifici condiția domeniului mic și cunoscut și analizezi timpul și memoria.
Care este ideea centrală a lecției?
Lista de frecvențe nu compară elementele între ele. Ea numără de câte ori apare fiecare valoare.
Dacă valorile sunt note între 1 și 10, putem folosi frecventa[nota] pentru a memora numărul aparițiilor. După numărare, parcurgem valorile 1, 2, ..., 10 și reconstruim lista sortată.
Metoda este potrivită când domeniul valorilor este mic și cunoscut. Dacă avem puține elemente, dar miliarde de valori posibile, o listă de frecvențe poate ocupa multă memorie inutil.
Imaginează-ți că avem 10 casete, numerotate de la 1 la 10. Pentru fiecare valoare citită, punem un semn în caseta corespunzătoare. Nu mutăm valorile între ele în această etapă; doar numărăm de câte ori apare fiecare valoare.
Apasă valorile în ordinea în care apar în vectorul [5, 3, 5, 2, 3]. După fiecare apăsare vezi imediat modificarea frecvenței.
Pasul 0 din 5. Nu a fost citită nicio valoare.
După ce frecvențele sunt complete, citim valorile de la 1 la 10. Pentru exemplul [5, 3, 5, 2, 3], rezultatul final este [2, 3, 3, 5, 5]. Fiecare valoare este adăugată de numărul de ori indicat de frecvența ei.
Reconstrucția începe după ce toate valorile au fost numărate.
Aici va apărea, pas cu pas, ce se întâmplă.
Construim frecvențele:
valori = [5, 3, 5, 2, 3]
frecventa = [0] * 11
for x in valori:
frecventa[x] += 1
print(frecventa)
Reconstruim lista sortată:
sortata = []
for x in range(1, 11):
for k in range(frecventa[x]):
sortata.append(x)
print(sortata)
Poziția 0 este neutilizată, astfel încât indicele coincide cu valoarea notei.
Algoritm Frecvente
citește n și lista a
creează frecventa pentru toate valorile posibile
pentru fiecare x din a execută
frecventa[x] ← frecventa[x] + 1
sfârșit pentru
pentru x în domeniul valorilor, în ordine crescătoare, execută
repetă frecventa[x] ori
scrie x / adaugă x în lista sortată
sfârșit repetă
sfârșit pentru
SFÂRȘIT ALGORITM
La un test, n elevi au obținut note întregi între 1 și 10. Sortează notele crescător folosind o listă de frecvențe.
Date de intrare: n și n note din [1,10]. Date de ieșire: notele în ordine crescătoare. Numărăm fiecare notă, apoi parcurgem domeniul 1–10 și reconstruim lista.
n = int(input())
frecventa = [0] * 11
for i in range(n):
nota = int(input())
frecventa[nota] += 1
sortata = []
for nota in range(1, 11):
for k in range(frecventa[nota]):
sortata.append(nota)
print(sortata)
Pentru [8,5,10,5,7], avem frecventa[5]=2, frecventa[7]=1, frecventa[8]=1, frecventa[10]=1. Reconstrucția produce [5,5,7,8,10].
Caz normal: [8,5,10,5,7]; caz-limită: [6]; caz particular: toate notele 10; toate notele egale; fiecare notă apare o singură dată.
Fiecare element incrementează exact o singură dată frecvența valorii sale. Parcurgerea domeniului în ordine crescătoare și repetarea fiecărei valori conform frecvenței produce toate valorile, în ordinea cerută. Pentru domeniu de dimensiune m, timpul este O(n+m), iar memoria suplimentară este O(m).
1. Ce memorează frecventa[x]?
2. Când este potrivită metoda?
3. Câte poziții folosim pentru note 1–10 dacă poziția 0 rămâne neutilizată?
4. Cum reconstruim lista?
5. Care este timpul în funcție de n și m?
6. Care este memoria suplimentară?
citește n note între 1 și 10, construiește lista de frecvențe, afișează distribuția, lista sortată, nota cu frecvența maximă și procentul elevilor care au obținut cel puțin 5. Extensie: afișează o reprezentare textuală de tipul „5: *****”.
Recitește algoritmul, verifică testele și justifică alegerea metodei.