2010-03-03 12 views
15

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/क्या एक्शनस्क्रिप्ट 3 शब्दकोश हैशपैप है?

शब्दकोश जो मुझे चाहिए वह मुझे करता है लेकिन मुझे प्रदर्शन की परवाह करने की आवश्यकता है। क्या किसी को पता है कि शब्दकोश हैशटेबल के रूप में लागू किया गया है?

या अधिक विशेष रूप से, क्या यह ओ (1) में प्रदर्शन करता है? ।

+0

इस पर एक नज़र डालें: http://code.google.com/p/ashashmap/ –

+1

@ जॉर्ज प्रोफेन्ज़ा: जितना अच्छा मैं इसे एस, यह एक कुल मिलाकर overkill है। क्यों कुछ ऐसा पहले से मौजूद है जो पहले से मौजूद है? – back2dos

+0

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

उत्तर

14

यह एक hashmap के रूप में कार्य करता है। वास्तव में, प्रत्येक एक्शनस्क्रिप्ट ऑब्जेक्ट जो एक गतिशील वर्ग का उदाहरण है, हैशपैप के रूप में कार्य करता है। निश्चित रूप से चाबियाँ हमेशा गुणों के साथ टकरा सकते हैं। यह व्यवहार जावास्क्रिप्ट से आता है। मैं इसे एक डिजाइन विफलता मानता हूं।

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

अब आप इसकी देखभाल क्यों करेंगे कि इसे कैसे लागू किया जाए? अगर यह अच्छी तरह से लागू किया गया है, तो आप शायद जानना नहीं चाहते हैं। आप इसे बेंचमार्क कर सकते हैं। इसमें सभी परिचालनों के लिए ओ (1) है और यह काफी तेज़ है (एक खाली विधि कॉल के रूप में लगभग दोगुना समय लगाना, लागत कम करना)। कोई भी वैकल्पिक कार्यान्वयन धीमा हो जाएगा।

यहाँ एक सरल बेंचमार्क (रिहाई के लिए यह संकलन और सही खिलाड़ी में इसे चलाने के लिए सुनिश्चित करें):

package { 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.utils.*; 
    public class Benchmark extends Sprite { 

     public function Benchmark() { 
      var txt:TextField = new TextField(); 
      this.addChild(txt); 
      txt.text = "waiting ..."; 
      txt.width = 600;   
      const repeat:int = 20; 
      const count:int = 100000; 
      var d:Dictionary = new Dictionary(); 
      var j:int, i:int; 
      var keys:Array = []; 
      for (j = 0; j < repeat * count; j++) { 
       keys[j] = { k:j }; 
      } 
      setTimeout(function():void { 
       var idx:int = 0; 
       var out:Array = []; 
       for (j = 0; j < repeat; j++) { 
        var start:int = getTimer(); 
        for (i = 0; i < count; i++) { 
         d[keys[idx++]] = i; 
        } 
        out.push(getTimer() - start); 
       } 
       txt.appendText("\n" + out); 
       start = getTimer(); 
       for (var k:int = 0; k < i; k++) { 
        test(); 
       } 
       txt.appendText("\ncall:"+(getTimer() - start)); 
       idx = 0; 
       out = []; 
       for (j = 0; j < repeat; j++) { 
        start = getTimer(); 
        i = 0; 
        for (i = 0; i < count; i++) { 
         delete d[keys[idx++]]; 
        }    
        out.push(getTimer() - start); 
       } 
       txt.appendText("\n" + out); 
      },3000);//wait for player to warm up a little 
     } 
     private function test():void {} 
    } 
} 
+0

धन्यवाद, बहुत जानकारीपूर्ण। मैं जानना चाहता हूं क्योंकि मुझे यह तय करना होगा कि इसका उपयोग करना है या किसी अन्य वर्ग का उपयोग करना है जो हैशप (यदि यह नहीं था)। मैं इसे हां प्रोफाइल कर सकता हूं, लेकिन यह जानना कि यह हैशपैप आसान है या नहीं। –

+0

@ बार्ट वैन हेकुलोम: मुझे मदद करने में खुशी है।अभी भी "हैशमैप के रूप में कार्यान्वित" मुझे लगता है कि आपका मतलब है "जावा.यूटिल। हैशमैप के रूप में लागू"। और जवाब है, मुझे नहीं पता। शायद ऩही। जावा हैशमैप को JVM पर अच्छा प्रदर्शन करने के लिए अनुकूलित किया गया है। फ़्लैश प्लेयर में, यह मैकेनिज्म देशी और पूरी तरह से पारदर्शी है। अगर कार्यान्वयन बदलता है, या प्लेटफार्मों पर निर्भर करता है तो मुझे आश्चर्य नहीं होगा। एकमात्र चीज जो कुछ निश्चित रूप से कह सकती है वह यह है कि यह वास्तव में कार्य करता है क्योंकि हैश तालिका को आमतौर पर परिभाषित किया जाता है, ओ (1) को डालने/हटाने के लिए भी। – back2dos

+0

भ्रम के लिए खेद है, मेरा मतलब सामान्य है –

0

एडोब प्रलेखन सहयोगी सरणियों पर सूचित करते हैं कि शब्दकोशों HashMaps हैं लगता है:

शब्दकोशों

"आप एक साहचर्य सरणी तार के बजाय चाबी के लिए वस्तुओं का उपयोग करता है बनाने के लिए शब्दकोश वर्ग का उपयोग कर सकते इस तरह के सरणियों कभी कभी कहा जाता है, हैश, या नक्शे। "

http://livedocs.adobe.com/flex/3/html/help.html?content=10_Lists_of_data_4.html

4

नहीं, यह नहीं है। जावा हैशैप्स हैश कोड पर आधारित हैं, जबकि शब्दकोश सख्त समानता (===) कुंजी पर आधारित है और इसलिए यदि आप वस्तुओं को कुंजी के रूप में रखने की योजना बनाते हैं तो इसका उपयोग नहीं किया जाना चाहिए।

जावा:

class MyStuff { 
    public final int id; 

    MyStuff(int i) { 
    this.id = i; 
    } 
    public int hashCode() { 
    return this.id; 
    } 
    public int equals(MyStuff o) { 
    return (this.id - o.id); 
    } 
} 

Map<MyStuff, Object> m1 = new HashMap<MyStuff, Object>(); 
m1.put(new MyStuff(1), new Object()); 
assert(m1.get(new MyStuff(1)) != null); //true 

AS3:

class MyStuff { 
    public var id:Number; 

    public function MyStuff(i:Number):void { 
    this.id = i; 
    } 
    //no notion of hashCode or equals in AS3 Object class, 
    //so we can't really control how the Objects are compared. 
} 

var d:Dictionary = new Dictionary(); 
d[new MyStuff(1)] = {}; 
trace(d[new MyStuff(1)]); //outputs null 

मैं AS3 में हैशिंग को लागू करने के सही तरीके से में देख रहा हूँ, लेकिन यह बहुत निराशात्मक दिखता है ...

+0

सख्त समानता मेरे उद्देश्यों के लिए ठीक है। मैं गेम बना रहा हूं, जहां प्राकृतिक वस्तुओं एक ओआरएम स्थिति के विपरीत, उदाहरणों के लिए 1: 1 से मेल खाते हैं। मैं यादृच्छिक अभिगम प्रदर्शन के बारे में अधिक चिंतित हूं। –

+0

सख्त समानता मानते हुए, स्मृति में ऑब्जेक्ट का पता इसके हैशकोड के रूप में ठीक काम कर सकता है। AFAIK एक्शनस्क्रिप्ट कोड उस मान को प्राप्त नहीं कर सकता है, लेकिन मूल फ्लैश कार्यान्वयन में इसके साथ कोई समस्या नहीं होगी। – Brilliand

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