![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 4.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Sytuacja wygląda następująco:
Dane są 2 tablice: $tab_lista oraz $tab_all Obie tablice są jednowymiarowe i przechowują stringi. Jedyna różnica pomiędzy nimi polega na tym, że $tab_all posiada wiele zdublowanych wartości. Na czym polega problem ? Na tym, aby zliczyć ile powtórzeń poszczególnych wartości z tablicy pierwszej, znalazło się w tej drugiej. Wynikiem ma być tablica zawierająca wszystkie elementy $tab_lista z przyporządkowaną do nich liczbą powtórek (0 również wyświetlamy). Pomyślałem, że dobrym pomysłem byłoby uzycie funkcji array_count_values na $tab_all, gdyż dokładnie czegoś takiego potrzebuje. Pojawił się jednak problem, gdyż wynikiem jest tablica posiadająca nadmiar danych (przypominam, że interesują mnie tylko elementy z $tab_lista). Mój kod wygląda następująco:
Niestety pomysł z przecięciem tablic jest chyba średnio dobry, a w dodatku zapewne robię coś nie tak, bo wynikiem powyższego kodu jest pusta tablica. Tutaj wielka prośba do Was. Jako, że zacząłem bawić się w PHP dopiero 2 dni temu, nie mam pojęcia jak ten problem rozwiązać. Będę wdzięczny za każdą wskazówkę. Z góry wielkie dzięki (IMG:style_emoticons/default/winksmiley.jpg) |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 5 Pomógł: 1 Dołączył: 19.10.2009 Ostrzeżenie: (0%) ![]() ![]() |
Pierwsza rzecz jaka wpadła mi do głowy to 2 pętelki...:
ew.
Ten post edytował Kroolik1 24.10.2009, 10:21:16 |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 952 Pomógł: 154 Dołączył: 20.01.2007 Skąd: /dev/oracle Ostrzeżenie: (0%) ![]() ![]() |
To, co podałeś, to tzw. brute-force, czyli sprawdzanie wszystkiego na wszystkim. Polecam sprawdzić, ile czasu zajmie wykonanie tego algorytmu dla np. 1000 elementów (IMG:style_emoticons/default/smile.gif) .
Znam co najmniej dwa znacznie lepsze algorytmy:
Algorytm jest prosty - mamy strukturę $tab_lista z parami element => licznik. Struktura ta musi charakteryzować się szybkim czasem dostępu do elementu o podanym kluczu, a ten warunek spełniają tablice PHP (stąd kod w PHP jest taki prosty). Przelatujemy $tab_all i jeśli pojawia się w drugiej tablicy, to zwiększamy mu licznik wystąpień. Jedynie na początku musimy zamienić wartości na klucze w $tab_lista i zainicjować wszystko wartościami 0, a to robi funkcja array_fill_keys() Drugi algorytm polega na posortowaniu $tab_all - wtedy wszystkie identyczne elementy znajdą się obok siebie i wystarczy je po prostu zliczyć, na co wystarczy jedna pętla puszczona raz po całej tablicy. Jednak w przypadku PHP chyba bardziej się opłaca zastosować poprzedni. Ten post edytował Zyx 24.10.2009, 13:15:04 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 4.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Wielkie dzięki za pomoc (IMG:style_emoticons/default/winksmiley.jpg)
Ten post edytował Lopmer 24.10.2009, 20:55:33 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 15:15 |