porównywanie 2 tablic stringów i ort! wartości

0

Witam, robię sobie pewną aplikację i natrafiłem na poniższy problemik:
Potrzebna mi szybka i estetyczna metoda rozwiązania problemu:
Mam 2 tablice string (all[] i remove[]), trzeba przeszukać tablicę all[] na obecność jakiegokolwiek elementu z tablicy remove[] a jeśli taki sie zdarzy (tz w tej i w tej tablicy będzie to samo słowo) to usuwamy ten indeks z tablicy all[], przesuwamy elementy, itd aż tablica all[] nie będzie miała żadnego słowa z tablicy remove[] (ani też pustych elementów).

Hmm nie wiem czy będzie sie opłacało przesuwać elementy w tablicy, może po prostu nową tablicę stworzyć? A może jest jakś gotowa metodą usuwająca z tablicy puste wartości ? (coś takiego jest chyba w Java) Czy ten problemik da sie jakoś rozwiązać bez zbędnego pętlenia kodu ?

0
Samaeel napisał(a)

Witam, robię sobie pewną aplikację i natrafiłem na poniższy problemik:
Potrzebna mi szybka i estetyczna metoda rozwiązania problemu:
Mam 2 tablice string (all[] i remove[]), trzeba przeszukać tablicę all[] na obecność jakiegokolwiek elementu z tablicy remove[] a jeśli taki sie zdarzy (tz w tej i w tej tablicy będzie to samo słowo) to usuwamy ten indeks z tablicy all[], przesuwamy elementy, itd aż tablica all[] nie będzie miała żadnego słowa z tablicy remove[] (ani też pustych elementów).

No to w czym problem? W zasadzie opisales jak to rozwiazac. Nic tylko brac sie za kodzenie.

Samaeel napisał(a)

A może jest jakś gotowa metodą usuwająca z tablicy puste wartości ? (coś takiego jest chyba w Java)

To moze uzyj List.

0

Problem w tym że jest klika sposobów aby to zrobić, a mnie interesuje algorytm który zrobi to jak najszybciej i dlatego zwracam sie z pytaniem do Was.

0

jak duże są te tablice?
jeśli więcej niż kilkanaście tysiecy elementów, to proponuję użyć Dictionary; wyszukiwanie w nim ma złożoność O(1), więc szybciej się nie da. robisz tak:
(0) dict[] indeksowany słowami z tablicy remove[], zawierający jakiekolwiek śmieci, ważny jest tylko indeks;
pusta tablica stringów allRem[] o długości all[];
int allRemLen z indeksem ostatniego pustego elementu z allRem;

pętla po all[], sprawdzenie czy konkretne słowa istnieją w dict[], jeśli nie, to dopisanie słowa do allRem na indeksie allRemLen i zwiekszenie allRemLen.

na koniec stworzenie nowej tablicy stringów o długości allRemLen, przepisanie do niej pierwszych allRemLen wartości z allRem[] i zwrócenie jej.

złożoność obliczeniowa - O(m+n), gdzie m - długość remove[], n - długość all[].

teraz inne rozwiązania:
(1) jeśli będziesz sprawdzał dla każdego słowa z all[] wszystkie słowa z remove[], to już masz O(mn). (2) jeśli słowa z remove[] posortujesz alfabetycznie i będziesz wyszukiwać binarnie, to O((m+n)logm). (3) jeśli po każdym znalezieniu słowa do usunięcia będziesz przesuwać wszystkie elementy tablicy, to dokładasz O(n), i to boleśnie długo trwające, bo przesuwasz spory kawałek pamięci.
opcja pesymistyczna (czyli zaimplementowanie Twojego rozwiązania - (1) i (3)): O(m
n
n), czyli dla tysiąca słów w all[] i setki z remove[] masz sto milionów iteracji pętli.
opcja średnia (imho dobra dla małej ilości elementów, bo obywa się bez liczenia hashy, a sortowanie i wyszukiwanie binarne potrwa szybko, bo logm) czyli (2) i dopisywanie do nowej tablicy jak w (0) - O((m+n)*logm+n), więc dla 100 i 1000 masz nieco ponad 6000 iteracji (plus na końcu pętla na wygenerowanie tablicy o odpowiedniej długości, czyli de facto ~7000).
opcja optymistyczna (0): O(m+n), czyli 1100 iteracji (plus jw - ~2100 iteracji).

tworzenie nowej tablicy i przepisywanie do niej kolejnych pasujących słów ma pewną wadę - pożera dwa razy więcej pamięci, natomiast zaoszczędza olbrzymiej ilości czasu potrzebnej na ciągłe przesuwanie elementów. ALE jeśli remove[] ma ich tylko kilka, a all[] też jest w miarę krótkie (kilkaset elementów), to spadek szybkości nie powinien być duży, za to zaoszczędzisz małą ilosć pamięci (bo mała wejściowa tablica all[]).

0

odpowiedz jaką oczekiwałem, wielkie dzięki. Powiedz mi jeszcze czy w Dictionary może powtarzać mi sie klucz? tz może istnieć kilka elementów w których jest ten sam klucz ale inne wartości ?

0

w Dictionary nie. jak sobie wyobrażasz odwoływanie się do kilku elementów, jeśli wszystkie mają ten sam klucz? poczytaj sobie w helpie o hashmap czy dictionary, albo w google o tablicach haszujących (-> http://pl.wikipedia.org/wiki/Tablica_mieszaj%C4%85ca), żeby załapać jak to działa.

0

Trzymaj w Dictionary nie łańcuchy, a listy łańcuchów, w ten sposób otrzymasz multi-mapę. Trzeba tylko doimplementować tworzenie i usuwanie listy jeśli klucz jest dodawany/usuwany.

1 użytkowników online, w tym zalogowanych: 0, gości: 1