Stundas uzdevums: Saprast atšķirību starp "meklēt visu pēc kārtas" un "gudro meklēšanu". Tu izveidosi savus pirmos meklēšanas algoritmus, lai atrastu svarīgus spēles elementus spēlētāja inventārā, un sapratīsi, kāpēc datu kārtošana ir kritiska ātrdarbībai.
SR 2.4.19. (Gatavi algoritmi tipveida uzdevumu risēšanai - meklēšana)70 min darba sadalījums: 1. uzdevums (~20 min) - atjauno teorijas piemēru vai minimālo prototipu; 2. uzdevums (~25 min) - pielieto to galvenajā uzdevumā; 3. uzdevums (~25 min) - pārbaudi rezultātu, izlabo kļūdas un tikai beigās pieraksti vienu secinājumu. Papildus/4. līmeņa uzdevums ir paredzēts tikai tad, ja pamatdarbs ir pabeigts.
Pirms sāc: izmanto iepriekš apgūto un šīs lapas teorijas/koda piemērus. Ja vajadzīga jauna komanda vai rīks, vispirms atrodi tās paraugu teorijas sadaļā.
# Lineārā meklēšana - O(n)
def linear(saraksts, mērķis):
for i, x in enumerate(saraksts):
if x == mērķis:
return i
return -1
# Binārā meklēšana - O(log n) - saraksts JĀBŪT sakārtotam
def binary(saraksts, mērķis):
lo, hi = 0, len(saraksts) - 1
while lo <= hi:
mid = (lo + hi) // 2
if saraksts[mid] == mērķis: return mid
elif saraksts[mid] < mērķis: lo = mid + 1
else: hi = mid - 1
return -1
Pirms rakstām kodu, izveidosim pareizu struktūru mūsu jaunajai tēmai.
mkdir Tema7_Algoritmi
cd Tema7_Algoritmi
ni mekle_skaitli.py
code .
Sāksim ar lineāro meklēšanu. Tavs uzdevums ir izveidot funkciju, kas pārbauda spēlētāja inventāru.
mekle_skaitli.py izveido sarakstu ar nejaušiem priekšmetu ID numuriem.linear_search(saraksts, mekletais).for ciklu un enumerate(), lai ietu cauri sarakstam un atgrieztu indeksa numuru, kur priekšmets atrasts.-1.
def linear_search(inventars, meklejama_atslega):
for indekss, prieksmets in enumerate(inventars):
if prieksmets == meklejama_atslega:
return indekss
return -1
speletaja_inventars = [45, 12, 89, 3, 99, 21]
atraduma_vieta = linear_search(speletaja_inventars, 99)
print(f"Slepenā atslēga atrasta slotā: {atraduma_vieta}")
Lai izmantotu bināro meklēšanu, dati ir jāsakārto. Sagatavosim datus un simulēsim bināro meklēšanu.
nesakartoti_dati = [42, 15, 8, 99, 23, 4, 16, 81, 100, 5, 1, 33, 50, 60, 11].sorted(), lai izveidotu jaunu, sakārtotu sarakstu un to izdrukātu.""" ... """), kurā apraksti soļus, kā Tu, izmantojot binārās meklēšanas loģiku, atrastu skaitli 42 šajā sakārtotajā sarakstā.
nesakartoti_dati = [42, 15, 8, 99, 23, 4, 16, 81, 100, 5, 1, 33, 50, 60, 11]
sakartoti_dati = sorted(nesakartoti_dati)
print(f"Sakārtots inventārs: {sakartoti_dati}")
"""
Binārās meklēšanas simulācija skaitlim 42:
Saraksts: [1, 4, 5, 8, 11, 15, 16, 23, 33, 42, 50, 60, 81, 99, 100]
1. solis: Vidējais elements ir 23. 42 ir lielāks, atmetam kreiso pusi un 23.
2. solis: Jauns diapazons [33, 42, 50, 60, 81, 99, 100]. Vidējais ir 60. 42 ir mazāks, atmetam labo pusi.
3. solis: Jauns diapazons [33, 42, 50]. Vidējais ir 42. Atrasts! Pārbaudes prasīja 3 soļus.
"""
Cik lēna patiesībā ir lineārā meklēšana? Pārbaudīsim to ar miljonu ierakstiem!
import time.range() un list(), lai izveidotu sarakstu lieli_dati ar 1 000 000 secīgiem skaitļiem.linear_search funkciju.
import time
# Izveidojam milzīgu inventāru
lieli_dati = list(range(1000000))
# Mērām laiku
sakuma_laiks = time.time()
rezultats = linear_search(lieli_dati, 999999)
beigu_laiks = time.time()
pateretais_laiks = beigu_laiks - sakuma_laiks
print(f"Skaitlis atrasts indeksā: {rezultats}")
print(f"Lineārā meklēšana aizņēma: {pateretais_laiks:.5f} sekundes")