http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/
Словарь делает то, что мне нужно, но мне нужно заботиться о производительности. Кто-нибудь знает, реализуется ли Словарь как хэш-таблица?
Или, более конкретно, выполняет ли он в O (1)?
http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/
Словарь делает то, что мне нужно, но мне нужно заботиться о производительности. Кто-нибудь знает, реализуется ли Словарь как хэш-таблица?
Или, более конкретно, выполняет ли он в O (1)?
он действует как хэшмап. фактически, каждый объект ActionScript, являющийся экземпляром динамического класса, действует как hashmap. конечно ключи всегда могут столкнуться со свойствами. это поведение происходит от JavaScript. Я считаю это ошибкой дизайна.
Array отличается тем, что он будет выполнять некоторые трюки на целочисленных ключах, а словарь отличается тем, что он не преобразует ключи в строки, а использует любое значение объекта в качестве ключа. Обратите внимание, что Number и Boolean преобразуются в String.
теперь, почему вам все равно, как это реализовано? если он хорошо реализован, вы, вероятно, не хотите знать. Вы можете сравнить его. Он имеет O (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 {}
}
}
Нет, это не так. java hashmaps основаны на хеш-кодах, в то время как словарь основан на строгом равенстве (===)
ключей и поэтому не должен использоваться, если вы планируете помещать объекты в качестве ключей.
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
Я изучаю правильный способ реализации хэширования в AS3, но он выглядит очень бесперспективным...
Документация adobe на ассоциированных массивах, по-видимому, подразумевает, что словари являются hashmaps:
"Вы можете использовать класс Dictionary для создания ассоциативного массива, который использует объекты для ключей, а не строк. Такие массивы иногда называют словарями, хэшами или картами.
http://livedocs.adobe.com/flex/3/html/help.html?content=10_Lists_of_data_4.html