Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Jak jednoznačně ukládat data

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Jak jednoznačně ukládat data

Autor: tcesky

8:43:41 25.11.2010

[ital] proč ji máš tak jak ji máš [/ital]

1. protoze to stalo nejmin uderu do klavesnice
2. protoze to umi rozlisit 12345 od 54321
3. protoze jsem to psal bez premysleni veda, ze i kdybych hluboce premyslel tak bych nevymyslel nic co by bylo podstatne lepsi; vnitrnosti hashe stoji stranou meho zajmu a nevidim duvod proc by se to melo zmenit.
4. protoze muj priklad byl priklad techniky, ne priklad implementace.

Zdravim

TC

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: Maaartin

23:12:13 24.11.2010

To podle me rozhodne neni dobra hashovaci fce. To "<< i" je tam proto aby kazda slozka klice byla hodnocena jinak, proc ne. Problem vidim v tom "|=". Pokud bude z_key[0] = -1 (tj. vsecky bitu nastaveny), tak na zbyvajicich castech uz vubec nezalezi a to je dost spatne (pro rychlost, fungovat to bude vzdycky).

Bezne se na tohle pouzivaji jen bijektivni funkce, jako "^" a "+". Zkusil bych treba

for (int i = 0; i < 5; i++) h ^= z_key[i] << i;

nebo

for (int i = 0; i < 5; i++) h = 31 * h + z_key[i];
// dost standard, namisto 31 muzes vzit libovolny lichy cislo

nebo

for (int i = 0; i < 5; i++) h += z_key[i] * (2*h+1);

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: stařena

22:15:00 24.11.2010

Mě ste všeci pomohli a za to vám děkuji,takže pro mě to nebyla plana diskuze.
:-)

Ještě bych tě TC poprosil k te tve hasholvaci funkci chtěl bych se zeptat proč ji máš tak jak ji máš moc si nedokážu předsatvit co z toho bude ve výsledku vznikat,tak jetli bys mi ji trochu popsal.

for (int i = 0; i < 5; i++) h |= z_key[i] << i;

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: tcesky

20:00:36 24.11.2010

[ital] Mno,takže chtěl jsem ty parametry použít jako indexy do akumulátoru,který se na určité pozici odpovídající parametrům inkrementuje[/ital]
Svata prostoto.

Sestihodinova plana diskuze nejlepsich mozku planety jenom proto, ze jeji tema bylo spatne zadano.

Zdravim

TC

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: stařena

18:44:33 24.11.2010

Mno,takže chtěl jsem ty parametry použít jako indexy do akumulátoru,který se na určité pozici odpovídající parametrům inkrementuje.Ale už jsem to vyřešil jinak... elipsy hledám ve vyprahovaném 2D obrázku s nalezenými hranami..

Algoritmus vypadá takto pokud byse někomu chtělo to pochopit,tak bych byl rád kdybyste mi poradili nějaké tipy jak to zrychlit:

[code]
% Ellipse_Detection(Edges)
alpha_deg=pi/180;
imgSize = size(edges);
y1=0;y2=0;x1=0;x2=0;
e_results=[];%e_Minor=[];e_Major=[];e_X0 = [];e_Y0 = [];e_angle=[];e_thresh=[];
Global_Threshold = ceil(imgSize(2)/2);%Used for Major Axis Comparison minimum
Local_Threshold = ceil(imgSize(1)/4);%Used for Minor Axis Comparison minimum
B_minorMax = ceil(imgSize(1)/2);%1:ceil(imgSize(1)/2); minor max
Angle_thresh= (6*alpha_deg)
Acc = zeros(B_minorMax,1);%length(B),1);
B_minorMax_sq= B_minorMax^2;
[Y,X]=find(edges);
Limit=numel(Y);


%Thresh = 42; %pro rozliseni 0.05
Thresh= 61;


mask=edges;
for Count_01 =1:(Limit-1)
Count_01
for Count_02 =(Count_01+1):Limit

y1=Y(Count_01);x1=X(Count_01);
y2=Y(Count_02);x2=X(Count_02);

Dist_01 = (sqrt((y1-y2)^2+(x1-x2)^2));

if (Dist_01 >Global_Threshold)
Center_X0 = (x1+x2)/2;Center_Y0 = (y1+y2)/2;
Major = Dist_01/2.0;Alpha = atan((y2-y1)/(x2-x1));



if((Alpha < Angle_thresh) && (Alpha > -Angle_thresh))
for Count_03 = 1:Limit
if( (Count_03 ~= Count_01) || (Count_03 ~= Count_02))
y3=Y(Count_03);x3=X(Count_03);

Dist_02 = (sqrt((y3 - Center_Y0)^2+(x3 - Center_X0)^2));


if(Dist_02 > Local_Threshold && Dist_02 <= Major)
Major_sq=Major^2;
Dist_02_sq=Dist_02^2;

Cos_Tau = (Major_sq + Dist_02_sq - ((y3-y2)^2 + (x3-x2)^2))/(2*Major*Dist_02);
Cos_Tau_sq=Cos_Tau^2;
Sin_Tau_sq = 1 - Cos_Tau_sq;
Minor_Temp = (Major_sq*Dist_02_sq *Sin_Tau_sq)/(Major_sq - (Dist_02_sq * Cos_Tau_sq));


if((Minor_Temp>1) && (Minor_Temp Minor_Temp=round(sqrt(Minor_Temp));
Acc(Minor_Temp) = Acc(Minor_Temp)+1;
end
end
end
end
end

Minor = find(Acc == max(Acc));
if(Acc(Minor(1))>Thresh)
current_length=length(e_results)+1;
e_results(1,current_length)=floor(Minor(1));
e_results(2,current_length)=floor(Major);
e_results(3,current_length) = floor(Center_X0);
e_results(4,current_length) = floor(Center_Y0);
e_results(5,current_length) =Alpha;
e_results(6,current_length)= Acc(Minor(1));
end
Acc = zeros(size(Acc));
end
end
% t-cputime
end

threshMax=find(e_results(6,:) == max(e_results(6,:)));
[/code]

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: tcesky

17:09:47 24.11.2010

[ital] Jde o program na vyhledávání elips v obrzku pomocí houghové transformace.
[/ital]

Chces pole s peti indexy. Elipsa ma pet parametru. Nechces snad pouzivat ty parametry jako indexy? Jesli ano, tak se desim pomysleni, ze by nekdo chtel vyhledavat elipsy podle jejich parametru.

Parametry jsou realna cisla a indexy cisla cela. Jakekoliv porovnavani dvou elips na zaklade nejake vzdalenosti v R5 je nesmysl.

Mozna ze se ale mylim, pet je take knofliku u vesty a bankovek mensich nez 1000 Kc

Zdravim

TC

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: tcesky

16:45:46 24.11.2010

[ital]"pocet elips se stejnym stredem nebude tak velky?" [/ital]

... a Kdyby se tam vubec zadna elipsa nenasla tak, aby to resiteli neprislo lito, umim k zadane mnozine bodu nalezt elipsu s minimalni plochou.

Zdravim

TC

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: grafnev

16:41:37 24.11.2010

Jen tak pro zajimavost:
Co potrebujete na ten 5D index ulozit?
Kolik takovych informaci cca ukladate?
Lze udelat pripadne nejaky zaver typu "pocet elips se stejnym stredem nebude tak velky?"

Pokud ma matlab nejake funkce jak efektivne pracovat s vektory, tak je urcite moznost k tem 5 velicinam co sledujete pridat i nejakou 6 tou (treba index do nejakeho seznamu) a pouzit to co matlab poskytuje pro praci s vektory.

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: tcesky

16:12:11 24.11.2010

Dictionary je map ktera porovnava na zaklade hodnoty hash a kdyz se pro dva objekty jejich hashe navzajem rovnaji tak pouzije test na ekvalitu na rozliseni ruznych objektu se stejnym hashem. Ergo funguje to pro jakkoliv zpaskudeny hash ale kdyz je hash jednoznacnejsi tak je to rychlejsi.

Je-li skutecne pravda, ze [ital]Na váš ód jsem se samozřejmě díval [/ital] tak jesli jsi chtel napsat to, co ja tam ctu, tak myslim ze ne.

Zdravim

TC

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: stařena

16:01:27 24.11.2010

To TC váš kód jsem nezkoušel ,protože bych něco takového v matlabu jen tak nenapsal.Jakože já to musím nějak v matlabu udělat.

V matlabu jsem použil containers.Map do kterého jsem jako klíče dával pětiznakové stringy a ukládal jsem na pozice cisla int.

A už tak pomalý program to zpomalilo asi 5x.
Třeba neumím dobře pracovat s pamětí v matlabu...

Na váš ód jsem se samozřejmě díval(i když nezkoušel) Nevím jestli to chápu spravně,ale používáte tam nějakou třídu Dictionary což mi přijde jako obdoba set nebo map.Jen nevím jak přesně funguje ta funkce GetHash a k čemu vlastně je.

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: tcesky

15:43:30 24.11.2010

Je toto pomale?

[code]
3 125 000 accesses in 34 292 ms
Press any key to continue . . .
[color=#0000ff]using[/color][color=#000000] System;
[/color][color=#0000ff]using[/color][color=#000000] System.Collections.Generic;
[/color][color=#0000ff]using[/color][color=#000000] System.Linq;
[/color][color=#0000ff]using[/color][color=#000000] System.Text;
[/color][color=#0000ff]using[/color][color=#000000] System.Diagnostics;

[/color][color=#0000ff]namespace[/color][color=#000000] Oldie
{
[/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Program[/color][color=#000000]
{
[/color][color=#0000ff]static[/color][color=#000000] [/color][color=#0000ff]void[/color][color=#000000] Main([/color][color=#0000ff]string[/color][color=#000000][[/color][color=#000000]] args)
{
[/color][color=#0000ff]var[/color][color=#000000] x = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]OldieArray[/color][color=#000000]<[/color][color=#0000ff]int[/color][color=#000000]>();
[/color][color=#0000ff]int[/color][color=#000000] q, count=0;
[/color][color=#0000ff]var[/color][color=#000000] sw=[/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Stopwatch[/color][color=#000000]();
sw.Start();
[/color][color=#0000ff]for[/color][color=#000000]([/color][color=#0000ff]int[/color][color=#000000] z=0;z<1000;z++)
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 50; i += 10)
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] j = 0; j < 50; j += 10)
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] k = 0; k < 50; k += 10)
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] l = 0; l < 50; l += 10)
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] m = 0; m < 50; m += 10)
{
x[[/color][color=#000000]i, j, k, l, m] = z;
q = x[[/color][color=#000000]i, j, k, l, m];
count++;
}
sw.Stop();
[/color][color=#2b91af]Console[/color][color=#000000].WriteLine([/color][color=#a31515]"{0:# ### ### ##0} accesses in {1:# ### ### ##0} ms"[/color][color=#000000], count, sw.ElapsedMilliseconds);
}
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]OldieArray[/color][color=#000000]
{
[/color][color=#2b91af]Dictionary[/color][color=#000000]<[/color][color=#2b91af]Key[/color][color=#000000], T> z_data;
[/color][color=#0000ff]public[/color][color=#000000] OldieArray() { z_data = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Dictionary[/color][color=#000000]<[/color][color=#2b91af]Key[/color][color=#000000], T>(); }
[/color][color=#0000ff]public[/color][color=#000000] T [/color][color=#0000ff]this[/color][color=#000000][[/color][color=#0000ff]int[/color][color=#000000] a1, [/color][color=#0000ff]int[/color][color=#000000] a2, [/color][color=#0000ff]int[/color][color=#000000] a3, [/color][color=#0000ff]int[/color][color=#000000] a4, [/color][color=#0000ff]int[/color][color=#000000] a5]
{
[/color][color=#0000ff]get[/color][color=#000000]
{
[/color][color=#0000ff]var[/color][color=#000000] key = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000](a1, a2, a3, a4, a5);
[/color][color=#0000ff]if[/color][color=#000000] (z_data.ContainsKey(key)) [/color][color=#0000ff]return[/color][color=#000000] z_data[[/color][color=#000000]key];
[/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]default[/color][color=#000000](T);
}
[/color][color=#0000ff]set[/color][color=#000000]
{
[/color][color=#0000ff]var[/color][color=#000000] key = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000](a1, a2, a3, a4, a5);
[/color][color=#0000ff]if[/color][color=#000000] (z_data.ContainsKey(key)) z_data[[/color][color=#000000]key] = [/color][color=#0000ff]value[/color][color=#000000];
[/color][color=#0000ff]else[/color][color=#000000] z_data.Add(key, [/color][color=#0000ff]value[/color][color=#000000]);
}
}
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000] : [/color][color=#2b91af]IEquatable[/color][color=#000000]<[/color][color=#2b91af]Key[/color][color=#000000]>
{
[/color][color=#0000ff]int[/color][color=#000000][[/color][color=#000000]] z_key;

[/color][color=#0000ff]public[/color][color=#000000] Key([/color][color=#0000ff]int[/color][color=#000000] a1, [/color][color=#0000ff]int[/color][color=#000000] a2, [/color][color=#0000ff]int[/color][color=#000000] a3, [/color][color=#0000ff]int[/color][color=#000000] a4, [/color][color=#0000ff]int[/color][color=#000000] a5) { z_key = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#0000ff]int[/color][color=#000000][[/color][color=#000000]] { a1, a2, a3, a4, a5 }; }
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]bool[/color][color=#000000] Equals([/color][color=#2b91af]Key[/color][color=#000000] other)
{
[/color][color=#0000ff]if[/color][color=#000000] (other == [/color][color=#0000ff]null[/color][color=#000000]) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]false[/color][color=#000000];
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 5; i++) [/color][color=#0000ff]if[/color][color=#000000] (z_key[[/color][color=#000000]i] != other.z_key[[/color][color=#000000]i]) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]false[/color][color=#000000];
[/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]true[/color][color=#000000];
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]bool[/color][color=#000000] Equals([/color][color=#0000ff]object[/color][color=#000000] obj)
{
[/color][color=#0000ff]return[/color][color=#000000] Equals(obj [/color][color=#0000ff]as[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000]);
}
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]

[/color][color=#000000]
[/color][color=#808080]///[/color][color=#008000] Here is the place to unleash your creativity[/color][color=#000000]
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]
[/color][color=#000000]
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#000000]
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]int[/color][color=#000000] GetHashCode()
{
[/color][color=#0000ff]int[/color][color=#000000] h = 0;
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 5; i++) h |= z_key[[/color][color=#000000]i] << i;
[/color][color=#0000ff]return[/color][color=#000000] h;
}
}
}

[/color][/code]
[size=10px]Designed for "uvadeni kodu bez jakehokoliv vysvetleni, ktere mozna pomuze v dany okamzik, ale nic nevyresi do budoucna a takovy clovek se stejne nestane vyvojarem a na slozitejsi otazky uz nedojde"[/size]
Zdravím

[color=#808080]
Nejezte žlutý sníh
________________________________________________
Dobře se pobavíte a od srdce zasmějete na stránkách
http://www.4itdevelopers.net/faq_at_builder.aspx

[/color]

[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Here is the place to unleash your creativity[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#000000] [/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]int[/color][color=#000000] GetHashCode() { [/color][color=#0000ff]int[/color][color=#000000] h = 0; [/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 5; i++) h |= z_key[[/color][color=#000000]i] << i; [/color][color=#0000ff]return[/color][color=#000000] h; } } } [/color][/code] [size=10px]Designed for "uvadeni kodu bez jakehokoliv vysvetleni, ktere mozna pomuze v dany okamzik, ale nic nevyresi do budoucna a takovy clovek se stejne nestane vyvojarem a na slozitejsi otazky uz nedojde"[/size] Zdravím TČ [color=#808080] Nejezte žlutý sníh ________________________________________________ Dobře se pobavíte a od srdce zasmějete na stránkách http://www.4itdevelopers.net/faq_at_builder.aspx [/color]

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: stařena

15:27:55 24.11.2010

Zkusil jsem použít:
http://www.mathworks.com/matlabcentral/newsreader/view_thread/96963
ale je to neuvěřitelně pomalé..

Takže jdu zkoušt dál něco jiného:-)

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: grafnev

14:45:06 24.11.2010

Hashovani se pouziva presne pro pripady, kdy ulozeni do nativni struktury ma nizkou hustotu dat.

Hashovaci funkce idealne rovnomerne rozdeli vstupni data do nejake velikostne lepsi struktury ... otazka je jak zvolit dobrou hashovaci funkci:

Pokud mas ukladat prvek podle 5 indexu (a,b,c,d,e) tak hashovaci (a pravdepodobne spatna) funkce muze klidne byt:
1) zkus ulozit prvek a index do linearniho pole s indexem a+b+c+d+e
2) pokud je pole obsazeno uloz ho o 1 dal atd...

pripadne lze vyrobit nejakou castecne dynamickou strukturu:
1) uloz prvek do spojoveho seznamu na indexu (a+b+c+d+e)

Zalezi na tom jak jsou obsazeny jednotlive kombinace indexu ... spise se pouziva ruzne modulo nebo deleni hashovani treba ze se vysledne pole zmensi 10000x tim, se se bude hashovat (a \ 10, b \10, c \ 10, d \10, e \10).

Vyhledavani funguje opacne ... podivam se na pozici kde by podle hashe mela byt informace o prislusnem prvku a pak porovnavam vyhledavany index s ulozenym.

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: Maaartin

14:37:40 24.11.2010

> [ital]Ten asociatyvní kontejner není špatná věc,i když se, původně tím návrhem hashovací funkce taky myslel funkci,ze které mi bude vypadávat index do pole;[/ital]

No hash se da pouzit jako index do pole, ale musis pocitat s konflikty. S fobrym hashem jich bude jich malo ale zabranit jim nemuzes. Pouzij radsi neco hotovyho, treba neco z
http://www.google.com/search?q=matlab+hashmap
pomuze. I kdybys to mela prevadet na stringy, taxe to asi vyplati.

Jsou vstupem cely nebo realny cisla? U realnych jsou problemy se zaokrouhlovanim, coz by u vyhledavani mohlo vadit. Pro cely se da pouzit treba neco jako

hash(a, b) = a * (2*b+1) + 3*b
hash(a, b, c) = hash(hash(a, b), c)
...

pricemz vsecko se pocita treba modulo 2**32 (tohle je pro normalni jazyky).


Nejmin prace by bylo udelat string z tech 5 hodnot a pouzit ho pro
http://www.mathworks.com/matlabcentral/newsreader/view_thread/96963
Samozrejme to neni idealni.

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: stařena

13:57:57 24.11.2010

Ten asociatyvní kontejner není špatná věc,i když se, původně tím návrhem hashovací funkce taky myslel funkci,ze které mi bude vypadávat index do pole;

Píšu to v matlabu.
hodnoty indexů by měly nabývat...mno záleží na parametrech jaký do té funkce zadám..Jde o program na vyhledávání elips v obrzku pomocí houghové transformace.

ale například když vstupní parametry budou:

[code]
[vyska,sirka]= size(obrazek);
vyska=200;
sirka=300;

min_délka_hl_osy= 10;
max_delka_vedlejsi_polosy= 2;
max_delka_hlavni_poloosy= sirka-min_délka_hl_osy/2;

stred_x0= sirka-min_délka_hl_osy;
stred_y0= vyska-min_délka_hl_osy;

uhel_elipsy=360;

indexy [stred,x0,stred_y0,max_delka_hlavni_poloosy,max_delka_vedlejsi_polosy,uhel_elipsy]

pukud bych to chtel psat do pole,tak jeho velikost bude kolem=290*190*145*2*360=5752440 v praxi se ,ale obevi i ohodne vedsi cisla pricemz ta alokovana pamet nebude ani zdaleka vyuzita.
[/codel]

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: tcesky

13:36:15 24.11.2010

[code]
[color=#0000ff]using[/color][color=#000000] System;
[/color][color=#0000ff]using[/color][color=#000000] System.Collections.Generic;
[/color][color=#0000ff]using[/color][color=#000000] System.Linq;
[/color][color=#0000ff]using[/color][color=#000000] System.Text;

[/color][color=#0000ff]namespace[/color][color=#000000] Oldie
{
[/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Program[/color][color=#000000]
{
[/color][color=#0000ff]static[/color][color=#000000] [/color][color=#0000ff]void[/color][color=#000000] Main([/color][color=#0000ff]string[/color][color=#000000][[/color][color=#000000]] args)
{
[/color][color=#0000ff]var[/color][color=#000000] x = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]OldieArray[/color][color=#000000]<[/color][color=#0000ff]int[/color][color=#000000]>();
x[[/color][color=#000000]1, 2, 3, 4, 5] = 1;
x[[/color][color=#000000]1, 2, 3, 4, 6] = 2;
[/color][color=#0000ff]for[/color][color=#000000]([/color][color=#0000ff]int[/color][color=#000000] i=5;i<8;i++) [/color][color=#2b91af]Console[/color][color=#000000].WriteLine(x[[/color][color=#000000]1, 2, 3, 4, i]);
}
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]OldieArray[/color][color=#000000]
{
[/color][color=#2b91af]Dictionary[/color][color=#000000]<[/color][color=#2b91af]Key[/color][color=#000000], T> z_data;
[/color][color=#0000ff]public[/color][color=#000000] OldieArray() { z_data = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Dictionary[/color][color=#000000]<[/color][color=#2b91af]Key[/color][color=#000000], T>(); }
[/color][color=#0000ff]public[/color][color=#000000] T [/color][color=#0000ff]this[/color][color=#000000][[/color][color=#0000ff]int[/color][color=#000000] a1, [/color][color=#0000ff]int[/color][color=#000000] a2, [/color][color=#0000ff]int[/color][color=#000000] a3, [/color][color=#0000ff]int[/color][color=#000000] a4, [/color][color=#0000ff]int[/color][color=#000000] a5]
{
[/color][color=#0000ff]get[/color][color=#000000]
{
[/color][color=#0000ff]var[/color][color=#000000] key = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000](a1, a2, a3, a4, a5);
[/color][color=#0000ff]if[/color][color=#000000] (z_data.ContainsKey(key)) [/color][color=#0000ff]return[/color][color=#000000] z_data[[/color][color=#000000]key];
[/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]default[/color][color=#000000](T);
}
[/color][color=#0000ff]set[/color][color=#000000]
{
[/color][color=#0000ff]var[/color][color=#000000] key = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000](a1, a2, a3, a4, a5);
[/color][color=#0000ff]if[/color][color=#000000] (z_data.ContainsKey(key)) z_data[[/color][color=#000000]key] = [/color][color=#0000ff]value[/color][color=#000000];
[/color][color=#0000ff]else[/color][color=#000000] z_data.Add(key, [/color][color=#0000ff]value[/color][color=#000000]);
}
}
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]class[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000] : [/color][color=#2b91af]IEquatable[/color][color=#000000]<[/color][color=#2b91af]Key[/color][color=#000000]>
{
[/color][color=#0000ff]int[/color][color=#000000] [[/color][color=#000000]]z_key;

[/color][color=#0000ff]public[/color][color=#000000] Key([/color][color=#0000ff]int[/color][color=#000000] a1, [/color][color=#0000ff]int[/color][color=#000000] a2, [/color][color=#0000ff]int[/color][color=#000000] a3, [/color][color=#0000ff]int[/color][color=#000000] a4, [/color][color=#0000ff]int[/color][color=#000000] a5) { z_key = [/color][color=#0000ff]new[/color][color=#000000] [/color][color=#0000ff]int[/color][color=#000000][[/color][color=#000000]] { a1, a2, a3, a4, a5 }; }
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]bool[/color][color=#000000] Equals([/color][color=#2b91af]Key[/color][color=#000000] other)
{
[/color][color=#0000ff]if[/color][color=#000000] (other == [/color][color=#0000ff]null[/color][color=#000000]) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]false[/color][color=#000000];
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 5; i++) [/color][color=#0000ff]if[/color][color=#000000] (z_key[[/color][color=#000000]i] != other.z_key[[/color][color=#000000]i]) [/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]false[/color][color=#000000];
[/color][color=#0000ff]return[/color][color=#000000] [/color][color=#0000ff]true[/color][color=#000000];
}
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]bool[/color][color=#000000] Equals([/color][color=#0000ff]object[/color][color=#000000] obj)
{
[/color][color=#0000ff]return[/color][color=#000000] Equals(obj [/color][color=#0000ff]as[/color][color=#000000] [/color][color=#2b91af]Key[/color][color=#000000]);
}
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]

[/color][color=#000000]
[/color][color=#808080]///[/color][color=#008000] Here is the place to unleash your creativity[/color][color=#000000]
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080]
[/color][color=#000000]
[/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#000000]
[/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]int[/color][color=#000000] GetHashCode()
{
[/color][color=#0000ff]int[/color][color=#000000] h = 0;
[/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 5; i++) h |= z_key[[/color][color=#000000]i] << i;
[/color][color=#0000ff]return[/color][color=#000000] h;
}
}
}

[/color][/code]
[size=10px]Designed for "uvadeni kodu bez jakehokoliv vysvetleni, ktere mozna pomuze v dany okamzik, ale nic nevyresi do budoucna a takovy clovek se stejne nestane vyvojarem a na slozitejsi otazky uz nedojde"[/size]
Zdravím

[color=#808080]
Nejezte žlutý sníh
________________________________________________
Dobře se pobavíte a od srdce zasmějete na stránkách
http://www.4itdevelopers.net/faq_at_builder.aspx

[/color]

[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] Here is the place to unleash your creativity[/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#000000] [/color][color=#808080]///[/color][color=#008000] [/color][color=#808080][/color][color=#000000] [/color][color=#0000ff]public[/color][color=#000000] [/color][color=#0000ff]override[/color][color=#000000] [/color][color=#0000ff]int[/color][color=#000000] GetHashCode() { [/color][color=#0000ff]int[/color][color=#000000] h = 0; [/color][color=#0000ff]for[/color][color=#000000] ([/color][color=#0000ff]int[/color][color=#000000] i = 0; i < 5; i++) h |= z_key[[/color][color=#000000]i] << i; [/color][color=#0000ff]return[/color][color=#000000] h; } } } [/color][/code] [size=10px]Designed for "uvadeni kodu bez jakehokoliv vysvetleni, ktere mozna pomuze v dany okamzik, ale nic nevyresi do budoucna a takovy clovek se stejne nestane vyvojarem a na slozitejsi otazky uz nedojde"[/size] Zdravím TČ [color=#808080] Nejezte žlutý sníh ________________________________________________ Dobře se pobavíte a od srdce zasmějete na stránkách http://www.4itdevelopers.net/faq_at_builder.aspx [/color]

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: Maaartin

13:19:13 24.11.2010

> [ital]Nejjednoudšší ale neefektivní řešení: použít jako hash string obsahující ty čísla

Trochu složitější ale podstatně efektivnější: použít jako hash pole pěti čísel, ale budeš si muset nadefinovat operátory vyžadované použitým kontejnerem (obvykle přiřazení a porovnání)[/ital]

Tomu se snad normalne nerika hash, to je klic. Hash je pak cislo pocitany z klice, tak aby data pokud mozno rovnomerne rozhodilo do (1-rozmerny) tabulky. To co pises ty (operator porovnani) je pro ukladani do tridenyho stromu, co je neco jinyho, ale taky dobry reseni.


> [ital]To je celkem dobrý nápad,ale horší pro mě bude vytvoření hashovací funkce můžete mi nějak poradit jak jít na vytvoření takové funkce tak, aby byla poměrně dobrá?[/ital]

Bud konkretnejsi, co za jazyk pouzivas, jaky hodnoty nabyva ten tvych 5 indexu?

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: Farao

13:11:46 24.11.2010

Nejjednoudšší ale neefektivní řešení: použít jako hash string obsahující ty čísla

Trochu složitější ale podstatně efektivnější: použít jako hash pole pěti čísel, ale budeš si muset nadefinovat operátory vyžadované použitým kontejnerem (obvykle přiřazení a porovnání)

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: stařena

12:55:57 24.11.2010

To je celkem dobrý nápad,ale horší pro mě bude vytvoření hashovací funkce můžete mi nějak poradit jak jít na vytvoření takové funkce tak, aby byla poměrně dobrá?

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: ondro1234

12:34:09 24.11.2010

Map alebo set, kde kluc bude kombinaciou tych 5-tich indexov.

Citovat příspěvek

 

Re: Jak jednoznačně ukládat data

Autor: JiriValerian

12:32:40 24.11.2010

[color=#008000]stařena Napsal:
-------------------------------------------------------
> Ahoj, potřebuji ukládat výsledky do pětirozměrného
> pole (mám 5 indexů),ale toto pole by bylo příliš
> velké,napadá vás nějaký způsob jak pomocí 5 indexů
> identifikovat nějaký prvek a přitom k tomu
> nepoužívat tak obrovské pole?[/color]

Například z těch 5 indexů vytvořit jeden hash a ten pak použít jako identifikátor prvku v nějakém asociativním kontejneru.

Citovat příspěvek

 

Jak jednoznačně ukládat data

Autor: stařena

12:20:06 24.11.2010

Ahoj, potřebuji ukládat výsledky do pětirozměrného pole (mám 5 indexů),ale toto pole by bylo příliš velké,napadá vás nějaký způsob jak pomocí 5 indexů identifikovat nějaký prvek a přitom k tomu nepoužívat tak obrovské pole?

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: