Diskuze: Jak nejlépe porovnat čísla
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
ja presne neviem ako to v PHP funguje ale urobil by som to tak, že by som si z rozsahov urobil slovník, kde kľúč by bol dolná hranica a hodnota by bola vrchná hranica, prešiel by som to binárnym vyhľadávaním nejako takto, je to skôr pseudokód ale
binSearch(Dict, val):
lo = 1, hi = size(Dict)
while lo <= hi:
mid = lo + (hi-lo)/2
if Dict[mid].key <= val && Dict[mid].value >= val
return true
else if Dict[mid].key < target
lo = mid+1
else
hi = mid-1
return false
a to isté by som urobil aj s tou množinou čísel. takto by som ju prešiel s tým, že by som porovnával priamo čísla, čiže namiesto
//namiesto tohoto
if Dict[mid].key <= val && Dict[mid].value >= val
//toto
if Dict[mid] == val
takto to hľadané číslo nájdeš, resp. nenájdeš v logaritmickom čase.
Máš už tu množinu nějak uloženou v nějakém poli? ukaž to pole (stačí pár prvků) tak jak to v tom PHP máš...
V poli to nemám, zatím. Nicméně do pole to asi nemám problém dát. Jedná se o ty čísla, které jsem napsal.
$rozsah = array(
10000 => 19999,
37001 => 37021,
30100 => 32800,
40003 => 40020,
46001 => 46020,
50001 => 50012,
53001 => 53020,
53351 => 53354,
60010 => 64700,
70002 => 73001,
76001 => 76007,
77002 => 77900
);
$cisla = array(
65502, 65691, 65805, 65856, 50101, 50301, 50302, 50311, 50321, 50332,
50341, 46177, 46302, 46303, 46311, 46312, 78301, 78302, 78371, 53078,
53141, 53215, 53231, 53301, 53331, 53333 ,40001, 76302, 76311, 76314
);
sort($cisla);
$tmp1 = bin_search_dict($rozsah, 15000); //slovnik rozsahov
$tmp2 = bin_search($cisla, 53334); //zoznam cisel
function bin_search_dict($array, $value){
$keys = array_keys($array);
$hi = count($array);
$lo = 0;
while($lo<=$hi){
$mid = floor($lo + ($hi-$lo)/2);
if($keys[$mid]<=$value && $array[$keys[$mid]]>=$value){
return true;
}elseif($keys[$mid]<$value){
$lo = $mid+1;
}else{
$hi = $mid-1;
}
}
return false;
}
function bin_search($array, $value){
$hi = count($array);
$lo = 0;
while($lo<=$hi){
$mid = floor($lo + ($hi-$lo)/2);
if($array[$mid]==$value){
return true;
}elseif($array[$mid]<$value){
$lo = $mid+1;
}else{
$hi = $mid-1;
}
}
return false;
}
zabudol som podotknúť, že na to aby to fungovalo to musí byť zoradené vzostupne.
U rozsahu jsem to chtěl řešit podobně, tedy postupně procházet jednotlivé rozsahy. Co se týká těch daných čísel, nestačilo by použit funkci in_array?
Ak je ten list nezoradený tak je in_array lepšia varianta, ak zoradený je tak toto je rýchlejšie.
Když to udělám takto, je na tom něco špatnýho? Přijde mi kód výše zbytečně složitý.
$psc_vecer_pole = array('10000-19999','37001-37021','30100-32800','40003-40020','46001-46020','50001-50012','53001-53020','53351-53354','60010-64700','70002-73001','76001-76007','77002-77900');
$psc_vecer_pole2 = array('65502','65691','65805','65856','50101','50301','50302','50311','50321','50332','50341','46177','46302','46303','46311','46312','78301','78302','78371','53078','53141','53215','53231','53301','53331','53333','40001','76302','76311,76314');
$vecerni_psc_1 = 0;
for($i=0;$i<count($psc_vecer_pole);$i++){
$vecerni_psc = explode("-", $psc_vecer_pole[$i]);
if($psc>=$vecerni_psc[0] and $psc<=$vecerni_psc[1]){
$vecerni_psc_1 = 1;
}
}
if($vecerni_psc_1 == 0 and in_array($psc, $psc_vecer_pole2)){
$vecerni_psc_1 = 1;
}
echo $vecerni_psc_1;
myslím, že pre toto množstvo dát je to úplne v poriadku.
Akurát by som breakol ten for cyklus v ife kde nastavuješ $vecerni_psc1, lebo takto zbytočne prechádzaš celý zoznam.
Zobrazeno 10 zpráv z 10.