<div dir="ltr"><div><div>Ja nevim, skoly nemam, a nebudu se poustet do polemiky o lazy objektech, od toho jsou tu jini.<br><br></div>Jenom nahodim jednu vec. Kdysi jsem resil neco podobneho, ale misto sort() jsem pouzil sorted() a parametr "key". Ten umoznuje ohodnotit kazdou polozku nejakou hodnotou a potom setridit podle techto hodnot. <br><br></div><div>Ty jsi schopny z puvotniho radku a offsetu spocitat nejake cislo. Napr. pro "ema ma maso" spocitas "ord('e') * 10^100 + ord('m') * 10^90 + ord('a') * 10^80 + ord(' ') * 10 * 70, ...<br><br></div><div>Proste z toho stringu odvodis nejakou hodnotu, ktera umozni razeni. A sorted() ti podle ni ochodne seradi, pro kazdou polozku se ta hodnota "key" bude pocitat jenom jednou (narozdil od "cmp"). Pokud ty polozky budou lazy, jak uz psali ostatni, mas myslim problem vyreseny.<br><br></div><div>HTH<br><br></div><div>  Jirka<br><br></div><div>P.S. Takhle jsem kdysi tridil sitove rozsahy podle prvni IP adresy (first_ip() prevadi IP adresy na cisla):<br><br>def first_ip(IPy_obj):<br>   '''returns IP of the network address of an IPy object as an integer,<br>   useful for sorting (see behaviour of "key" argument for sort())/<br>   It's needed as IPy objects are sorted by length by default.<br>   '''<br>   return IPy_obj.net().int()<br><br>def sort_networks(ip_list):<br>   nets = sorted(ip_list, key=first_ip)<br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2015-06-16 10:42 GMT+02:00 Petr PĹ™ikryl <span dir="ltr"><<a href="mailto:prikryl@atlas.cz" target="_blank">prikryl@atlas.cz</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p style="padding:0 0 0 0;margin:0 0 0 0">ZdravĂm,</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">DoporuÄŤil bych ještÄ› jeden Ăşhel pohledu -- pĹ™ed rozhodnutĂm o zpĹŻsobu implementaci. Neznám detaily Ĺ™ešenĂ©ho problĂ©mu, takĹľe spĂš obecnÄ›. Já vĂm, Ĺľe je to jasnĂ©, ale nÄ›kdy si neškodĂ zopaovat zásady ;)</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">U kaĹľdĂ©ho Ĺ™ešenĂ©ho problĂ©mu lze analyzovat sloĹľitost -- ÄŤasovou a paměťovou. NejdĹ™Ăve je nutnĂ© rozhodnout, jaká z nich je u Ĺ™ešenĂ©ho problĂ©mu dĹŻleĹľitÄ›jšĂ, pĹ™ĂpadnÄ› jestli nÄ›kde existujĂ limity (velikost pamÄ›t, poÄŤet procesorĹŻ, praktická doba Ĺ™ešenĂ). Nakonec se to vĹľdy plácne jen tak (pokud je to malĂ˝ problĂ©m a nemá cenu se tĂm zabĂ˝vat), nebo se hledá kompromis -- optimalizuje se. Ale pĹ™ed optimalizacĂ je nutnĂ© zvolit správnĂ˝ pĹ™Ăstup.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">MnohĂ© implementaÄŤnĂ poÄŤiny vycházejĂ z naivnĂho pĹ™Ăstupu, kterĂ˝ se pak těžko pĹ™evracĂ do něčeho pouĹľitelnĂ©ho. BuÄŹ se kaĹľdá část navrhne správnÄ› uĹľ od začátku, nebo se to musĂ dát snadno pĹ™epsat. Pokud nÄ›co z toho nenĂ splnÄ›no, jde to do kopru.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Mnohá Ĺ™ešenĂ tratĂ na tom, Ĺľe se od začátku upneme na nÄ›jakĂ˝ konkrĂ©tnĂ zpĹŻsob Ĺ™ešenĂ (konkrĂ©tnĂ zpĹŻsob implementace). ÄŚasto pouĹľĂváme "Nic mi neĹ™Ăkejte, já na to pĹ™ijdu sám!" mĂsto toho, abychom pouĹľili prozkoumanĂ© (i kdyĹľ nám zatĂm neznámĂ©) techniky.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">KdyĹľ to shrnu:</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">- NemĂstnĂ© šetĹ™enĂ prostorem vÄ›tšinou snĂžà rychlost Ĺ™ešenĂ.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">- NemĂstnĂ© plĂ˝tvánĂ prostorem vÄ›tšinou dále nezvýšà rychlost Ĺ™ešenĂ.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">- Neexistuje jediné nejlepšà řešenà pro všechny situace. Vždy je to kompromis.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">- Mohou existovat rozpoznatelnĂ© situace, kdy je vĂ˝hodnÄ›jšà jedno z vĂce známĂ˝ch Ĺ™ešenĂ. CelkovĂ© Ĺ™ešenĂ mĹŻĹľe bĂ˝t napĹ™Ăklad zdvojenĂ© s tĂm, Ĺľe se to lepšà vybĂrá dynamicky.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">(VezmÄ›te si napĹ™Ăklad "hloupĂ˝" SQL serve s SQL dotazovacĂm jazykem. Tam se napĹ™elo uĹľ tolik ĂşsilĂ, Ĺľe stěžà sami pĹ™ijdete na nÄ›co lepšĂho pĹ™i optimalizaci dotazu.)</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Pokud je nutnĂ© Ĺ™adit, pak nejlepšà sekvenÄŤnĂ algoritmus má teoretickou ÄŤasovou sloĹľitost O(n log n). Tolikrát se budou muset transformovat data, pokud nebudou uloĹľena. PĹ™Ăprava pĹ™ed Ĺ™azenĂm mĹŻĹľe vÄ›ci urychlit.</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">NechtÄ›l jsem napsat vyÄŤerpávajĂcĂ odpověď ;)</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Mějte se fajn,</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â Â Â Petr</p>
<p style="padding:0 0 0 0;margin:0 0 0 0">Â </p>
<p style="padding:0 0 0 0;margin:0 0 0 0">______________________________________________________________<br>
> Od: "LumĂr Balhar" <<a href="mailto:frenzy.madness@gmail.com" target="_blank">frenzy.madness@gmail.com</a>><br>
> Komu: <<a href="mailto:python@py.cz" target="_blank">python@py.cz</a>><br>
> Datum: 15.06.2015 22:36<br>
> PĹ™edmÄ›t: [python] PaměťovÄ› nároÄŤnĂ© Ĺ™azenĂ<br>
></p><div class="HOEnZb"><div class="h5">
<p style="padding:0 0 0 0;margin:0 0 0 0">Ahoj všem.<br>
<br>
ĹešĂm s kamarádem jeden jeho projekt, jehoĹľ součástĂ je i Burrows-Wheelerova transformace, která se pouĹľĂvá pĹ™ed kompresĂ dat spoleÄŤnÄ› s Move to Front transformacĂ pro snĂĹľenĂ entropie vstupnĂch dat a tĂm zvýšenĂ efektivity kompresnĂho algoritmu, kterĂ©mu tyto dvÄ› transformace pĹ™edcházejĂ.<br>
<br>
PochopenĂ transformacĂ nenĂ potĹ™eba. U BWT se vyuĹľĂvá tzv, buffer, kterĂ˝ obsahuje všechny moĹľnĂ© rotace vstupnĂch dat, takĹľe napĹ™Ăklad pro "ema má maso" vypadá takto:<br>
<br>
0 ema ma maso<br>
1 ma ma masoe<br>
2 a ma masoem<br>
3 Â ma masoema<br>
4 ma masoema <br>
5 a masoema m<br>
6 Â masoema ma<br>
7 masoema ma <br>
8 asoema ma m<br>
9 soema ma ma<br>
10 oema ma mas<br>
<br>
Pro malá data je to dobrĂ©, ale pro velká nelze mĂt celĂ˝ buffer v pamÄ›ti, protoĹľe se pro kaĹľdĂ˝ vstupnĂ znak navĂc rozšĂřà o řádek i sloupec zároveĹ.<br>
Napsal jsem tedy pro Buffer samostatnou tĹ™Ădu, kde pomocĂ __getitem__ vygeneruji potĹ™ebnĂ˝ řádek posunem aĹľ ve chvĂli, kdy je jeho obsah potĹ™eba.<br>
<br>
ZákladnĂ buffer jsem tĂm vyĹ™ešil a ušetĹ™il hromadu pamÄ›ti. ProblĂ©m ale je, Ĺľe v dalšĂm kroku potĹ™ebuji tento buffer lexikograficky seĹ™adit. Abych jej opÄ›t nemusel cpát do pamÄ›ti, vytvoĹ™il jsem pole indexĹŻ, kde kaĹľdĂ˝ index reprezentuje jeden řádek bufferu a Ĺ™adĂm jen toto pole (ÄŤĂmĹľ zĂskám pĹ™eskládanĂ© poĹ™adà řádkĹŻ pĹŻvodnĂho bufferu), ale jako klĂÄŤ pouĹľĂvám právÄ› obsah řádku pro danĂ˝ index.<br>
<br>
Konkrétně:<br>
<br>
class Buffer():<br>
  def __init__(self, input):<br>
    self.input = input<br>
    self.indexes = [x for x in range(len(input))]<br>
<br>
  def __getitem__(self, index):<br>
    return self.input[index:] + self.input[0:index]<br>
<br>
  def sort(self):<br>
    self.indexes.sort(key=lambda x: self[x])<br>
<br>
<br>
A teÄŹ jsme se dostali k jádru problĂ©mu. I kdyĹľ se obsah jednotlivĂ˝ch řádkĹŻ generuje aĹľ ve chvĂli, kdy jsou potĹ™eba, a Ĺ™adit by se mÄ›lo jen relativnÄ› malĂ© pole indexĹŻ, pĹ™i volánĂ funkce .sort() se jakoby stejnÄ› celĂ© to pole nejdĹ™Ăve vytvořà v pamÄ›ti, seĹ™adĂ a pak se seĹ™adĂ to cĂlovĂ© pole s indexy na základÄ› obsahu bufferu.<br>
<br>
Existuje zpĹŻsob, jak implementovat takovĂ˝to Ĺ™adĂcĂ algoritmus pro velkĂ˝ objem dat, aniĹľ bych je mÄ›l v jednu chvĂli všechny v pamÄ›ti?<br>
<br>
PĹ™edem dĂky za nakopnutĂ tĂm správnĂ˝m smÄ›rem.<br>
LumĂr<br>
_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz" target="_blank">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" target="_blank">http://www.py.cz</a></p>
</div></div><br>_______________________________________________<br>
Python mailing list<br>
<a href="mailto:python@py.cz">python@py.cz</a><br>
<a href="http://www.py.cz/mailman/listinfo/python" rel="noreferrer" target="_blank">http://www.py.cz/mailman/listinfo/python</a><br>
<br>
Visit: <a href="http://www.py.cz" rel="noreferrer" target="_blank">http://www.py.cz</a><br></blockquote></div><br></div>