2010-11-12 13 views
6

पुस्तक "एल्गोरिथ्म डिजाइन मैनुअल" Skiena द्वारा में, कंप्यूटिंग एक सेट के मोड (सबसे लगातार तत्व), एक Ω कहा जाता है कि (n लॉग n) लोअर बाउंड (इस पहेली मुझे) , लेकिन यह भी (सही ढंग से मुझे लगता है) कि मोड की गणना के लिए कोई तेज़ सबसे खराब केस एल्गोरिदम मौजूद नहीं है। मैं केवल निचले बाध्य होने से परेशान हूं Ω (एन लॉग एन)।रैखिक समय में एक सेट के मोड (सबसे लगातार तत्व) की गणना?

Google Books

पर पुस्तक के पृष्ठ देखें लेकिन निश्चित रूप से यह कुछ मामलों में रेखीय समय (सबसे अच्छा मामले), उदा में परिकलित किया जा सकता जावा कोड द्वारा नीचे की तरह (एक स्ट्रिंग में सबसे लगातार चरित्र पाता है), "चाल" हैशटेबल का उपयोग करके अवसरों की गणना करने के लिए। यह स्पष्ट प्रतीत होता है।

तो, समस्या की मेरी समझ में मुझे क्या याद आ रही है?

संपादित करें: (रहस्य हल) StriplingWarrior बताते हैं के रूप में, निम्न बाउंड धारण करता है, तो केवल तुलना उपयोग किया जाता है, यानी स्मृति का कोई अनुक्रमण, यह भी देखें: http://en.wikipedia.org/wiki/Element_distinctness_problem

// Linear time 
char computeMode(String input) { 
    // initialize currentMode to first char 
    char[] chars = input.toCharArray(); 
    char currentMode = chars[0]; 
    int currentModeCount = 0; 
    HashMap<Character, Integer> counts = new HashMap<Character, Integer>(); 
    for(char character : chars) { 
    int count = putget(counts, character); // occurences so far 
    // test whether character should be the new currentMode 
    if(count > currentModeCount) { 
     currentMode = character; 
     currentModeCount = count; // also save the count 
    } 
    } 
    return currentMode; 
} 

// Constant time 
int putget(HashMap<Character, Integer> map, char character) { 
    if(!map.containsKey(character)) { 
    // if character not seen before, initialize to zero 
    map.put(character, 0); 
    } 
// increment 
    int newValue = map.get(character) + 1; 
    map.put(character, newValue); 
    return newValue; 
} 
+0

इरेटा सूची में कुछ भी उल्लेख नहीं किया गया है: http://www.cs.sunysb.edu/~skiena/algorist/book/errata –

+0

पृष्ठ को पढ़ नहीं सकता है। स्पष्ट रूप से डैनिश, कुछ अपमानजनक संदेश। –

+0

google.dk को google.com पर बदलें, और यह काम करेगा। – StriplingWarrior

उत्तर

10

लेखक अपने तर्क आधारित किया जा रहा है इस धारणा पर कि तुलना आपके लिए एकमात्र ऑपरेशन उपलब्ध है। एक हैश-आधारित डेटा संरचना का उपयोग में तुलना करने की आवश्यकता को कम करने के कारण इस मामले में उस बिंदु पर है जहां आप मूल रूप से निरंतर समय में ऐसा कर सकते हैं।

हालांकि, अगर संख्या हमेशा हैश टकराव का उत्पादन करने के लिए हाथ से उठाई जाती है, तो आप अपने हैश सेट को एक सूची में प्रभावी रूप से बदल देंगे, जो आपके एल्गोरिदम को ओ (एन²) में बना देगा। जैसा कि लेखक बताते हैं, मूल्यों को केवल सूची में सॉर्ट करना सबसे अच्छा गारंटी एल्गोरिदम प्रदान करता है, भले ही अधिकांश मामलों में हैश सेट बेहतर होगा।

+0

@ स्कीपरकॉन्गेन: मोड खोजने के बारे में बात करते समय लेखक वास्तव में बिग-ओ नोटेशन का उपयोग करता है। वह कहता है, "ओ (एन लॉग एन) एल्गोरिदम की तुलना में मोड की गणना करने के लिए कोई तेज़ सबसे खराब केस एल्गोरिदम नहीं है, और हम इसे जानते हैं * क्योंकि सेट में विशिष्टता का परीक्षण करने की समस्या * Ω (n लॉग एन) निचली बाध्य। – StriplingWarrior

+0

मैं स्वीकार करता हूं कि सर्वोत्तम गारंटीकृत एल्गोरिदम ओ (एन लॉग एन) है। लेकिन क्या आप इस बात से सहमत हैं कि यह गलत है कि तत्व विशिष्टता में ओमेगा (एन लॉग एन) निचला बाध्य है? –

+0

तत्व विशिष्टता के लिए विकी पेज वास्तव में उल्लेख करता है कि बाध्य "बीजगणितीय गणना पेड़ मॉडल" के लिए धारण करता है जो इंडेक्स मेमोरी के तत्वों का उपयोग करने पर प्रतिबंध लगाता है ... http://en.wikipedia.org/wiki/Element_distinctness_problem –

2

तो, समस्या की मेरी समझ में मुझे क्या याद आ रही है?

कई विशेष मामलों में, एक सरणी या हैश तालिका पर्याप्त है। "सामान्य मामले" में ऐसा नहीं होता है, क्योंकि हैश तालिका का उपयोग हमेशा स्थिर समय नहीं होता है।

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

2

हैश तालिका लुकअप निरंतर समय परिशोधित कर रहे हैं, जैसे कि, सामान्य रूप में, एन यादृच्छिक चाबी की तलाश की कुल लागत हे (एन) है। सबसे बुरे मामले में, वे रैखिक हो सकते हैं। इसलिए, जबकि सामान्य रूप में वे सबसे खराब स्थिति में करने के लिए हे (एन) मोड गणना के आदेश को कम कर सकता है, यह होगा वृद्धि हे मोड गणना के आदेश (एन^2)।

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