Od paru już dni meczę się z implementacją pewnego algorytmu na stronie sklepu internetowego. Nie wiem, czy problemem jest tylko implementacja, czy też może źle zaprojektowałem algorytm. Chociaż wydaje się być ok. Nie sprawdzałem tylko jego złożoności, ale to akurat mniejszy problem.
Chodzi o to, że w sklepie zamówienia są promowane, czyli znaczenie ma parę czynników, a nie tylko kto kupił ( nie pytajcie się mnie o sens sam go nie mogę zrozumieć, ale takie dostałem zlecenie).
Pozycja zamówienia jest zależna od trzech – czterech rzeczy:
1. Daty ostatniego zamówienia – im krótsza ilość dni tym wyższa pozycja
2. Od id użytkownika – użytkownik może mieć tylko jedno zamówienie na raz realizowane
3. Od priorytetu zamówienia – jest to cyfra określana przez użytkownika
4. I wreszcie od tego czy można w ogóle to zamówienie zrealizować, czyli czy produkt jest na stanie
Dane są przekazywane w pętli aż do opróżnienia listy zamówień. Lista jest nieuporządkowana.
Po dłuższym namyśle nad samym algorytmem, bez uwzględnienia implementacji wymyśliłem użycie drzewa bst z brelokami w postaci list z późniejszym wypisaniem wszystkiego metodą inorder.
Ja słownie rozpisałem to sobie w taki sposób:
-Jeśli data jest większa idź w prawo
-jeśli data jest mniejsza idź w lewo
-jeśli data jest tak sama zostań
-jeśli pole jest puste sprawdź czy jest produkt
-jeśli jest to wstaw na miejsce i zakończ
-jeśli nie ma nic nie rób i zakończ
-jeśli pole jest pełne
{sprawdź czy na liście jest dane id usera
-Jeśli jest sprawdź priorytet zamówienia
-jeśli niższy nic nie rób i zakończ
-jeśli wyższy sprawdź czy jest produkt
-Jeśli jest zamień rekordy
-jeśli nie ma nic nie rob i zakończ
}
{jeśli nie ma danego id usera sprawdź czy jest produkt
-jeśli jest wstaw i zakończ
- jeśli nie ma nic nie rób i zakończ
}
Może trochę słabo wygląda, ale nie byłem w stanie zrobić wcięć.
Trochę zawiły algorytm, ale ja dla ułatwienia podzieliłem to sobie na dwie funkcje.
class BinaryTree { 'd'=>array('data'=>0), 'p'=>null, 'r'=>null, 'l'=>null ); 'd'=>array('data'=>0), 'p'=>null, 'r'=>null, 'l'=>null ); private $i = 0; public function wstawDoDrzewa(&$root,$element) { $this->nastepnik = $root; $this->poprzednik; while($this->nastepnik) { if($element['d']['data']==$this->nastepnik['d']['data']) { $this->wstawDoWiersza($element,$this->nastepnik['d']); return true; } $this->poprzednik = $this->nastepnik; if($element['d']['data']<$this->nastepnik['d']['data']) { $this->nastepnik = $this->nastepnik['l']; } else { $this->nastepnik = $this->nastepnik['r']; } } $element['p'] = $this->poprzednik; if(!$this->poprzednik) { $root = $element; } else if($element['d']['data']<$this->poprzednik['d']['data']) { $this->poprzednik['l'] = $element; } else { $this->poprzednik['r'] = $element; } return true; } public function zwrocListe(&$lista,$root) { if($root!=null) { $this->zwrocListe($lista, $root['l']); $lista[$this->i] = $root; $this->i++; $this->zwrocListe($lista, $root['r']); } return; } private function wstawDoWiersza($element,&$pozycja) { if($pozycja == null) { $pozycja = $element; return true; } foreach($pozycja['user'] as &$key) { if($key == $element['d']['user']) { if($key[' priorytet ']<$element['d']['user'][' priorytet ']) { return false; } else if($key['priorytet']==$element['d']['user']['priorytet']) { return false; } else { if(Orders::checkOrder($element['d']['user']['zamowienie'])) { $key['zamowienie'] = $element['d']['user']['zamowienie']; return true; } else { return false; } } } } //@todo umiesc na koncu return true; } }
Chciałbym się poradzić, czy nie ma jakiegoś prostszego sposobu niż użycie drzewa bst składającego się z dosyc rozbudowanych tablic, który byłby również prostszy w implementacji
Czy ktoś może mi coś doradzić?