2013-01-11 27 views
4

我有以下要求來實現這對我造成了一個「難題」:
我有Web服務器和各種用戶(已驗證和登錄)訪問網站的各個區域(即按照並瀏覽各種鏈接)。這些操作(或稱爲瀏覽)正在被記錄到日誌文件中。
因此,這些文件捕獲用戶訪問服務器的日期以及訪問的各種鏈接(即URL)。
的記錄(說明目的)簡化格式可以如下:
Timestamp User-Name URL-1
所以給日誌的一個簡單的例子,我們可以有(假設此有效日期):最常訪問的URL最大序列

Date-1 John URL-1 
Date-1 Nick URL-1 
Date-1 John URL-2 
Date-1 George URL-1 
Date-1 George URL-2 
Date-1 Eve  URL-2 
Date-1 Nick URL-2 
Date-1 John URL-3 
Date-1 George URL-3 
Date-1 John URL-5 
Date-1 Nick URL-3 
Date-1 Bill URL-2 
Date-1 George URL-5 
Date-1 Nick URL-5  
Date-1 Eve  URL-3     
Date-1 Eve  URL-5 

等等,並可以有人/數千條目
當我說URL-1我的意思是一個有效的網站的URL,所以URL-1在約翰和夏娃真的意味着他們都訪問了相同的鏈接。在此示例中,URL-2,URL-3,URL-5是最常用的訪問URL序列。

問題:我有興趣使用這些信息,並找到所有用戶在日誌文件覆蓋的整個日期時間範圍和/或特定日期時間訪問的最常訪問的URL序列。
我對如何去做這件事有一些想法。例如。我的第一個想法是將所有內容都存儲在HashMaps中,幷包含每個外觀的計數器,然後遍歷映射條目以查找最大值,但在我看來,它在空間和運行時都有巨大的開銷。
此外,我對此的看法越多,似乎它可能有一個「標準」解決方案,例如對於字符串模式匹配,則會遵循KMP algorithm
然後我想我是否可以使用例如後綴樹,但我只知道實施一個trie和空間複雜性,這將是我相信O(N^2)。我知道有壓縮版本,但我認爲它們太複雜,如果有更好的/標準的解決方案來解決這個問題,我不想浪費時間。

任何建議/意見非常感謝。

+0

請說清楚,你正在說** **序列的網址**?或關於分開的**網址**? – Andremoniy

+0

@Andremoniy:我不明白你的問題。我的意思是'URL-2,URL-3,URL5'.這是訪問的訂單 – Cratylus

+0

我認爲你應該考慮一個數據庫來存儲你的網站點擊率。每次您重新啓動應用程序時,都必須重新解析所有日誌文件,這會造成大量開銷。當它在一個數據庫中時,你可以查詢你所需要的。 – tom

回答

3

那麼,你說,任何建議/意見非常感謝。。因此,讓我建議你簡要如下算法:用於需要日期範圍

  1. 過濾日誌文件,收集的URL序列爲每個用戶在平行一些List

  2. 第1步之後,你有一系列大的序列。在這一步中,這個問題相當於找到most common substring in list of strings的任務。這已經解決了問題。

UPD:之後考慮每個URL像一些"string"一個"char"

+0

這就是我原先認爲這就是爲什麼我提到後綴樹的原因。您是否在暗示DP? – Cratylus

+0

是的,確切的DP。在這種情況下,每個URL都將像'string'中的'char'。 – Andremoniy

+0

空間需求依然是'O(N^2)'嗎?爲什麼這會比後綴trie更好? – Cratylus

0

對不起,但我不認爲有可能用你的日誌文件中的數據來實現這一點。

我看到的問題是,您正在尋找URL的使用最多的序列。 在您的問題中,您只有userId而不是會話指示符,這意味着您無法可靠地找出他們在單個會話中所做的事情。試圖找出他們正在採取的路徑時,您可能會混合不同的會話。

假設你有一個sessionId,你可以創建每個會話的路徑並運行一些(還未知的)程序來找到最常用的'弧線'。

+0

高中畢業已經很長時間了,但我正在思考Dijkstra圖表或某些衍生工具的方向。 – tom

+0

但是爲什麼我會關心會話呢?我只需要知道'URL-1'已經被訪問過或沒有被訪問過。會話與此有什麼關係? – Cratylus

+0

@Tom,日誌文件中的行按時間順序排序。這意味着,如果用戶'USER-1'出現在具有「URL-1」的日誌文件中,並且在用戶'USER-1'出現了一些用'URL-3'的行後 - 所以'USER-1'訪問了'URL -1',之後'URL-3',所以'URL-1,URL-3'是他的序列。 – Andremoniy