Witam,

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.
  1. class BinaryTree {
  2. private $nastepnik = array(
  3. 'd'=>array('data'=>0),
  4. 'p'=>null,
  5. 'r'=>null,
  6. 'l'=>null
  7. );
  8.  
  9. private $poprzednik = array(
  10. 'd'=>array('data'=>0),
  11. 'p'=>null,
  12. 'r'=>null,
  13. 'l'=>null
  14. );
  15.  
  16. private $i = 0;
  17.  
  18. public function wstawDoDrzewa(&$root,$element)
  19. {
  20. $this->nastepnik = $root;
  21. $this->poprzednik;
  22.  
  23. while($this->nastepnik)
  24. {
  25. if($element['d']['data']==$this->nastepnik['d']['data'])
  26. {
  27. $this->wstawDoWiersza($element,$this->nastepnik['d']);
  28. return true;
  29. }
  30.  
  31. $this->poprzednik = $this->nastepnik;
  32. if($element['d']['data']<$this->nastepnik['d']['data'])
  33. {
  34. $this->nastepnik = $this->nastepnik['l'];
  35. }
  36. else
  37. {
  38. $this->nastepnik = $this->nastepnik['r'];
  39. }
  40. }
  41.  
  42. $element['p'] = $this->poprzednik;
  43.  
  44. if(!$this->poprzednik)
  45. {
  46. $root = $element;
  47. }
  48. else if($element['d']['data']<$this->poprzednik['d']['data'])
  49. {
  50. $this->poprzednik['l'] = $element;
  51. }
  52. else
  53. {
  54. $this->poprzednik['r'] = $element;
  55. }
  56.  
  57. return true;
  58. }
  59. public function zwrocListe(&$lista,$root)
  60. {
  61. if($root!=null)
  62. {
  63. $this->zwrocListe($lista, $root['l']);
  64. $lista[$this->i] = $root;
  65. $this->i++;
  66. $this->zwrocListe($lista, $root['r']);
  67. }
  68. return;
  69. }
  70.  
  71. private function wstawDoWiersza($element,&$pozycja)
  72. {
  73. if($pozycja == null)
  74. {
  75. $pozycja = $element;
  76. return true;
  77. }
  78.  
  79. foreach($pozycja['user'] as &$key)
  80. {
  81. if($key == $element['d']['user'])
  82. {
  83. if($key[' priorytet ']<$element['d']['user'][' priorytet '])
  84. {
  85. return false;
  86. }
  87. else if($key['priorytet']==$element['d']['user']['priorytet'])
  88. {
  89. return false;
  90. }
  91. else
  92. {
  93. if(Orders::checkOrder($element['d']['user']['zamowienie']))
  94. {
  95. $key['zamowienie'] = $element['d']['user']['zamowienie'];
  96. return true;
  97. }
  98. else
  99. {
  100. return false;
  101. }
  102. }
  103. }
  104. }
  105.  
  106. //@todo umiesc na koncu
  107. return true;
  108. }
  109. }

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ć?