Avatar billede crunch Nybegynder
01. maj 2001 - 21:36 Der er 12 kommentarer og
2 løsninger

hit-liste / grundliggende princip ?

hej.

jeg er interesseret i at finde ud af hvordan jeg nemmest løser følgende opgave:

Lad os sige jeg har en hitliste med 10 navne som er rangeret efter antal stemmer.
Man kan stemme på et ukendt antal navne. Alligevel vil jeg altid have en liste med de 10 mest populære.

Hvordan vil man gøre dette. Altså lad os sige at listen var.:

1. bent =10
2. kurt =7
3. eva =7
4. mogens = 7
5. gert = 5
6. per = 5
7. hans = 4
8. åge = 4
9. alan = 3
10. sven = 2


så hvis der foreksempel blev stemt på
gert
hans
kurt
gert
kurt
kurt

ja, så ville det være svært at vurdere hvordan og hvornår kurt skulle komme ind, numindre man har et eller andet sted man gemmer oplysningerne om hvor mange gange man har stemt på kurt.

lad os sige at vi har 100.000 mulige navne. så bliver det jo svært (og uhensigtsmæssigt) at gemme oplysninger om dem alle, hvis man kun vil have en hitliste med de 10 øverste.

hvad vil an i praksis gøre. jeg vil meget gerne se nogle asp eksempler eller høre forslag.


tak.    (;
Avatar billede mascot Nybegynder
01. maj 2001 - 21:44 #1
du kan jo \"bare\" gemme det i en Access DB og lave en kollonne der hedder \"stem\"
lidt kode:

<%
Conn = \"PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\" & Server.MapPath(\"database.mdb\") & \";UID=admin;PWD=;\"


Set myConn = Server.CreateObject(\"ADODB.Connection\")
strSQL = \"SELECT top 10 * FROM stem ORDER BY stem DESC;\"
myConn.Open Conn
Set rs = myConn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
Do While Not rs.EOF

Response.Write rs(\"stem\")

rs.MoveNext
Loop

End If
myConn.Close
Set myConn = Nothing

/Mascot
Avatar billede tofte Juniormester
01. maj 2001 - 21:46 #2
jeg ser ikke andre muligheder end at gemme alle brugere og deres stemmer i en database. Og hver gang der bliver stemt på en bruger lægger man 1 til hans stemmer, som du selv skriver.
Avatar billede mascot Nybegynder
01. maj 2001 - 21:47 #3
nej ups det kan jo ik lige virke jeg må lige kode lidt mere:

<%
Conn = \"PROVIDER=MSDASQL;DRIVER={Microsoft Access Driver (*.mdb)};DBQ=\" & Server.MapPath(\"database.mdb\") & \";UID=admin;PWD=;\"


Set myConn = Server.CreateObject(\"ADODB.Connection\")
strSQL = \"SELECT top 10 * FROM tabelnavn ORDER BY stem DESC;\"
myConn.Open Conn
Set rs = myConn.Execute(strSQL)
If Not (rs.BOF Or rs.EOF) Then
Do While Not rs.EOF

Response.Write rs(\"navn\")
Response.Write rs(\"stem\")

rs.MoveNext
Loop

End If
myConn.Close
Set myConn = Nothing
%>

så skal du bare lave en Access DB med kollonnerne stem og navn
det burde virke jeg har nu ikke testet scriptet

/Mascot
Avatar billede crunch Nybegynder
01. maj 2001 - 22:05 #4
nej det er ikke grundliggende kode jeg er interesseret i. I min situation kan f.eks. have 2000 brugere, der hver har en hitliste med deres 10 øverste.. (ud af x antal ukendte)

jeg er derfor nødt til at finde en god metode. Jeg kan sagtens kode skidtet hvis jeg har den rigtige formel...
Avatar billede nuno Nybegynder
02. maj 2001 - 11:02 #5
et eller andet sted er du jo nødt til at gemme oplysninger om de navne (eller whatever) der ligger uden for top-10 - ellers vil du jo aldrig kunne finde ud af om en der fx ligger nr. 1000 måske nærmer sig top-10, hvis den lige pludselig får mange stemmer!

/nuno
Avatar billede crunch Nybegynder
02. maj 2001 - 12:44 #6
jamen det er jo præsic det der er mit problem.. Men jeg leder altså efter en smart rutine.
F.eks. et eksempel hvor man bruger en applikationsvariabel til at tjekke dette eller lign.

mit problem er at jeg ikke vil have 2000 felter da jeg risikerer at skulle have funktionen i 2000 instanser..

håber i forstår problematikken.
Avatar billede torbenkoch Nybegynder
02. maj 2001 - 13:28 #7
Kunne man forestille sig, at du som udgangspunkt har en matrix over brugere og hitlistemedlemmer:

B=bruger
H=hitlistemedlem (sange, whatever)

    H1  H2  H3 ...
B1  1  4  7
B2  4  5  3
B3  6  5  4
...

sådan at hvis Bruger 2 stemmer på nummer 3, så kan du skrive noget i stil med:

Oversigt(2, 3) = Oversigt(2,3)+1

Det tager lidt mere arbejde at finde den enkeltes topti, men det er bare et simpelt gennemløb af listen for den enkelte bruger

for i = 1 to antalHitListemedlemmer
  ...
next
Avatar billede crunch Nybegynder
02. maj 2001 - 18:57 #8
Nej det dur nok ikke for jeg ved ikke hvad \"hitlisten\" kommer til at indholde og den er forskellig fra bruger til bruger.. én bruger kan have 4 værdier mens en anden kan have 300.. (og det er ikke de samme)

så det er nok desværre ikke den rigtige model.
):
Avatar billede mascot Nybegynder
02. maj 2001 - 19:38 #9
hvad mener du ???
Avatar billede crunch Nybegynder
02. maj 2001 - 20:14 #10
jo altså. Jeg registrerer \"referals URLs\" fra forskellige brugere og laver toplister.
jeg kan derfor ikke vide hvem der er med og ikke med..
Avatar billede mascot Nybegynder
03. maj 2001 - 14:12 #11
jeg kan ikke hjælpe dig...
Avatar billede nuno Nybegynder
17. maj 2001 - 15:09 #12
derfor er du også NØDT til at gemme oplysninger om dem ALLE. Hvis du nøjes med at gemme det i en applikationsvariabel - så ryger dine data jo - hvis fx serveren skal genstartes! Det kan ikke lade sig gøre at lave en statistik uden at gemme noget data om ALT det man vil lave statistik over - om så det er 10000 records eller ej! Sorry pal.... hvis man vil lave statistik over et stort antal fx urls - så skal man også gemme store mængder urls. There\'s no easy way!

/nuno
Avatar billede nuno Nybegynder
17. maj 2001 - 15:10 #13
desuden er det ikke hensigtsmæssigt overhovedet at belaste serveren med så meget data i en applikationsvariabel.....

/nuno
Avatar billede crunch Nybegynder
17. maj 2001 - 17:57 #14
ok. jeg har iøvrigt fundet en løsning.
(: tak for jeres forslag
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester