unikatna vsota števil
unikatna vsota števil
Zdravo
Mene zanima če bi se dalo pretvorit vektor števil tako, da bi vedno dobil unikatno število.
[1,6,3,2,1,8] = ?
[8,1,3,6,1,2] = ?
[6,6,6,6,6,6] = ?
[1,7,8,9,3,2] = ?
Rad bi dobil ven vedno različen rezultat (eno število). Enak rezultat bi podali kvečjemu vektorji z enakim zaporedjem in velikostjo. ([1,2,3,4,5] , [1,2,3,4,5]).
Lp,
y0gie
Mene zanima če bi se dalo pretvorit vektor števil tako, da bi vedno dobil unikatno število.
[1,6,3,2,1,8] = ?
[8,1,3,6,1,2] = ?
[6,6,6,6,6,6] = ?
[1,7,8,9,3,2] = ?
Rad bi dobil ven vedno različen rezultat (eno število). Enak rezultat bi podali kvečjemu vektorji z enakim zaporedjem in velikostjo. ([1,2,3,4,5] , [1,2,3,4,5]).
Lp,
y0gie
pozabil
Pozabil sem podat pomemben podatek. Številka (identifikator vektorja) mora biti kvečjemu 2 mestno število [0,99].
Na sestavljanje števil sem že pomislil, ampak potem je številka predolga (največ 18 mestna je lahko)
V bistvu imam takšne podatke: komponente vektorja - 11,12,13,...,50
vektorji so 12 mestni [11,16,13,27,47,34,41,50,11,22,34,34]
Na sestavljanje števil sem že pomislil, ampak potem je številka predolga (največ 18 mestna je lahko)
V bistvu imam takšne podatke: komponente vektorja - 11,12,13,...,50
vektorji so 12 mestni [11,16,13,27,47,34,41,50,11,22,34,34]
okrog 1000
Okrog 1000 vektorjev. (trenutno je max. število 1001).
Ce je to da so komponente manjse od 100 edin pogoj potem krajse kot 24 mest ni mogoce. (toliko je pac kombinacij) Ce najdes se kaksno korelacijo potem se da pomagat. Ce te moti da v racunalnik ne spravis toliksne stevilke predlagam da indeksiras z dvemi "long" ali pa kar z byte-i (ne vem kaj konkretno rabis)
malo več detajlov
se opravičujem. Nisem mel časa razložit celotnega problema, kot bi verjetno moral.
Stvar je taka. Gre za računalniški program, kjer lahko uporabniki vpisujejo določene kombinacije črk in številk. (največ 12 mestno kombinacijo). npr. AGTR002ARU, TZEWGGG0001, TRZZZZZ01, TR01ZZZZZ,... Te kombinacije se shranjujeo v bazo in jih je trenutno okrog 40000, pričakujem pa da se bo ta številka povečala za 2000000. Trenutno traja povpraševanje ali neka kombinacija že obstaja v bazi kakšni 2 sek.
Moja želja je pretvoriti String (kombinacijo) v neko številsko obliko (ker baza dosti hitreje dela na B-drevesu s števili, kot pa z znaki). koliko sem stvar pretestiral bi na 40000 zapisih potem povpraševanje trajalo 40 ms. Še bolje pa je če bi lahko povpraševanje naredil na način, kjer podam max. in min. kombinacije, potem bi moralo to bit nekje med 10 in 20 ms.
Kakorkoli...
Uspelo mi je rešiti do določene mere ta problem. Ustvaril sem index v bazi (zraven kombinacije), ki unikatno določa kombinacijo. Prvo kar naredim je da vsakemu znaku priredim desetiško število, urejeno po velikosti (0 = 1, 1=2, ... A= 10, ...), potem pa postavim vse znake na levo stran, število pa ostane na koncu. tako dobim iz npr. RTZARR900EE - RTZARREE900. Potem kombinacijo pretvorim v 40-tiški zapis. To ustvari število max. dolžine 20 (tip gre v long, torej je manj ko 2 na 64).
Problem nastane pri kombinacijah ki imajo števila razmetana po kombinaciji .. npr. RTA9Z0R0TU.
Tukaj se mi zalomi.
Ma kdo kakšno drugačno idejo ali kakšen pameten predlog ?
Stvar je taka. Gre za računalniški program, kjer lahko uporabniki vpisujejo določene kombinacije črk in številk. (največ 12 mestno kombinacijo). npr. AGTR002ARU, TZEWGGG0001, TRZZZZZ01, TR01ZZZZZ,... Te kombinacije se shranjujeo v bazo in jih je trenutno okrog 40000, pričakujem pa da se bo ta številka povečala za 2000000. Trenutno traja povpraševanje ali neka kombinacija že obstaja v bazi kakšni 2 sek.
Moja želja je pretvoriti String (kombinacijo) v neko številsko obliko (ker baza dosti hitreje dela na B-drevesu s števili, kot pa z znaki). koliko sem stvar pretestiral bi na 40000 zapisih potem povpraševanje trajalo 40 ms. Še bolje pa je če bi lahko povpraševanje naredil na način, kjer podam max. in min. kombinacije, potem bi moralo to bit nekje med 10 in 20 ms.
Kakorkoli...
Uspelo mi je rešiti do določene mere ta problem. Ustvaril sem index v bazi (zraven kombinacije), ki unikatno določa kombinacijo. Prvo kar naredim je da vsakemu znaku priredim desetiško število, urejeno po velikosti (0 = 1, 1=2, ... A= 10, ...), potem pa postavim vse znake na levo stran, število pa ostane na koncu. tako dobim iz npr. RTZARR900EE - RTZARREE900. Potem kombinacijo pretvorim v 40-tiški zapis. To ustvari število max. dolžine 20 (tip gre v long, torej je manj ko 2 na 64).
Problem nastane pri kombinacijah ki imajo števila razmetana po kombinaciji .. npr. RTA9Z0R0TU.
Tukaj se mi zalomi.
Ma kdo kakšno drugačno idejo ali kakšen pameten predlog ?
Ce rabis samo alfanumerike, potem si verjetno ze poskusil stvar spravit v 64=2^6, kar pa na zalost pride 2^72... Ce imas stevilo moznih znakov znatno manjse od 64 je verjetno najpametneje da res pretvoris na tisto bazo, kot si ze na zacetku omenil. Ce imas razlicnih znakov cca. 36 ti pride z zdruzevanjem po dveh znakov do 2^11, torej 2^66 za celoten string. Ce grupiras po 4 bi moralo priti brez tezav v long.
Re: malo več detajlov
Klasična metoda, ki ti stvar pohitri na nekaj 10 mikro sekund pri nekaj miljonih 'itemov' je kvadratična. Torej uporabi 'hash' metodo.y0gie napisal/-a:Ma kdo kakšno drugačno idejo ali kakšen pameten predlog ?
LP GJ
Osnovna ideja algoritma kvadratične metode indeksiranja je dokaj preprosta.Roman napisal/-a:Moram priznati, da tega nisem vedel.
Naj najprej na hitro razložim pomen termina 'hash'.
V našem primeru je vrednost 'hash' indeksna vrednost iskanega/vloženega niza, ki jo dobimo po neki enačbi. Metod za izračun vrednosti 'hash' je več, v odvisnosti od vrste podatkov, ki jih želimo indeksirati.
Najprej določimo območje variable 'hash', ki določa faktor za kolikokrat bo iskanje hitrejše. Recimo da hočemo iskanje pospešiti za 256 krat. V tem primeru nam tip variable 'hash' predstavlja velkost spominske celice enega byte-a (v en byte lahko spravimo število med 0 in 255).
Bazo podatkov razdelimo na 256 pod enot, vsako pa naslavlja 'hash' vrednost torej število med 0 in 255.
Vzamimo za 'hash' metodo navaden 'CheckSum'. Vrednost 'hash' nekega niza, ki ga iščemo v bazi je enaka vsoti vseh byte-ov karakterjev tega niza. Ker je variabla 'hash' velikosti enega byta dejansko uporabimo zgolj zadnjih osem bitov 'CheckSum'-a za naš 'kvadratični' index.
Torej, ko išemo neko vrednost niza v bazi najprej izračunamo 'hash' vrednost, ki nam pove v katerem delu baze moramo nadaljevati iskanje.
Tako smo v našem primeru pohitrili iskanje za približno 256 krat. (Govorimo seveda zgolj o hitrosti iskanja in ne tudi o času, ki je potreben za prenos in obdelavo informacij).
Max. vrednost variable 'hash' (določa tudi število podmožic podatkov) je programsko poljubna. Določimo jo glede na pričakovano število indexov in željeno hitrost odziva.
Lep dan želim še naprej..