Article View: pl.comp.lang.python
Article #27187Re: Python a hashmapa
From: Jan Kaliszewski
Date: Sat, 09 Jan 2010 21:28
Date: Sat, 09 Jan 2010 21:28
49 lines
3311 bytes
3311 bytes
wodzik <wodzik@noreply.com> napisał: > On 2010-01-09 13:03, Stachu 'Dozzie' K. wrote: >>> czyli rozumiem, że operacje wstawiania - wyszukiwania mają złożoność >>> obliczeniową równą 1? >> >> A widziałeś kiedyś strukturę spełniającą te kryteria? Z wyjątkiem >> tablicy indeksowanej liczbami. > > Oczywiście że widziałem. Nazywa się to hashmapa. Działa to tak, że > rezerwujemy sobie pamięć, a potem na podstawie jakiejś funkcji > mieszającej określamy gdzie dany element powinien znajdować się w > tablicy i tam go wstawiamy. Jeśli dla różnych obiektów mamy taki sam > adres wyszukujemy mu nowy, albo robimy listę w tym miejscu. Tyle z > szkoły. "Hashmapa" to jakiś potworek językowy. Po polsku na ogół mówimy o tablicy mieszającej (lub haszującej), bądź ogólniej o tablicy asocjacyjnej lub słowniku -- ang. dictionary, w Pythonie po prostu dict. Przy czym pythonowa implementacja słownika należy do jednej z najlepiej wykonanych i zoptymalizowanych -- nie dziwne, skoro Python wewnętrznie używa tej struktury prawie na każdym kroku (do obsługi przestrzeni nazw, do argumentów nazwanych...).¹ Podobną do słowników strukturą są w Pythonie zbiory (set). Można je traktować jako słowniki z samymi kluczami (bez wartości) + wygodnymi metodami do typowych operacji na zbiorach. > Ale link który podał Rob Wolfe chyba wyjaśnia sprawę dostatecznie. Przy > zastosowaniu słownika średnia złożoność pobrania elementu wynosi O(1). > Teraz pozostaje mi tylko napisać funkcje która w jakiś sensowny sposób > będzie tworzyła klucz na podstawie mojej klasy. A według jakiego kryterium określasz "tożsamość" elementów w dotychczasowym rozwiązaniu opartym na listach? Bo jeżeli wg tożsamości (id) samego obiektu (lub równości, gdy nie jest specjalnie definiowana, co również oznacza test tożsamości), to prawdopodobnie nie musisz żadnej specjalnej funkcji pisać -- zastąp listy zbiorami i już [test ,,x in set'' daje średnio O(1)]. Pozdr. *j ¹ Ciekawy artykuł na ten temat można przeczytać w książce "Piękny k0d. Tajemnice mistrzów programowania" (tyt. oryg. "Beatiful Code: Leading Programmers Explain How They Think") [wyd. Helion 2008] -- Jan Kaliszewski (zuo)
Technical Details
Message-ID:
<op.u6aa9spdfvx12t@jerzozwiesz.home.aster.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!wsisiz.edu.pl!plix.pl!newsfeed1.plix.pl!nntp.aster.pl!newsread.aster.pl!newsread1.aster.pl!not-for-mailReferences:
<hi9a48$c1b$1@zeus.man.szczecin.pl> <20100109102348.d563af8e.natural-born-killer@dontmailme.com> <hi9nmc$iqv$1@zeus.man.szczecin.pl> <hi9rbf$1ke$2@solani.org> <hiapsg$4mg$1@zeus.man.szczecin.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!newsfeed.gazeta.pl!wsisiz.edu.pl!plix.pl!newsfeed1.plix.pl!nntp.aster.pl!newsread.aster.pl!newsread1.aster.pl!not-for-mail From: "Jan Kaliszewski" <zuo@chopin.edu.pl> Newsgroups: pl.comp.lang.python Subject: Re: Python a hashmapa Date: Sat, 09 Jan 2010 22:28:30 +0100 Organization: Aster Sp. z o.o. Lines: 49 Message-ID: <op.u6aa9spdfvx12t@jerzozwiesz.home.aster.pl> References: <hi9a48$c1b$1@zeus.man.szczecin.pl> <20100109102348.d563af8e.natural-born-killer@dontmailme.com> <hi9nmc$iqv$1@zeus.man.szczecin.pl> <hi9rbf$1ke$2@solani.org> <hiapsg$4mg$1@zeus.man.szczecin.pl> NNTP-Posting-Host: 62.121.72.3 Mime-Version: 1.0 X-Trace: newsread.aster.pl 1263072653 5471 212.76.33.132 (9 Jan 2010 21:30:53 GMT) X-Complaints-To: abuse@aster.pl NNTP-Posting-Date: Sat, 9 Jan 2010 23:22:00 +0000 (UTC) User-Agent: Opera Mail/9.64 (Linux) Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit