2011-10-04 17 views
6

ठीक है, तो, कहें कि मेरे पास एक टेक्स्ट फ़ाइल है (आवश्यक रूप से प्रत्येक संभावित प्रतीक नहीं है) और मैं आवृत्ति की गणना करने के बाद, प्रत्येक प्रतीक की आवृत्ति की गणना करना चाहता हूं, फिर मुझे प्रत्येक प्रतीक और इसकी आवृत्ति से पहुंचने की आवश्यकता है सबसे कम से कम लगातार। प्रतीकों अनिवार्य रूप से ASCII वर्ण नहीं हैं, वे सभी समान लंबाई के बावजूद मनमानी बाइट अनुक्रम हो सकते हैं।क्या फ़ाइल में सभी प्रतीकों की आवृत्ति की गणना करने का कोई बेहतर तरीका है?

मैं कुछ इस तरह (स्यूडोकोड में) कर रहा विचार कर रहा था:

function add_to_heap (symbol) 
    freq = heap.find(symbol).frequency 
    if (freq.exists? == true) 
     freq++ 
    else 
     symbol.freq = 1 
     heap.insert(symbol) 

MaxBinaryHeap heap 
while somefile != EOF 
    symbol = read_byte(somefile) 
    heap.add_to_heap(symbol) 
heap.sort_by_frequency() 

while heap.root != empty 
    root = heap.extract_root() 
    do_stuff(root) 

मैं सोच रहा था: वहाँ एक बेहतर, सरल गणना करने के लिए जिस तरह से और दुकान कितनी बार प्रत्येक प्रतीक एक फ़ाइल में होता है?

+0

लगता है कि आपके पास दो विकल्प हैं, हैशप आपको ओ (1) आवृत्ति पुनर्प्राप्ति दे रहा है लेकिन कोई आदेश नहीं दिया गया है (अक्सर कम से कम लगातार) परिणाम या ओ (एलजी एन) खोज पेड़/ढेर का उपयोग करके डालें और खोज करें लेकिन आपको ऑर्डर देने वाला अक्सर कम से कम लगातार) परिणाम। –

+1

एक द्विआधारी ढेर इस के लिए विशेष रूप से अच्छी डेटा संरचना नहीं है, क्योंकि ढेर में मनमाने ढंग से नोड ढूंढना महंगा है। आप बाइनरी पेड़ के साथ बेहतर काम करेंगे या, जैसा कि दूसरों ने इंगित किया है, किसी प्रकार की हैश टेबल। –

उत्तर

3

आप हमेशा हीप के हैश मैप isntead का उपयोग कर सकते हैं। इस तरह आप ओ (लॉग एन) wheres n के बजाय पाए गए प्रत्येक प्रतीक के लिए ओ (1) में ऑपरेशन कर रहे होंगे, वर्तमान में ढेर पर मौजूद वस्तुओं की संख्या है।

हालांकि, यदि विशिष्ट प्रतीकों की टी संख्या उचित संख्या से बाध्य है (1 बाइट आदर्श है, 2 बाइट अभी भी ठीक होना चाहिए), तो आप केवल उस आकार की सरणी का उपयोग कर सकते हैं और फिर ओ (1) है लेकिन साथ एक काफी कम स्थिर लागत।

2

आप बार चल रहा है के आधार पर एक "सर्वश्रेष्ठ" समाधान के लिए देख रहे हैं, यहाँ मैं क्या सुझाव है कि करेंगे:

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

एक बार जब आप अपने सभी प्रतीकों को पढ़ लेंगे, तो आपको आवृत्ति गणनाओं के आधार पर अपना ऑर्डरिंग स्विच करनी चाहिए। मैं सबकुछ एक सरणी में पढ़ता हूं और फिर इन-प्लेस सॉर्ट करता हूं, लेकिन ऐसा करने के बराबर तरीके हैं।

आशा है कि इससे मदद मिलती है!

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

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