algorithm.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/6/24
  6. * Time: 上午1:18
  7. */
  8. function less($x,$y)
  9. {
  10. return $x < $y;
  11. }
  12. class algorithm
  13. {
  14. static function bsearch($x, $list)
  15. {
  16. $left = 0;
  17. $right = count($list)-1;
  18. while ($left <= $right) {
  19. $mid = ($left + $right) >> 1;
  20. if ($list[$mid] == $x) {
  21. return $mid;
  22. } elseif ($list[$mid] > $x) {
  23. $right = $mid - 1;
  24. } elseif ($list[$mid] < $x) {
  25. $left = $mid + 1;
  26. }
  27. }
  28. return -1;
  29. }
  30. static function binary_search($sortarr, $val, $compare = "less")
  31. {
  32. $last = count($sortarr);
  33. $first = self::lower_bonud($sortarr,$val,$compare);
  34. return $first != $last && !$compare($val, $sortarr[$first]);
  35. }
  36. //返回位置标记了一个 >= value 的值。
  37. static function lower_bonud($container, $val,$compare = "less")
  38. {
  39. if(!is_array($container)) {
  40. return -1;
  41. }
  42. $len = count($container);
  43. $first = 0;
  44. while ($len != 0)
  45. {
  46. $l2 = intval($len / 2);
  47. $m = $first + $l2;
  48. if ($compare($container[$m],$val))
  49. {
  50. $first = ++$m;
  51. $len -= $l2 + 1;
  52. }
  53. else {
  54. $len = $l2;
  55. }
  56. }
  57. return $first;
  58. }
  59. //返回位置标记了一个 > value 的值。
  60. static function upper_bound($container, $val,$compare = "less")
  61. {
  62. if (!is_array($container)) {
  63. return -1;
  64. }
  65. $len = count($container);
  66. $first = 0;
  67. while ($len != 0)
  68. {
  69. $l2 = intval($len / 2);
  70. $m = $first + $l2;
  71. if ($compare($val,$container[$m])) {
  72. $len = $l2;
  73. } else {
  74. $first = ++$m;
  75. $len -= $l2 + 1;
  76. }
  77. }
  78. return $first;
  79. }
  80. static function array_insert(&$arr,$pos,$val)
  81. {
  82. array_splice($arr,$pos,0,$val);
  83. }
  84. static function array_erase(&$arr,$pos)
  85. {
  86. return array_splice($arr,$pos,1);
  87. }
  88. static function set_intersection($ar1, $ar2)
  89. {
  90. $count1 = count($ar1);
  91. $count2 = count($ar2);
  92. $pos1 = 0;
  93. $pos2 = 0;
  94. $result = [];
  95. while ($pos1 != $count1 && $pos2 != $count2)
  96. {
  97. $val1 = $ar1[$pos1];
  98. $val2 = $ar2[$pos2];
  99. if ($val1 < $val2) {
  100. ++$pos1;
  101. }
  102. elseif($val1 == $val2) {
  103. $result[] = $val1;
  104. ++$pos1;
  105. ++$pos2;
  106. }
  107. else {
  108. ++$pos2;
  109. }
  110. }
  111. return $result;
  112. }
  113. private static function copy($src,$pos,&$result)
  114. {
  115. $count = count($src);
  116. for (;$pos < $count;++$pos) {
  117. $result[] = $src[$pos];
  118. }
  119. return $result;
  120. }
  121. static function set_union($ar1,$ar2)
  122. {
  123. $count1 = count($ar1);
  124. $count2 = count($ar2);
  125. $pos1 = 0;
  126. $pos2 = 0;
  127. $result = [];
  128. for (; $pos1 != $count1; )
  129. {
  130. if ($pos2 == $count2) {
  131. return self::copy($ar1, $pos1, $result);
  132. }
  133. if ($ar1[$pos1] > $ar2[$pos2])
  134. {
  135. $result[] = $ar2[$pos2];
  136. ++$pos2;
  137. }
  138. elseif($ar1[$pos1] == $ar2[$pos2]) {
  139. $result[] = $ar1[$pos1];
  140. ++$pos1;
  141. ++$pos2;
  142. }
  143. else
  144. {
  145. $result[] = $ar1[$pos1];
  146. ++$pos1;
  147. }
  148. }
  149. return self::copy($ar2,$pos2,$result);
  150. }
  151. public static function not_in($src,$avables)
  152. {
  153. if(empty($src)) return array();
  154. if(empty($avables)) return $src;
  155. $src = array_unique($src);
  156. $avables = array_unique($avables);
  157. sort($src);
  158. sort($avables);
  159. $result = [];
  160. foreach ($src as $val)
  161. {
  162. if(algorithm::binary_search($avables,$val) == false) {
  163. $result[] = $val;
  164. }
  165. }
  166. return $result;
  167. }
  168. }