Automatikus top lista algoritmus

Szükségem van az alábbira:

Adottak felhasználók által meglátogatott linkek. Ebből van "n" darab. Tárolom hogy melyik linket mikor látogatták meg utoljára.

Egy oldalon megjelenítem a leggyakrabban használt linkeket ezek közül. Viszont nem egy hosszú top listát akarok nyomtatni az utolsó látogatás ideje alapján, hanem automatikusan röviden akarom tartani ezt a listát. Végül az alábbi algoritmust terveztem meg:

Azt vizsgálom, hogy a linkek látogatási ideje között mennyi idő telt el és ezt nevezzük "idő"-nek. Sorba rendezem a linkeket idő szerint, majd a legújabbtól a legrégebben látogatott felé haladva az alábbit csinálom:

Addig lépkedek és tárolom a maximum értéket (legyen "max"), ameddig a lépkedés felfelé tart (vagyis egyre nő az idő köz). Amint lefelé irányba érkezek, akkor addig megyek, míg az idők max értéken belül vannak és a linkeket is csak eddig printelem. Ha max értéknél nagyobbra futnék, akkor onnétól már nem veszem be a többit.

Egyetlen kikötés, hogy egy megadott minimum érték alatti értékeket minimumnak veszek. Hogy az ingadozást egy szint alatt tartsam. Ez nálam 1 nap lesz.

Ez azért kell így nekem meg azért lesz jó, mivel azt akarom elérni, hogy automatikusan leválasszam a túl régen látogatottakat. Viszont persze a "régen" megnevezés itt nem egyértelmű és pontosan ezt kellett feljebb definiálnom.

Példa ruby kód, ahol a minimum érték 1, és 10 darab 1-10-es véletlen értékű listát vizsgálok (a lista már az idő közöket mutatja):


#!/usr/bin/env ruby

list = Array.new(10).map{(rand 10) + 1}

min = 1
max = 0
direction = 1
flag = 1

list.each { |x|  
        y = x
        y = min if y < min

        if direction
                if y >= max
                        max = y
                else
                        direction = nil
                end
        else
                if y > max and flag
                        puts "---"
                        flag = nil
                end
        end

        puts "o" * x
}

Példa kimenet (3 fajta):


oooo
oooooooo
ooooooooo
ooooooooo
ooooooooo
ooooo
ooo
---
oooooooooo
oooooo
oooo


ooooooo
o
ooooo
oooo
---
oooooooooo
oooooo
oooooooooo
ooooo
o
ooooooooo


ooooo
oooooooo
o
oooooooo
oooooo
oooooo
---
oooooooooo
ooooo
ooooooo
oooooo

Még vizsgálom több szempont szerint, hogy ténylegesen meg fog-e felelni nekem.

Kiegészítés: nem akarom tárolni a linkekre klikkelések számát és mindenképpen kizárólag a látogatottsági idő alapján akarok dönteni. A vonalak mutatják, hogy honnét értékelem réginek az elemeket.

Hozzászólások

Tipp: ne hasznalj tobbsoros curly brace altal hatarolt blokkokat, mert az csunyanak szamit a Rubys vilagban. Helyette ajanlom a do / end parost, amely ugyanugy hasznalhato, mint a curly brace, csak "szebb" multiline kornyezetben.

A masik: ha valami flag, akkor erdemes a [true, false] ertekkeszletbol erteket adni neki. Attol, mert az 1 az true a nil meg false-kent ertekelodik az ifben, attol meg nem szep a hasznalatuk. Pont erre valo a boolean tipus
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Se most, se később nincs szándékomban. Nem zavar hogy ki mit hogyan szokott, főleg nem pár soros script erejéig. Számomra a legfőbb a szabadság, még azon az áron is, hogy más nem tudja olvasni a kódomat. Nem mintha szerintem olvashatatlan kódot gyártanék. A true / false-ot meg rühellem ;)

(Egyszerűbben fogalmazva a működést, az első hegyen megyek át, és addig ok míg az elsőnél nagyobb hegyhez nem érek.)

Megvizsgáltam és jónak tűnik. Olyan esetben is, hogy régen nem volt klikk a linkre, és így az újat előre hozza nagyon időben, a többi pedig "távol" marad. Mert ilyenkor az első hegy nagy lesz, és nem dobódik ki a többi, tehát "stabil"-nak fogható fel a működés. Az nem lett volna jó, ha össze vissza ugrál a lista.


class Array
  def gnomesort!
    i, j = 1, 2
    while i < length
      if self[i-1] <= self[i]
        i, j = j, j+1
      else
        self[i-1], self[i] = self[i], self[i-1]
        i -= 1
        if i == 0
          i, j = j, j+1
        end
      end
    end
    self
  end
end

ary = [7,6,5,9,8,4,3,1,2,0]
ary.gnomesort!

:D :D :D :D
--
Coding for fun. ;)

Nem baj :)

Arról van szó, hogy egy weboldalon egy részen össze akarom gyűjteni a leggyakrabban látogatott részek linkjeit. Ezen részeknek csak a legutolsó látogatás dátumát tárolom. A valaha megtett klikkek számát direkt nem.

Feladat, hogy ezt a listát automatikusan röviden tartsuk és mondjuk meg, hogy a létező N darab linkből csak mennyit jelenítsünk meg (idő szerint rendezve vannak).

A túl régieket ne jelenítsük meg, mert rontja az átláthatóságot a túl sok link. A túl kevés is. Mi számítson túl réginek?

Illetve ne ugráljon "folyamatosan" ez a halmaz.