2010-03-03 39 views
15

http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/Từ điển ActionScript 3 có phải là một hashmap không?

Từ điển làm những gì tôi cần nhưng tôi cần phải quan tâm đến hiệu suất. Có ai biết nếu từ điển được thực hiện như là một hashtable?

Hoặc cụ thể hơn, nó có hoạt động trong O (1) không?

+0

có cái nhìn tại đây: http://code.google.com/p/ashashmap/ –

+1

@George Profenza: tốt như tôi s, đó là một overnill totall. tại sao reimplement một cái gì đó đã tồn tại nguyên bản? – back2dos

+0

@ back2dos bạn nói đúng. Nó phụ thuộc vào tình hình mặc dù. Tôi đã không đề nghị sử dụng nó, nhưng để có một cái nhìn. Kể từ khi ashashmap được coi là làm việc như một Java, sử dụng nó phải dễ dàng, vì vậy cho một công việc nhanh chóng và bẩn, nên được tốt. Đối với mã quan trọng tốc độ và kiểm soát những gì xảy ra trên tất cả các mã, sự hiểu biết và sử dụng các đối tượng từ điển là con đường phía trước. Tôi đã thêm một bình luận, không phải là một câu trả lời bởi vì nó là một điều phụ, không phải là một câu trả lời thực sự. Cảm ơn đã cho tôi thấy nơi tôi không rõ ràng. –

Trả lời

14

hoạt động như một bản đồ băm. trên thực tế, mọi đối tượng ActionScript là một thể hiện của một lớp động, hoạt động như là hashmap. tất nhiên các khóa luôn có thể va chạm với các thuộc tính. hành vi này xuất phát từ JavaScript. Tôi coi đó là một thất bại thiết kế.

Mảng khác nhau ở chỗ nó sẽ thực hiện một số thủ thuật trên các phím nguyên và từ điển khác ở chỗ nó không chuyển đổi khóa thành chuỗi, nhưng sử dụng bất kỳ giá trị đối tượng nào làm khóa. Xin lưu ý rằng Số và Boolean đều được chuyển thành Chuỗi.

tại sao bạn lại quan tâm đến cách triển khai? nếu nó được triển khai tốt, có thể bạn không muốn biết. Bạn có thể đánh giá nó. Nó có O (1) cho tất cả các hoạt động và là hợp lý nhanh (chèn chi phí khoảng hai lần nhiều thời gian như một cuộc gọi phương thức trống, xóa chi phí ít hơn). Mọi triển khai thay thế sẽ chậm hơn.

đây một chuẩn mực đơn giản (hãy chắc chắn để biên dịch nó cho phát hành và chạy nó trong máy nghe nhạc bên phải):

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

Cảm ơn, rất nhiều thông tin. Tôi muốn biết bởi vì tôi sẽ phải quyết định có nên sử dụng điều này hoặc sử dụng một lớp khác mà là một hashmap (nếu điều này không). Tôi có thể hồ sơ nó có, nhưng biết liệu đó là một hashmap là dễ dàng hơn. –

+0

@Bart van Heukelom: Tôi rất vui khi được giúp đỡ.Vẫn còn bởi "thực hiện như là một Hashmap" Tôi giả sử bạn có nghĩa là "thực hiện như java.util.Hashmap". Và câu trả lời là, tôi không biết. Chắc là không. Java Hashmap được tối ưu hóa để hoạt động tốt trên JVM. Trong trình phát flash, cơ chế này có nguồn gốc và hoàn toàn minh bạch. Tôi sẽ không ngạc nhiên nếu thực hiện thay đổi, hoặc phụ thuộc vào nền tảng. Điều duy nhất người ta có thể nói chắc chắn là nó hoạt động chính xác như một bảng băm thường được định nghĩa, với O (1) cũng cho chèn/xóa. – back2dos

+0

Xin lỗi vì sự nhầm lẫn, tôi có nghĩa là một hashtable nói chung –

0

Các tài liệu adobe trên mảng sư dường như ngụ ý rằng các từ điển là hashmaps:.

"Bạn có thể sử dụng lớp từ điển để tạo ra một mảng kết hợp sử dụng các đối tượng cho phím chứ không phải là chuỗi các mảng như vậy đôi khi được gọi là từ điển, băm hoặc bản đồ. "

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

4

Không, nó không phải. java hashmaps được dựa trên mã băm, trong khi từ điển dựa trên sự bình đẳng nghiêm ngặt (===) của khóa và do đó không được sử dụng nếu bạn định đặt đối tượng làm khóa.

java:

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 

Tôi đang tìm vào đúng cách thực hiện băm trong AS3, nhưng nó trông rất hứa hẹn ...

+0

Sự bình đẳng nghiêm ngặt là tốt cho mục đích của tôi. Tôi đang tạo trò chơi, nơi các vật thể tự nhiên tương ứng 1: 1 với các trường hợp, không giống như trong một tình huống ORM. Tôi quan tâm nhiều hơn đến hiệu suất truy cập ngẫu nhiên. –

+0

Giả sử sự bình đẳng nghiêm ngặt, địa chỉ của đối tượng trong bộ nhớ có thể đóng vai trò là mã băm của nó. Mã ActionScript AFAIK không thể có được giá trị đó, nhưng việc triển khai Flash gốc sẽ không có vấn đề gì với nó. – Brilliand

Các vấn đề liên quan