Autor Zpráva
Petr Ká
Profil
Dobrý den,

zřejmě tento dotaz by měl být zaveden spíše v "Databáze na webu", nicméně zpracování potřebuji vytvořit v php - generování výsledku.

Ale k dotazu:
Jedná se o klasický tipovací script výsledku sportovní události, kde soutěžící vyplní několik polí (centimetry; čas, ve který sportovec provede svůj výkon (zvlášť hodiny a minuty); kolikátý pokus). Takto nasbíraná data potřebuji ihned po ukončení soutěže seřadit dle toho, kdo tipl nejblíže...

Děkuji
DJ Miky
Profil
Nejdříve bys měl definovat, co přesně znamená nejblíže. Musíš mít vymyšlený algoritmus, jak výsledky řadit = jak spočítat vzdálenost od správného výsledku. Předpokládám, že třeba odchylka jednoho centimetru bude mít jinou váhu než odchylka jedné hodiny.
Petr Ká
Profil
DJ Miky:
Mělo by to mít priority:
1 - centimetry
2 - pokus
3 - čas
Alphard
Profil
Je třeba přesně definovat výpočty. Např. čas převést na sekundy, pak spočítat nějaké ohodnocení tipu rank = w1*abs(cm-cm') + w2*abs(time-time') + w3*abs(order-order'), kde wn jsou váhy jednotlivých parametrů. Pak lze snadno řadit podle rank.
Petr Ká
Profil
Chápu dobře, že by script měl vypadat nějak takhle ?

// Výsledky soutěže
$res_cm = 100;
$res_hour = 18;
$res_mins = 42;

$res_time = mktime($res_hour, $res_mins);

// zpracování výsledků
$results = array();
while($row = mysql_fetch_assoc($query)){
  $rank = 10 * abs( $res_cm - floatval( $row["cm"] ) ) + 5 * abs( $res_time - ( mktime($row["hour"], $row["hour"]) ) ) + 1 * abs( $pok - $res_pok );
  $results[$rank][] = $row;
}
krsort($results);

... navíc jsem se uvědomil další problém. Jak to pak vyřešit, když sportovců je několik (mnoho výsledků) a soutěžících v tipovací soutěži také?
Alphard
Profil
Je to jedna z možností, jak by to fungovat mohlo. Jen bych teda ten algoritmus dal přimo sql souboru a řadil už tam.

Ten problém n sportovců a m soutěžících zase závisí na tom, co chcete najít. Absolutně nejmenší odchylku kteréhokoliv sportovce a soutěžícího?
Petr Ká
Profil
Alphard:
Přesně tak... Na úrovni MySQL si nějak nedokážu představit ten dotaz.
Alphard
Profil
O kolika záznamech se bavíme? Jako nejjednodušší se mi zdá jít na to hrubou silou, tedy kartézský součin (join bez spojovací podmínky), vypočítat rank pro každou dvojici a seřadit.
Petr Ká
Profil
Alphard:
Uvedu příklad..

30 sportovců * 3 pokusy každý = 90 výsledků
předpokládaný počet soutěžících 700 - 1000 lidí

edit
Každý soutěžící má 1 pokus tipování.
Navíc se rozlišuje, tip na ženský výkon a mužský výkon, to je zřejmě důležité a zapoměl jsem dodat...
Kcko
Profil
Petr Ká:
Zkuste se mrknout http://www.rjwebdesign.cz/Blog/PHP/20080113-Generovani-Nejen-Fotbalove-Tabulky
Zde jsou nastíněny možnosti jak tabulku generovat (za běhu, nebo ji lze předpočítat)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: