Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Ruby: Moodit

JRokka [29.11.2019 12:16:42]

#

Etsitään moodit. Moodeja voi olla useampi.

Koodi

luvut = [12,12,2,2,7,2,12,12,15,10]
maara = 0
moodiMaara = 0
mooditLuku = [] #Moodeja voi olla useampi.
#Järjestetään taulukko, jotta sitä olisi helpompi käsitellä.
for x in (0..luvut.length-1)
 for y in (x+1..luvut.length-1)
  if (luvut[x] > luvut[y])
   temp = luvut[x]
   luvut[x] = luvut[y]
   luvut[y] = temp
  end
 end
end
#Otetaan minimi ja maksimi.
minimi = luvut[0]
maksimi = luvut[luvut.length-1]
#Lasketaan lukujen määrä.
#Etsitään samalla moodi.
for x in (minimi..maksimi)
 #Lasketaan luvun määrä.
 maara = 0
 for y in (0..luvut.length-1)
  if (x == luvut[y])
   maara += 1
  end
 end
 if (maara > moodiMaara)
  moodiMaara = maara
 end
end
#Etsitään moodit.
#Moodeja voi olla useampi.
for x in (minimi..maksimi)
 #Lasketaan luvun määrä.
 maara = 0
 for y in (0..luvut.length-1)
  if (x == luvut[y])
   maara += 1
  end
 end
 if (maara == moodiMaara)
  mooditLuku.append(x)
 end
end
#Näytetään tulos.
puts "Moodit:"
for x in (0..mooditLuku.length)
 puts mooditLuku[x]
end

Metabolix [29.11.2019 13:43:24]

#

Miksi käytät järjestämiseen omaa vaihtolajittelua? Lajittelun voi koodata itse harjoituksena kerran, mutta sitten kannattaa selvittää, mistä sen saa valmiina. Yleensä standardikirjaston lajittelu on myös nopeampi kuin vaihtolajittelu. Esimerkiksi Rubyssa listalla on suoraan sort-metodi.

Lisäksi kannattaisi oikeasti miettiä järkeviä ja toimivia algoritmeja. Nyt käyt läpi kaikki kokonaisluvut pienimmän ja suurimman luvun väliltä. Kokeile, miten koodisi toimii, kun laitat taulukkoon luvut 1 ja 2**60. Ei toimi hyvin!

Oikeasti toimiva ratkaisu ongelmaan on Hash-rakenteen käyttö, johon voi suoraan laskea jokaisen luvun lukumäärän (myös ilman taulukon järjestämistä). Toinen vaihtoehto on käydä läpi järjestetty taulukko, pitää kirjaa nykyisen luvun määrästä ja tarvittaessa lisätä luku moodeihin tai tyhjentää mooditaulukko.

En jaksa Rubylla tehdä, mutta Python on aika lähellä.

def moodit_1(lista):
	määrät = dict()
	for i in lista:
		if i in määrät:
			määrät[i] += 1
		else:
			määrät[i] = 1
	maksimi = max(määrät.values())
	return [i for i, n in määrät.items() if n == maksimi]

def moodit_2(lista):
	moodit, maksimi, nykyinen = [], 0, None
	for i in sorted(lista):
		if i != nykyinen:
			nykyinen, määrä = i, 1
		else:
			määrä += 1
		if määrä > maksimi:
			moodit, maksimi = [i], määrä
		elif määrä == maksimi:
			moodit.append(i)
	return moodit

Tässä nimenomaisessa tapauksessa voisi käyttää Pythonissa myös suoraan Counter-luokkaa, joka laskee lukujen määrät ja jolta voi suoraan kysyä, mitä lukua on eniten.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta