2016-04-29 53 views
6

UPD: przeniosłem oryginalne pytanie https://codereview.stackexchange.com/questions/127055/building-tree-graph-from-dictionary-performance-issuesPHP implementacja drzewa prefiks kontra tablicy doc

Oto krótka wersja, bez kodów.

Próbuję zbudować drzewo prefiksu ze słownika. Tak więc, używając następującego słownika 'and','anna','ape','apple', wykres powinien wyglądać tak: graph Próbowałem 2 podejścia: za pomocą tablic asocjacyjnych i przy użyciu samodzielnie napisanych klas drzewa/węzła.

Uwaga: oryginalny słownik ma około 8 MB i zawiera> 600 000 słów.

Pytanie: Czy jest jakiś dobry (szybki/wydajny) sposób to zrobić?

próbowałem dotąd:

  • tablice asocjacyjne php (nie są one bardzo elastyczne dla przyszłej pracy z tym wykresie).

  • samodzielnie napisane klasy drzewa/węzła (problemy z wydajnością - czas wykonania wzrasta nawet o 7x, zużycie pamięci wzrasta dwukrotnie, nawet bez implementacji czegokolwiek oprócz funkcji inserting).

Przykładowe kody są dostępne na inspekcja kodu (bardzo pierwszy link w pytaniu)

+0

Oba mają ten sam złożony kod/wykonanie, a nie taki sam rozmiar pamięci i szybkość wykonania. W zależności od wersji PHP, którą uruchamiasz w ramach klas, korzystaj również z mniejszej lub większej ilości pamięci. Jeśli szukasz lepszej wydajności, a nie tylko uczenia się rzeczy, sugerowałbym zaglądanie do zagnieżdżonych zestawów. Znajdziesz także gotowe do użycia implementacje PHP: http://stackoverflow.com/questions/272010/searching-the-best-php-nested-sets-class-pear-class-excluded –

+2

To pytanie jest lepiej dopasowane dla [recenzji kodu] (http://codereview.stackexchange.com) – nickb

+0

@Sergiu Paraschiv - Zajrzę do tego – haldagan

Odpowiedz

0

Dopóki mam włączony do C++ i dostałem dobrą odpowiedź na codereview, ja po prostu odpowiedzieć na moje własne pytanie tutaj.

Jest jeszcze jeden sposób na to sposób bardziej efektywny czas poprzez zwiększenie zużycia pamięci (to naprawdę nie jest duży wzrost, w porównaniu do „array z array s od array s ...” podejście). Podejście to nazywa się "double array trie" i można przeczytać informacje na ten temat here i przeczytać wyżej wspomnianą odpowiedź na temat przeglądu codereview, aby zobaczyć przykład wdrożenia.

Jest to bardziej czasochłonne, ale pozwala na mniejszą elastyczność/wygodę w przyszłym użyciu (w porównaniu z podejściem OOP).

Ostateczna odpowiedź na to pytanie brzmi dla mnie: "php nie jest najlepszym narzędziem do pracy z naprawdę dużymi próbami".