Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: вхождение числа в диапазон

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
nepster
Отправлено: 28 Февраля, 2013 - 18:02:35
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Возникла проблема, есть массив:

CODE (text):
скопировать код в буфер обмена
  1.  
  2. Array
  3. (
  4.     [0] => 0
  5.     [1] => 9
  6.     [2] => 18
  7. )


Каждый элемент массива, это диапазон числа.

К примеру есть число 2
2 больше чем 0, но меньше чем 9, тоесть результат 0 (ключ массива)

К примеру есть число 11
11 больше чем 0, и больше чем 9, но меньше чем 18, тоесть оно входит в диапазон от 9 до 17 (включительно), значит результат 1 (ключ массива)

К примеру есть число 27
27 больше чем 0, больше 9 и больше 18, тоесть результат 2 (ключ массива)



Самый легкий вариант решения этой задачи:

PHP:
скопировать код в буфер обмена
  1. $number = 7;
  2.  
  3. if($number >= $array[0] && $number < $array[1])
  4. {
  5.       return 1;
  6. }
  7. else if($number >= $array[1] && $number < $array[2])
  8. {
  9.       return 2;
  10. }
  11. else if($number >= $array[2])
  12. {
  13.       return 3;
  14. }


все отлично, все работает, только вот есть 1 большая проблема, мы не знаем, сколько элементов будет в массиве, может быть от 1 до миллиона.

Подскажите пожалуйста, как можно решить данный вопрос
 
 Top
DlTA
Отправлено: 28 Февраля, 2013 - 18:07:59
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




если влоб
то каждое значение
в цикле сравниваем с пределом, как только поймали предел больше чем значение, берем предыдущий ключ предела.

но если по умному, то это не в эту тему.

(Отредактировано автором: 28 Февраля, 2013 - 18:09:33)

 
 Top
nepster
Отправлено: 28 Февраля, 2013 - 19:10:26
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




а по умному, есть идея проще ?
 
 Top
DlTA
Отправлено: 28 Февраля, 2013 - 19:17:38
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




nepster пишет:
а по умному, есть идея проще ?
куда же проще??
PHP:
скопировать код в буфер обмена
  1. $limits = array(1,5,9,15);
  2. $value = 7;
  3. $out = -1;
  4. foreach($limits as $key=>$limit){
  5.         if($limit>=$value){
  6.                 $out = $key-1;
  7.                 break;
  8.         }
  9. }
  10. if($out==-1){
  11.         echo "Не входит в пределы";
  12. }
  13. else{
  14.         echo "Значение $out";
  15. }
 
 Top
NoPaper
Отправлено: 28 Февраля, 2013 - 19:57:36
Post Id



Посетитель


Покинул форум
Сообщений всего: 315
Дата рег-ции: Янв. 2012  
Откуда: Минск


Помог: 9 раз(а)




Как вариант
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $diap = array(1,5,9,15);
  4. $value = 10;
  5. $diap[] = $value;
  6. sort($diap);
  7. echo array_keys($diap,$value)[0];
  8.  
 
 Top
nepster
Отправлено: 28 Февраля, 2013 - 20:48:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




NoPaper, есть проблема:

CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => 0
  3.     [1] => 9
  4.     [2] => 18
  5. )


$value = 3 или 7 или 8 возвращает 1.

а должно как то так:
0 - 0
1 - 0
..
8 - 0
9 - 1
10 - 1
11 - 1
..
17 - 1
18 - 2
19 - 2
и все что больше либо равно 18 - 2


DlTA
тут не войти в предел невозможно.
пределы:
0-8
9-17
18 - бесконечность

отрицательного быть не может.
 
 Top
NoPaper
Отправлено: 28 Февраля, 2013 - 20:55:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 315
Дата рег-ции: Янв. 2012  
Откуда: Минск


Помог: 9 раз(а)




Тогда так
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $diap = array(0,9,18);
  3. $value = 18;
  4. $diap[] = $value;
  5. sort($diap);
  6. $res = array_keys($diap,$value);
  7. $res = (sizeof($res)>1)?$res[1]-1:$res[0]-1;
  8.  
  9. echo $res;


У DlTA пример намного проще
 
 Top
DlTA
Отправлено: 28 Февраля, 2013 - 21:04:49
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




PHP:
скопировать код в буфер обмена
  1. $limits = array(1,5,9,15);
  2. $value = 20;
  3. $i=-1;
  4. do{
  5.         $i++;
  6. }while(isset($limits[$i]) and $limits[$i]<$value);
  7. $i--;
  8.  
  9. if($out<0){
  10.         echo "Не входит в пределы";
  11. }
  12. else{
  13.         echo "Значение $i";
  14. }
 
 Top
nepster
Отправлено: 28 Февраля, 2013 - 21:23:11
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




PHP:
скопировать код в буфер обмена
  1. $sector = 0;
  2.            
  3.         for($s=0; $s<$sector_count; $s++)
  4.         {
  5.             $next_sector = $s + 1;
  6.                
  7.             if(isset($sector_info[$next_sector]))
  8.             {
  9.                 if($number >= $sector_info[$s] && $number < $sector_info[$next_sector])
  10.                 {
  11.                     $sector = $s;
  12.                     break;
  13.                 }  
  14.             }
  15.             else
  16.             {
  17.                 $sector = $s;      
  18.             }
  19.         }



а как вам такой вариант ?
 
 Top
DlTA
Отправлено: 28 Февраля, 2013 - 21:30:16
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




nepster пишет:
а как вам такой вариант ?
если понятно что и как там работает, то пусть будет он,

о том насколько он не оптимален рассуждать не стоит.
 
 Top
nepster
Отправлено: 28 Февраля, 2013 - 21:36:15
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




вот именно оптимальность интересует.

Очень хочу услышать замечания.
 
 Top
DlTA
Отправлено: 28 Февраля, 2013 - 21:58:33
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




nepster пишет:
Очень хочу услышать замечания.

ок, у вас на каждой итерации 2 ставнения, в то время когда можно обойтись 1м
ну и так по мелочи...
 
 Top
nepster
Отправлено: 28 Февраля, 2013 - 23:12:47
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




это экономия на спичках, или можно серьезно оптимизировать ?
 
 Top
DlTA
Отправлено: 28 Февраля, 2013 - 23:52:43
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2952
Дата рег-ции: Окт. 2010  


Помог: 53 раз(а)




серьезная оптимизация будет иметь смысл если число приделов будет относительно большое

вот тогда линейный прогон по всем значениям будет сильно не эффективен, и надо будет заюзать чет типа бинарного поиска,

для сравнения: при количестве пределов в 100 штук, и допустим искомое значение будет ближе к кону или будет больше максимального предела, надо будет произвесит 100 сравнений
при бинарном поиске можно обойтись 7ю

если же число пределов будет до 20-ти, то можно не заморачиваться
 
 Top
nepster
Отправлено: 01 Марта, 2013 - 00:57:34
Post Id



Частый гость


Покинул форум
Сообщений всего: 195
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




число приделом будет до 4 или 5 максимум скорее всего.
Это функция вычисления сектора в матрице.
кол -во элементов в массиве это диапазоны сектора.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB