od pasky » 2. 6. 2005 11:53
Byl jsem sice u Holana, ale priklad jsem resil stejny jako vsichni ostatni, takze to napisu sem... (Mam pocit, ze v pripade programka to rozdeleni na vyucujici moc nefunguje.)
V malem prikladu jsem mel jen chybu v prioritach operatoru (klasicka chyba s and a or, kterou udela vetsina lidi, kteri uz pascal par let nevideli
), ale jinak v pohode, takze ten byl za jedna.
Ve velkem prikladu jsem mel kodu jen hodne malo, zato asi 2.5 A3 povidani, i kdyz pravda zmateneho, a zaroven jsem to jeste behem psani domyslel, takze na konci jsem popisoval uz trochu neco jineho nez na zacatku a bylo to dost neprehledne. Ale vlastne jen tu pisemku prede mnou otevrel a chtel po mne, abych popsal, jak jsem to teda delal, a pri tom jsme se snazili drzet toho, co jsem na ten papir napsal. Na kod se ani nepodival, ale algoritmus se mu libil (i kdyz tam byly nektere mensi veci trochu nedomyslene) - rekl, ze je to perfektni, a at mu dam index.
Takze pokud mate hezke reseni, ktere se mu zalibi, ani nemusi dojit na zadnou teorii.
Moje reseni spocivalo v zasade v tom, ze pro kazdy soubor jsem si v pameti drzel tabulku radku s verzemi, kdy byly naposledy zmeneny, a jak jsem se soubory sel do minulosti, musel jsem si drzet mapovaci tabulku na cisla radek v posledni verzi souboru - protoze kdyz jsem treba do souboru pridal radek, cisla vsech nasledujicich radek se mi posunuly o jednicku, a musel jsem si index upravit, abych sahl na spravny radek v tabulce poslednich zmen (to tu tak rozvadim proto, ze se na to pry hodne zapominalo).
Vzdy jsem si rozbalil deset verzi najednou, a pak jsem je postupne vzdy prochazel po souboru - nacetl jsem si uplne soubor z verze #10 a #9, spocital jsem diff (a podle nej upravil tabulku zmen a mapovani), pak jsem zahodil buffer verze #10 a nacetl verzi #8, a tak dale - tohle jsem udelal pro vsechny soubory, dokud jsem nenarazil na prvni verzi nebo jsem uz mel vsechny radky ve vsech souborech.
Diffovani jsem delal tak, ze jsem si pri nacitani do bufferu kazdy radek zahashoval a udelal jsem si hashovaci tabulku, ktera ukazovala na cislo radku. Kdyz jsem narazil na radek, ktery je v kazde verzi jinak, podival jsem se do hashovaci tabulky druhe verze, kde ten radek az je - a vybral jsem tu verzi, kde je rozdil mensi. To sice nezaruci minimalni diff, ale dava to relativne dobre vysledky, je to linearni (pokud nam hashe preji) a zere to malo pameti.
Doufam, ze to neni az prilis zmatene popsane...
Byl jsem sice u Holana, ale priklad jsem resil stejny jako vsichni ostatni, takze to napisu sem... (Mam pocit, ze v pripade programka to rozdeleni na vyucujici moc nefunguje.)
V malem prikladu jsem mel jen chybu v prioritach operatoru (klasicka chyba s and a or, kterou udela vetsina lidi, kteri uz pascal par let nevideli :wink:), ale jinak v pohode, takze ten byl za jedna.
Ve velkem prikladu jsem mel kodu jen hodne malo, zato asi 2.5 A3 povidani, i kdyz pravda zmateneho, a zaroven jsem to jeste behem psani domyslel, takze na konci jsem popisoval uz trochu neco jineho nez na zacatku a bylo to dost neprehledne. Ale vlastne jen tu pisemku prede mnou otevrel a chtel po mne, abych popsal, jak jsem to teda delal, a pri tom jsme se snazili drzet toho, co jsem na ten papir napsal. Na kod se ani nepodival, ale algoritmus se mu libil (i kdyz tam byly nektere mensi veci trochu nedomyslene) - rekl, ze je to perfektni, a at mu dam index. :D Takze pokud mate hezke reseni, ktere se mu zalibi, ani nemusi dojit na zadnou teorii.
Moje reseni spocivalo v zasade v tom, ze pro kazdy soubor jsem si v pameti drzel tabulku radku s verzemi, kdy byly naposledy zmeneny, a jak jsem se soubory sel do minulosti, musel jsem si drzet mapovaci tabulku na cisla radek v posledni verzi souboru - protoze kdyz jsem treba do souboru pridal radek, cisla vsech nasledujicich radek se mi posunuly o jednicku, a musel jsem si index upravit, abych sahl na spravny radek v tabulce poslednich zmen (to tu tak rozvadim proto, ze se na to pry hodne zapominalo).
Vzdy jsem si rozbalil deset verzi najednou, a pak jsem je postupne vzdy prochazel po souboru - nacetl jsem si uplne soubor z verze #10 a #9, spocital jsem diff (a podle nej upravil tabulku zmen a mapovani), pak jsem zahodil buffer verze #10 a nacetl verzi #8, a tak dale - tohle jsem udelal pro vsechny soubory, dokud jsem nenarazil na prvni verzi nebo jsem uz mel vsechny radky ve vsech souborech.
Diffovani jsem delal tak, ze jsem si pri nacitani do bufferu kazdy radek zahashoval a udelal jsem si hashovaci tabulku, ktera ukazovala na cislo radku. Kdyz jsem narazil na radek, ktery je v kazde verzi jinak, podival jsem se do hashovaci tabulky druhe verze, kde ten radek az je - a vybral jsem tu verzi, kde je rozdil mensi. To sice nezaruci minimalni diff, ale dava to relativne dobre vysledky, je to linearni (pokud nam hashe preji) a zere to malo pameti.
Doufam, ze to neni az prilis zmatene popsane...