Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Preszukiwanie tablicy - przypisanie liczby do przedziału
Michael2318
post
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


mam tablicę:
  1. $array= array('36', '30', '24', '18', '12', '6');


oraz liczbę: 22
Jak zmusić php, aby wskazał mi, w którym miejscu w tablicy ($array) leży przedział do którego zalicza się ta liczba 22?
Obecnie ta liczba mieści się w przedziale 18 - 24 ponieważ jest większa od 18, ale mniejsza od 24.
Mam wielką nadzieję, że jest możliwość sprawdzenia tego, nie lecąc liczba po liczbie w tablicy $array, np. pętlą foreach() (IMG:style_emoticons/default/sad.gif)

Dzięki.

Ten post edytował Michael2318 31.03.2013, 19:50:11
Go to the top of the page
+Quote Post
artuross
post
Post #2





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


1. Tablica zawsze jest posortowana czy niekoniecznie?
2. Jak w takim razie chcialbys sprawdzic czy liczba jest wieksza od najwiekszej liczby wystepujacej przed nia? Musisz przeiterowac tablice, zeby znalezc odpowiedni wynik. W kazdym razie jakie rozwiazanieby nie bylo, i tak PHP poleci liczba po liczbie (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Michael2318
post
Post #3





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


Tak, tablica zawsze będzie posortowana w taki sposób, jaki zademonstrowałem.
mam już dwie pętle for, nie widzi mi się wrzucanie tam trzeciej pętli bo to będzie mało optymalne :/

Sprawdzanie czy liczba jest największa lub najmniejsza już z głowy:

  1. // sprawdzamy czy liczba należy do najwyższego przedziału
  2. if ( $dane[$j] >= $poziome[(count($poziome))] )
  3. {
  4. $y_end = $poziom_end[($poziome[(count($poziome))])];
  5. break;
  6. }
  7. else if ( $dane[$j] <= $poziome[0] ) // jeśli nie to sprawdzamy czy liczba należy do najniższego przedziału
  8. {
  9. $y_end = $poziom_end[0];
  10. break;
  11. }


Ale nie wiem co dalej, jak dalej szukać tego przedziału ;/
PS. Wyżej akurat zrobiłem tak, że jeśli liczba wykracza poza przedział to przypisana zostaje wartość największa (na przykładzie będzie to 36), a jesli jest znów mniejsza bądź równa liczbie najmniejszej z tablicy to właśnie ta najmniejsza liczba zostanie przypisana do zmiennej.
Go to the top of the page
+Quote Post
artuross
post
Post #4





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Jesli chodzi o optymalnosc, dalbym tam petle while, ktore sa szybsze.

Jesli chodzi o moje rozwiazanie, kodu nie dam, ale zrob tak:
- edit, a zapomnialem, zanim zaczniesz cokolwiek, wstaw to w funkcje i jezeli po pierwszej petli nie znajdzie wyniku to zwroc false
- zacznij iterowac od konca tabeli i idz do poczatku dopoki nie znajdziesz liczby mniejszej od Twojej,
- gdy znajdziesz, zapisz index elementu tablicy do zmiennej
- robisz kolejna petle, w ktorej szukasz pierwszej liczby wiekszej od podanej,
- gdy znajdziesz, zapisujesz index elementu do innej zmiennej
- na koncu wypisujesz sobie indexy, wartosci, czy co tam chcesz.

Ten post edytował artuross 31.03.2013, 20:10:33
Go to the top of the page
+Quote Post
Michael2318
post
Post #5





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


Prościej już chyba lecieć po kolei, jak znajdę w końcu liczbę większą od mojej to pobieram index tej liczby (to będzie liczba domykająca przedział). Index liczby otwierającej przedział będzie x-1, więc nawet nie trzeba szukać drugi raz (IMG:style_emoticons/default/smile.gif)
Liczyłem po prostu że php udostępnia jakąś funkcję czy coś, co ułatwi mi szukanie 'od podstaw', no ale trudno.
Dzięki (IMG:style_emoticons/default/smile.gif)

Ten post edytował Michael2318 31.03.2013, 20:16:01
Go to the top of the page
+Quote Post
artuross
post
Post #6





Grupa: Zarejestrowani
Postów: 164
Pomógł: 9
Dołączył: 30.12.2011

Ostrzeżenie: (0%)
-----


Aha, to te tablice nawet maja juz gotowe przedzialy...
Go to the top of the page
+Quote Post
sazian
post
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


  1.  
  2. $arr=array('36', '30', '24', '18', '12', '6');
  3.  
  4. $c=count($arr);
  5. $szukana=22;
  6. for($i=0;$i<$c;$i+=2)
  7. {
  8. $v1=each($arr);
  9. $v2=each($arr);
  10. if($v1!==false && $v2!==false)
  11. {
  12. if($szukana<=(int)$v1['value'] && $szukana>=(int)$v2['value'])
  13. {
  14. var_dump(array($v2['value'],$v1['value']));
  15. break;
  16. }
  17.  
  18. }
  19.  
  20. }
  21.  
Go to the top of the page
+Quote Post
Crozin
post
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


1. Ile jest elementów w takiej tablicy? Ponieważ przy liczbie kilki-kilkudziesięciu elementów nie ma nawet co sobie zawracać głowy "optymalnością".
2. Jeżeli tych elementów może być więcej, zainteresuj się tzw. wyszukiwaniem binarnym. Oczywiście tutaj musiałbyś dostosować algorytm tak by szukał przedziału, nie konkretnej wartości. Rozwiązanie to daje Ci złożoność obliczeniową rzędu O(log2n) w przeciwieństwie do zwykłego przelecenia tablicy pętlą o złożoności O(n)
Go to the top of the page
+Quote Post
Michael2318
post
Post #9





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


OK, dzięki panowie. Dałem radę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 5.10.2025 - 13:55