[python] re: hlavolam

Radek Kanovsky rk na dat.cz
Středa Červen 15 10:39:56 CEST 2005


On Wed, Jun 15, 2005 at 07:45:44AM +0200, pavel.kosina wrote:

> >Někdo tady psal, že spoléhat se nato, že se slovník sám srovná, je
> >spoléhání na náhodu,
> >ale ono to fakt vypadá, že se srovná vždycky, takže je to spíš výhoda
> >použití slovníku.
> 
> nejsem super teoretik, ale fakt si jen tak matně vpomínám, že v obyčejném 
> výpise slovníku se může lišit pořadí jednotlivých položek v závislosti na 
> systému. Na jednom stroji to bude asi porad stejne, to je fakt, ale na 
> jinych strojich, jinych op. systemech, to je nezarucitelne.

V tomto velmi konkretnim pripade to bude podle me fungovat vzdy, ale
jako reseni bych to neprijal :-)

Funguje to proto, ze hash prirozeneho cisla, je samo prirozene cislo
(hash(33) == 33), proto se jednotlive polozky ukladaji ve vnitrnim poli
slovniku "ma_table" za sebou (jako v normalnim poli). Napr.:
    
    d = {1:'C', 2:'X'}

    ma_table   item
    ------------------
    0          NULL
    1          (1,'C')
    2          (2,'X')
    3          NULL

    d.items() == [(1,'C'), (2,'X')] # OK

Pokud by byl pridan do slovniku klic, ktery je vetsi nez velikost
ma_table, cele se to rozhodi, protoze hash se prepocitava dalsimi
algoritmy tak, aby vysledek byl mensi nez velikost interni struktury
slovniku a aby ukazoval na prazdne misto. Napr.:

    d = {1:'C', 2:'X', 8:'A'}

    ma_table   item
    ------------------
    0          (8,'A')
    1          (1,'C')
    2          (2,'X')
    3          NULL

    d.items() == [(8,'A'), (1,'C'), (2,'X')] # Spatne

Cili musi platit, ze klice jsou integery, a hodnota zadneho klice
nesmi presahnout (+/- urcita tolerance) pocet klicu, coz v pripade
hlavolamu vzdy plati. Tolerance je zde proto, ze velikost ma_table
se meni skokove, ne po pridani jedne polozky do slovniku.

Zdravi,

Radek Kaňovský



Další informace o konferenci Python