-
21. Data: 2015-09-16 16:49:44
Temat: Re: Tablica int i usuwanie duplikatów
Od: bartekltg <b...@g...com>
On 16.09.2015 12:31, M.M. wrote:
> On Wednesday, September 16, 2015 at 11:34:13 AM UTC+2, bartekltg wrote:
>> Dlatego proponowałem (unordered_)set zamiast (...)map.
>> Jest/nie ma w pomocniczym zbiorze.
> To jest najszybsza metoda w praktyce. Czasami możemy trafić na
> dane, dla których funkcja hash da mnóstwo kolizji. Problem
> kolizji trochę rekompensuje odpowiednia implementacja hash-table,
> ponieważ można ją przeglądać tak jak lubi pamięć cache. W
> przypadku RBTree nigdy nie jest przyjaźnie dla cache, ale
> jest gwarancja N*Log(N) dla każdych danych.
A, jeszcze jedno, tutaj nie musimy używać set<int>, bo to rzeczywiście
nam nieźle zwolni.
Weźmy trudniejszą wersję, czyli pytacz chce przetwarzać liczby
w takiej kolejności w jakiej są w tablicy, tylko pominąć już raz
przetworzone. Ale skoro liczby mamy dane z góry, możemy je sobie
skopiować, posortować, (opcjonalnie machnąć std::unique aby pozbyć
\się duplkatów z posortowanej wersji). Do tego trzymamy tablicę
booli (vector<bool>) o tej samej długości.
Dostając liczbę, wyszukujemy ją binarnie w pomoczniczej posortowanej
tablicy, sprawdzamy czy bit w teblicy booli jest zapalony.
Będzie szybsze niż operacja na drzewach, i prawdopodobnie zajmie
mniej pamięci niż obie pozostałe wersje.
Prawdopodobnie, bo dla złośliwego przypadku - bardzo dużo podobnych
danych, ale niewiele różnych liczb, lepiej jest tworzyć
pomocniczy zbiór na żywo.
pzdr
bartekltg
-
22. Data: 2015-09-16 17:31:55
Temat: Re: Tablica int i usuwanie duplikatów
Od: "AK" <n...@n...com>
Użytkownik "bartekltg" <b...@g...com> napisał:
> A, jeszcze jedno, tutaj nie musimy używać set<int>, bo to rzeczywiście
> nam nieźle zwolni.
> Weźmy trudniejszą wersję, czyli pytacz chce przetwarzać liczby
> w takiej kolejności w jakiej są w tablicy, tylko pominąć już raz
> przetworzone. Ale skoro liczby mamy dane z góry, możemy je sobie
> skopiować, posortować, (opcjonalnie machnąć std::unique aby pozbyć
> \się duplkatów z posortowanej wersji). Do tego trzymamy tablicę
> booli (vector<bool>) o tej samej długości.
>
> Dostając liczbę, wyszukujemy ją binarnie w pomoczniczej posortowanej
> tablicy, sprawdzamy czy bit w teblicy booli jest zapalony.
>
> Będzie szybsze niż operacja na drzewach, i prawdopodobnie zajmie
> mniej pamięci niż obie pozostałe wersje.
> Prawdopodobnie, bo dla złośliwego przypadku - bardzo dużo podobnych
> danych, ale niewiele różnych liczb, lepiej jest tworzyć
> pomocniczy zbiór na żywo.
Po co tak skomplikowanie ?
Mozna bardzo prosto.
1. Pytacz tworzy (pustego) seta (np.hash-seta)
2. Pytacz idzie/iteruje sobie po tablicy intow.
Dla kazdego inta sprawdza czy jest w secie
jesli tak to: vec[i] := wartosc markujaca "nic" (jakies MAX_UINT albo cus)
jesli nie to: dodaje wartosc vec[i] do seta
3. i += 1
Ma zarowno wektor zmodyfikowany "w miejscu" (rozumiem, ze tak chcial), a i kolejnosc
zachowana.
Wydajne, proste, niezalezne od postaci/implementacji seta.
PS: Oczywiscie mozna jeszcze inaczej: nie markujac "nic" tylko biezacy kompiujac
vec[i] za ostatni niepowtarzalny (pamietajac wczesniej jego indeks) ale po co/to
zalezy ?
Byc moze lepiej/prosciej pozniej odfiltrowac przy iteracji te elementy z "nic"
AK
---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe
Avast.
https://www.avast.com/antivirus
-
23. Data: 2015-09-16 17:58:17
Temat: Re: Tablica int i usuwanie duplikatów
Od: bartekltg <b...@g...com>
On 16.09.2015 17:31, AK wrote:
> Użytkownik "bartekltg" <b...@g...com> napisał:
>
>> A, jeszcze jedno, tutaj nie musimy używać set<int>, bo to rzeczywiście
>> nam nieźle zwolni.
>> Weźmy trudniejszą wersję, czyli pytacz chce przetwarzać liczby
>> w takiej kolejności w jakiej są w tablicy, tylko pominąć już raz
>> przetworzone. Ale skoro liczby mamy dane z góry, możemy je sobie
>> skopiować, posortować, (opcjonalnie machnąć std::unique aby pozbyć
>> \się duplkatów z posortowanej wersji). Do tego trzymamy tablicę
>> booli (vector<bool>) o tej samej długości.
>>
>> Dostając liczbę, wyszukujemy ją binarnie w pomoczniczej posortowanej
>> tablicy, sprawdzamy czy bit w teblicy booli jest zapalony.
>>
>> Będzie szybsze niż operacja na drzewach, i prawdopodobnie zajmie
>> mniej pamięci niż obie pozostałe wersje.
>> Prawdopodobnie, bo dla złośliwego przypadku - bardzo dużo podobnych
>> danych, ale niewiele różnych liczb, lepiej jest tworzyć
>> pomocniczy zbiór na żywo.
>
> Po co tak skomplikowanie ?
Przecież napisałem jakie są wady i zalety tamtej metody w stosunku
do tej najprostszej. ;-)
Jeśli unikalnych elementów jest praie n, to ta metoda jest szybsza od
set i mniej pamieciożerna od seta i unordered_set.
Pytacz narzekał na niedobór algorytmów, to dajmu mu do wyboru;-)
> Mozna bardzo prosto.
> 1. Pytacz tworzy (pustego) seta (np.hash-seta)
> 2. Pytacz idzie/iteruje sobie po tablicy intow.
> Dla kazdego inta sprawdza czy jest w secie
...
> jesli nie to: dodaje wartosc vec[i] do seta
To co opisałeś to z grubsza dwie ostatnie linijki mojego postu.
Nie rozpisywałem się, bo już było w wątku.
Trzeba było te algorytmiki nazywać. I będzie
[1] szemrany 10:40
[2] A.K 11:34
[3] M.M 14:56
;-)
> Ma zarowno wektor zmodyfikowany "w miejscu" (rozumiem, ze tak chcial), a
> i kolejnosc zachowana.
To nie jest algorytm działający w miejscu. Średnio potrzebuje
on O(n) pamięci.
> Wydajne, proste, niezalezne od postaci/implementacji seta.
> PS: Oczywiscie mozna jeszcze inaczej: nie markujac "nic" tylko biezacy
> kompiujac
> vec[i] za ostatni niepowtarzalny (pamietajac wczesniej jego indeks) ale
> po co/to zalezy ?
> Byc moze lepiej/prosciej pozniej odfiltrowac przy iteracji te elementy z
> "nic"
Myślałem że autor chce tylko odpalić jakąś funkcję dla unikalnych
elementów. Jeśli chce zamienić zawartosć tablicy,
to jest to raczej standardowy sposób niż przekombinowanie, wszelkie
unique czy remove_if tak działają. Jedziemy dwoma iteratorami,
"zapisującym" i "odczytującym".
while (odczytujący!=end)
jeśli ( odczytujący pokazuje na pierwsze wystąpienie),
{wartość zapisujemy pod iterator "zapisyjący"
i przesuwamy 'zap.' o oczko. }
"Odczytujący" robi krok.
//zabawa z obsługą pomocniczego zbior jak poprzednio,
pzdr
bartekltg
-
24. Data: 2015-09-16 18:25:24
Temat: Re: Tablica int i usuwanie duplikatów
Od: "AK" <n...@n...com>
Użytkownik "bartekltg" <b...@g...com> napisał:
> To nie jest algorytm działający w miejscu. Średnio potrzebuje
> on O(n) pamięci.
Gdzie n to ilosc unikalnych w zbiorze, a nie rozmiar calego zbioru.
AK
---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe
Avast.
https://www.avast.com/antivirus
-
25. Data: 2015-09-16 18:28:38
Temat: Re: Tablica int i usuwanie duplikatów
Od: bartekltg <b...@g...com>
On 16.09.2015 18:25, AK wrote:
> Użytkownik "bartekltg" <b...@g...com> napisał:
>
>> To nie jest algorytm działający w miejscu. Średnio potrzebuje
>> on O(n) pamięci.
>
> Gdzie n to ilosc unikalnych w zbiorze, a nie rozmiar calego zbioru.
Pesymistycznie n=~=N.
Nieżależnie od tego - nie ejst to algorytm działajacy w miejscu ;-)
pzdr
bartekltg
-
26. Data: 2015-09-16 19:11:55
Temat: Re: Tablica int i usuwanie duplikatów
Od: Sebastian Biały <h...@p...onet.pl>
On 2015-09-14 21:56, szemrany wrote:
> Mam tablicę intów i potrzebuję usunąć duplikaty. Chciałbym uniknąć
> sortowania.
> Jak to zrobić wydajnie? Jakiś algorytm sprytny?
http://stackoverflow.com/questions/1453333/how-to-ma
ke-elements-of-vector-unique-remove-non-adjacent-dup
licates
Sporo tam odpowiedzi.
Możesz też, jesli twoje zgadnienie spełnia dodatkowe warunki,
zainteresować się np. pierwszym zadaniem z "Perełki Oprogramowania"
gdzie coś zbliżonego rozwiązano na wektorze bitowym (przy okazji
sortując "za darmo").
-
27. Data: 2015-09-16 19:41:28
Temat: Re: Tablica int i usuwanie duplikatów
Od: "M.M." <m...@g...com>
On Wednesday, September 16, 2015 at 6:26:00 PM UTC+2, AK wrote:
> Użytkownik "bartekltg" napisał:
>
> > To nie jest algorytm działający w miejscu. Średnio potrzebuje
> > on O(n) pamięci.
>
> Gdzie n to ilosc unikalnych w zbiorze, a nie rozmiar calego zbioru.
Przy perfect-hash ilość bitów * ( max_value - min_value + 1). Dla
małej rozpiętości można łatwo zrobić perfect-hash.
Dróg jest wiele, a jaką wybrać, to zależy od konkretnych danych.
Pozdrawiam
-
28. Data: 2015-09-16 19:46:27
Temat: Re: Tablica int i usuwanie duplikatów
Od: "M.M." <m...@g...com>
On Wednesday, September 16, 2015 at 7:12:02 PM UTC+2, Sebastian Biały wrote:
> On 2015-09-14 21:56, szemrany wrote:
> > Mam tablicę intów i potrzebuję usunąć duplikaty. Chciałbym uniknąć
> > sortowania.
> > Jak to zrobić wydajnie? Jakiś algorytm sprytny?
>
> http://stackoverflow.com/questions/1453333/how-to-ma
ke-elements-of-vector-unique-remove-non-adjacent-dup
licates
>
> Sporo tam odpowiedzi.
>
> Możesz też, jesli twoje zgadnienie spełnia dodatkowe warunki,
> zainteresować się np. pierwszym zadaniem z "Perełki Oprogramowania"
> gdzie coś zbliżonego rozwiązano na wektorze bitowym (przy okazji
> sortując "za darmo").
Właśnie, dzięki tej metodzie, mamy za półdarmo sortowanie w czasie
O(max_value-min_value+1).
Pozdrawiam
-
29. Data: 2015-09-16 19:55:17
Temat: Re: Tablica int i usuwanie duplikatów
Od: bartekltg <b...@g...com>
On 16.09.2015 19:46, M.M. wrote:
> On Wednesday, September 16, 2015 at 7:12:02 PM UTC+2, Sebastian Biały wrote:
>> On 2015-09-14 21:56, szemrany wrote:
>>> Mam tablicę intów i potrzebuję usunąć duplikaty. Chciałbym uniknąć
>>> sortowania.
>>> Jak to zrobić wydajnie? Jakiś algorytm sprytny?
>>
>> http://stackoverflow.com/questions/1453333/how-to-ma
ke-elements-of-vector-unique-remove-non-adjacent-dup
licates
>>
>> Sporo tam odpowiedzi.
>>
>> Możesz też, jesli twoje zgadnienie spełnia dodatkowe warunki,
>> zainteresować się np. pierwszym zadaniem z "Perełki Oprogramowania"
>> gdzie coś zbliżonego rozwiązano na wektorze bitowym (przy okazji
>> sortując "za darmo").
> Właśnie, dzięki tej metodzie, mamy za półdarmo sortowanie w czasie
> O(max_value-min_value+1).
Radixsort?
pzdr
bartekltg
-
30. Data: 2015-09-16 19:57:39
Temat: Re: Tablica int i usuwanie duplikatów
Od: "AK" <n...@n...com>
Użytkownik "M.M." <m...@g...com> napisał:
> Gdzie n to ilosc unikalnych w zbiorze, a nie rozmiar calego zbioru.
> Przy perfect-hash ilość bitów * ( max_value - min_value + 1). Dla
> małej rozpiętości można łatwo zrobić perfect-hash.
>
> Dróg jest wiele, a jaką wybrać, to zależy od konkretnych danych.
Ano wlasnie, a to jest czesto omijana sprawa ana rzecz "generycznosci".
Zawsze warto przeanalizowac dane (chocby tylko po min i max).
Koszt maly. Tylko jeden przebieg.
Zysk (niekiedy) ogromny
AK
---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe
Avast.
https://www.avast.com/antivirus