2011-06-13 6 views
7

सर्वर को पिछले n दिनों के लिए डेटा बनाए रखना चाहिए। इसे पहले दिन के सबसे अधिक देखी जाने वाले पृष्ठों और फिर अगले दिन के सबसे अधिक देखी जाने वाले पृष्ठों को दिखाना चाहिए।वेब सर्वर के लिए विज़िट किए गए पृष्ठों का इतिहास संग्रहीत करने के लिए डेटा संरचना तैयार करें

मैं हैश मानचित्र के हैश मानचित्र की लाइनों के साथ सोच रहा हूं। कोई सुझाव ?

उत्तर

4

बाहरी हैश नक्शा प्रकार की तारीख और प्रकार के मूल्य हैश नक्शा के साथ।

प्रकार यूआरएल और प्रकार, विज़िट की संख्या युक्त पूर्णांक के मूल्य युक्त स्ट्रिंग की कुंजी के साथ इनर हैश नक्शा। सी # में

उदाहरण:

// Outer hash map  
var visitsByDay = 
    new Dictionary<DateTime, VisitsByUrl>(currentDate, new VisitsByUrl()); 

... 

// inner hash map 
public class VisitsByUrl 
{ 
    public Dictionary<string, int> Urls { get; set; } 

    public VisitsByUrl() 
    { 
     Urls = new Dictionary<string, int>(); 
    } 

    public void Add(string url) 
    { 
     if (Urls[url] != null) 
      Urls[url] += 1; 
     else 
      Urls.Add(url, 1); 
    } 
} 
+0

मैं भी एक ही दिशा में सोच रहा था (का दौरा किया पृष्ठों की संख्या पर निर्भर करता है)। यह एक कुशल समाधान की तरह लगता है। मदद के लिये शुक्रिया ! – Karthik

+0

आपका बहुत स्वागत है! –

+1

यह कार्तिक की अपेक्षाओं को बिना किसी कार्यवाही आवश्यकता के किसी भी विचार के पुनर्जन्म देता है - केवल एक ही है, और बहुत यथार्थवादी नहीं है, लेकिन: "इसे पहले दिन के सबसे अधिक देखी जाने वाले पृष्ठों और अगले दिन के सबसे अधिक देखी जाने वाले पृष्ठों को दिखाना चाहिए और इसलिए पर"। हैश मैप्स को सॉर्ट नहीं किया गया है, और यूआरएल पर आपका कुंजी है - आप सबसे ज्यादा देखे गए पेज को कैसे ढूंढेंगे? ब्रूट फोर्स इटेशन, जो हैश मैप के लिए आमतौर पर वेक्टर पुनरावृत्ति से धीमा होता है। हैश मानचित्र तेजी से इंट्राडे अपडेट की अनुमति देते हैं, लेकिन बाहरी हैश मैप का उपयोग क्यों करते हैं जब एन के सरणी/वेक्टर बेहतर कॉम्पैक्ट और तेज़ होते हैं? –

0

यह आप जो चाहते हैं उस पर निर्भर करता है। उदाहरण के लिए, क्या आप इतिहास के पृष्ठों, या सिर्फ यूआरएल के लिए वास्तविक डेटा स्टोर करना चाहते हैं? अगर किसी ने दो बार एक पृष्ठ का दौरा किया है, तो क्या इसे इतिहास में दो बार दिखाना चाहिए?

एक हैश नक्शा उपयुक्त हो अगर आप एक पेज के लिए डाटा स्टोर करना चाहता था, और केवल एक बार दिखाने के लिए प्रत्येक पृष्ठ चाहता था होगा।

हैं, के रूप में मैं अधिक होने की संभावना पर विचार कर रहे हैं, आप केवल यूआरएल संग्रहीत करना चाहते हैं, लेकिन प्रत्येक संग्रहीत कई बार अगर यह एक बार से अधिक का दौरा किया था, एक सरणी/वेक्टर शायद और अधिक समझ बनाने जाएगा चाहते हैं। यदि आप (अपेक्षाकृत) लंबे यूआरएल के बहुत से डुप्लिकेशंस को देखने की उम्मीद करते हैं, तो आप यूआरएल का एक सेट बना सकते हैं, और प्रत्येक विज़िट के लिए प्रश्न में यूआरएल के कुछ प्रकार के पॉइंटर/इंडेक्स/संदर्भ स्टोर करते हैं। नोट, हालांकि, यह बनाए रखना कुछ हद तक गैर-तुच्छ हो सकता है।

2

आप प्रत्येक दिन प्रकार की इच्छा है कि के लिए एक हैश रख सकते हैं: -

और लंबाई n के एक कतार। जिसमें प्रत्येक दिन इन हैंश होंगे। इसके अलावा, आप अलग हैश totalHits जो इन

Class Stats { 
     queue< hash<url,hits> > completeStats; 
     hash<url,hits> totalStats; 
    public:- 
     int getNoOfTodayHits(url) { 
      return completeStats[n-1][url]; 
     } 
     int getTotalStats(url) { 
      return totalStats[url]; 
     } 
     void addAnotherDay() { 
     // before popping check if the length is n or not :) 
     hash<url,hits> lastStats = completeStats.pop(); 
     hash<url,hits> todayStats; 
     completeStats.push_back(todayStats); 
      // traverse through lastStats and decrease the value from total stats; 
     } 
     // etc. 

}; 
+0

दिलचस्प समाधान, बहुत अच्छा। धन्यवाद। आपने हैश के हैश की बजाय हैश टेबल की कतार का उपयोग करना चुना है। किसी भी विशेष कारण से आपने इसे चुना है ?? मुझे लगता है कि आंकड़ों की खोज करते समय आपको पूरी कतार से स्कैन करना होगा। आपका विचार प्रवाह क्या है? – Karthik

+0

मुझे हैश में कुंजी के लिए तारीखों को संभालने की आवश्यकता नहीं है :) पॉप पुश काम करता है: पी – MarutiB

1

के सभी योग होगा हम के ढेर & हैश मानचित्र एक संयोजन हो सकता स्टोर करेगा।

हम, यूआरएल और टाइमस्टैम्प की एक वस्तु बनाने के तो ढेर पर इसे धक्का कर सकते हैं। हाल ही में देखा गया यूआरएल शीर्ष पर होगा।

हम एक कुंजी है, जो देखे गए URL के गिनती के लिए मैप किया गया है बनाने के लिए टाइमस्टैम्प यूआरएल के साथ संयुक्त उपयोग कर सकते हैं।

आदेश कालानुक्रमिक क्रम में सबसे का दौरा किया पृष्ठों को प्रदर्शित करने के लिए, हम ढेर पॉप, एक महत्वपूर्ण बना सकते हैं और यूआरएल के साथ जुड़े गिनती लाने कर सकते हैं। प्रदर्शित करते समय उन्हें क्रमबद्ध करें।

समय जटिलता: हे (एन) + क्रमबद्ध समय

संबंधित मुद्दे