Vad skall du ha det till? Allt du har i datorn, även text, är i binärkod. Jag kanske var lite oklar. Hej Vet du hur binärträd fungerar och vill veta VB-kod för att skapa det? Eller kan du VB hyfsat och vill veta hur binärträd fungerar? Jag kan hjälpa dig med det senare, för jag programmerar ju en hel del, men jag har inte sett någon anledning att lära mig avancerade saker i VB eftersom det ändå är enklare och går snabbare att göra det i C. Jag kan VB och det är träden jag är ute efter... Först ska jag väl nämna den länkade listan. Ska man ha en stor lista, eller en lista som kan variera mycket i längd, är det inte så lämpligt med en array eftersom en array har en bestämd storlek. En länkad lista däremot tar inte upp mer plats än den behöver och det är inga problem att lägga till och ta bort saker ur listan. Varje element i listan innehåller nämligen förutom datat också en länk till nästa element, och det är så själva listan upprätthålls. För att överföra listan till en funktion så skickar du bara över länken till första elementet, för alla övriga element fås ju därur. Nackdelen är att det inte finns något sätt att direkt ta sig till (exempelvis) det trettionde värdet, utan man måste då stega sig igenom listan tills man har nått det värde man vill ha. Att söka i en sån här lista kan alltså ta ganska lång tid. I värsta fall blir man ju tvungen att gå igenom hela listan. Tack för svaret. men om jag inte är du så har du skrivit fel... Tänk på att det på varje ställe ska finnas lika mycket till vänster som till höger. Både Svensson och Turesson kommer ju efter Olsson i alfabetet, alltså skulle det bli mer till höger om du satte Olsson överst. då har jag ju fattat...*wow* Ja, du får göra fler binärträd; ett för varje sorts data du behöver kunna söka efter, plus ett som knyter ihop dem. Varje rad i loggen får ett unikt nummer. Kanske kan tilläggas att om du inte vill sitta och skriva egen kod för det här så finns det redan program som gör det. De kallas för databaser och använder ett språk som heter SQL för att söka efter data. Exempel på program för det är MS SQL Server och MySQL. Den senare är gratis och finns på http://www.mysql.com/ Jo jag känner till sql :-)Sv: text till binärkod
Om du vill konvertera en bokstav till talkoden använder du
iKod=Asc(sBokstav)
(Funktionen använder första bokstaven i strängen)
Sättet du använder beror lite på vad du skall ha den till.
/Niklas JanssonSv: text till binärkod
Vad är det du vill göra?Sv: text till binärkod
Det jag vill är att bygga binär-träd, som då ska bli väldigt snabba att söka i.Sv: text till binärkod
Jag tror att du tänker fel.
Alla texter är binära i grunden.
En som tror att han tror hur en annan tror
mvh
SvenSv: text till binärkod
Sv: text till binärkod
Det vore väldigt vänligt om du berättade
tack AndreasSv: text till binärkod
Ett binärträd bygger också på att man länkar till olika element, men med skillnaden att ett element har två länkar (vänster och höger) istället för bara en. På något sätt ska man kunna göra en jämförelse och om det eftersökta värdet är mindre än det aktuella elementets så tar man den vänstra länken, annars den högra. I det optimala fallet så finns det lika många element till vänster som till höger och att hitta rätt värde bland N st kräver i värsta fallet bara att man följer log2 * N länkar (istället för N st som i fallet med den länkade listan).
Har vi t.ex. en enkel telefonkatalog med sju namn så lagras det så här: (egentligen kan man ju rita upp det som ett fint träd, med Nilsson i toppen, och så går det ner två grenar därifrån till Eriksson och Svensson varifrån det går grenar till Andersson och Johansson respektive Olsson och Turesson)
värde: Nilsson
vänster: Eriksson
höger: Svensson
värde: Eriksson
vänster: Andersson
höger: Johansson
värde: Svensson
vänster: Olsson
höger: Turesson
värde: Andersson
vänster: NULL
höger: NULL
värde: Johansson
vänster: NULL
höger: NULL
värde: Olsson
vänster: NULL
höger: NULL
värde: Turesson
vänster: NULL
höger: NULL
Ska vi nu söka efter Olsson går det till så här:
Vi jämför först Nilsson mot Olsson, är Olsson större, mindre eller lika? Det är större än Nilsson, alltså går vi till höger och hamnar på Svensson. Ny jämförelse. Olsson är mindre än Svensson, vi går till vänster och hittar Olsson. Är det större, mindre eller lika med Olsson? Det är lika. Vi har hittat det vi sökte och behövde bara följa tre länkar.
Söker vi efter Jonsson så kommer vi att gå vänster från Nilsson, till Eriksson, därifrån höger (Jonsson kommer efter i alfabetet) till Johansson och därifrån höger igen till NULL. NULL innebär att det är slut och vi får meddela att Jonsson inte fanns. Och vi behövde inte ens gå igenom hela listan!
Vad det gäller sökning är det ju rätt praktiskt, men vad händer om vi ska lägga in fem personer till som heter X-sson, Y-gren, Z-ström, Å-sson och Ä-sson? Ja, då hamnar de ju nere hos Turesson och vi får en övervikt på personer där, vilket gör att det tar längre tid att söka i den delen av alfabetet. Inte bra. Allt eftersom det läggs till saker i trädet måste man "balansera" om det (i det här fallet kanske Olsson får hamna överst istället för Nilsson) så det blir jämnt (eller jämnare) fördelat.
Exakt hur man balanserar lämnar jag (som det så vackert heter :-) som en övning åt läsaren. Eller så kanske jag utvecklar det senare om det behövs. Nu har du nog förhoppnings fått lite att jobba med i alla fall...Sv: text till binärkod
Kan olsson vara till vänster om Svensson?
borde det inte vara
Ols
|
--------
| |
Sven.. Ture
Jag mailar dig....Sv: text till binärkod
Du kan fördela det hur du vill, men om det inte är jämnt så får du inte den där snabba sökningen garanterad.
Kom också ihåg att det som står till vänster ska komma före i alfabetet och det som står till höger ska komma efter. Med Olsson överst blir det alltså:
Olsson
|
-------------
| |
NULL Svensson
|
-----------
| |
NULL TuressonSv: text till binärkod
men om jag har en log från IIS med info om vilken sida som är besökt och vilken ip och domän besökaren hade mm...
det blir ju fler dimensioner då eller?Sv: text till binärkod
Säg t.ex. att loggen ser ut så här:
192.168.0.7 local2.net http://host/index.html
192.168.0.7 local2.net http://host/somewhere/
192.168.0.9 local4.net http://host/index.html
192.168.0.6 local1.net http://host/index.html
192.168.0.8 local3.net http://host/somewhere/else/
Vi ger varje rad ett unikt id-nummer (1-5) och lägger upp dem i ett träd:
ID: 3
Host: 192.168.0.9
Domain: local4.net
URI: /index.html
Vänster: 2
Höger: 4
ID: 2
Host: 192.168.0.7
Domain: local2.net
URI: /somewhere/
Vänster: 1
Höger: NULL
Osv... (Du hänger väl med?)
Dessa ID-nummer som varje rad i loggen får använder vi nu som data i de övriga binärträden. Eftersom de olika sakerna (host, domain och uri) kan förekomma samma flera gånger får vi lagra ID-numrena i en länkad lista.
Vi tar och kikar på host först:
Host: 192.168.0.8
ID: 5
Next_ID: NULL (192.168.0.8 förekommer ingen fler gång.)
Vänster: 192.168.0.7
Höger: 192.168.0.9
Host: 192.168.0.7
ID: 1
Next_ID: (Pekar på ID: 2 och Next_ID: NULL)
Vänster: 192.168.0.6
Höger: NULL
Osv... Sedan gör du likadant med domain och uri och använder samma id-nummer...Sv: text till binärkod
Sv: text till binärkod
men den blir för slö om man stoppar in 20 gigabyte om dagen...