醒着☆☆

H5 Laya Native Game

  博客园 :: 首页 :: 新随笔 :: 联系 :: :: 管理 ::

转:http://www.nshen.net/dataStructure/2011/08/25/AS3-DataStructure.html

对于现阶段的Flash开发,基本上数组和Object可以搞定一切了,在Flash中的Array和Object可以组成千变万化的结构,

数据结构确实是一门非常重要的课程。开发巨型游戏不了解数据结构是肯定不行的。

 

数组

Array类应该是Flash里最常用的数据结构了。比其他语言的数组高级和灵活许多,随意装入任何数据类型,不用固定长度。
访问速度快,从后方添加(push)和删除(pop),但从中间开头删除会很慢。

 

Vector:Vector是Array的升级版。如果想追求效率,恰巧数组中的元素类型是固定的,或者长度是固定的,

就可以将Array换成Vector类提升效率。

 

堆栈

堆栈是先进后出的结构,像子弹梭子一样,由于数组的push() pop()非常快,所以数组本身就是最好的堆栈。

 

队列

队列是先进先出,数组也可以做队列,但是从数组前端删除数据比较慢,下边10万条数据我的机器运行差不多需要2秒。
var startT:Number = getTimer()
var queue:Array = []
for(var i:int = 0 ; i<100000 ;i++)
{
queue.push(i);
}
for(var i:int = 0 ; i<100000 ;i++)
{
queue.shift()//删除前面的
}
trace(getTimer() - startT)

 

链表

这个链表实现的是一个双向链表,因为删除数据会快些,单链表优点就是省一点点内存,但删除会慢很多,用处不大,所以没有实现。
我觉得除了把链表当成队列使用,平时几乎用不到。

 

var l:DLinkedList = new DLinkedList()
l.push(1)
l.push(2)
l.push(3)
trace(l,l.head,l.tail) //[1,2,3] 1 3
l.pop()
trace(l,l.head,l.tail) //[1,2] 1 2
l.unshift(0)
trace(l,l.head,l.tail) //[0,1,2] 0 2
l.shift()
trace(l,l.head,l.tail) //[1,2] 1 2
l.push(3)
trace(l,l.head,l.tail) //[1,2,3] 1 3

//遍历,输出 1,2,3
var it:DListIterator = l.getIterator()
for(it.start() ; it.hasNext(); it.next())
{
trace(it.node.data)
}
it.start()  // 索引归0
it.next()  
l.remove(it) //remove 2
l.remove(it) //remove 3
trace(l,l.head,l.tail) //[1] 1 1
l.insert(it,2)
trace(l,l.head,l.tail) //[1,2] 1 2
l.insert(it,3)
trace(l,l.head,l.tail) //[1,3,2] 1 2

哈希表

哈希表应该就是Object? 在Flash里Object是动态的,赋值就 obj.abc = 123 ,删除就 delete obj.abc

var o:Object = {}
o["key"] = obj   //插入
delete o["key"]  //删除

 

如果追求Object做key可以用flash.utils.Dictionary类代替Object。

 

上边数组和链表都叫线性结构,树是典型的非线性数据结构,普通的树也不常用,但作为一个基础必须掌握,这里的树使用上边提到的双向链表存储子树。操作树要用TreeIterator,下边是演示。

var tree:Tree = new Tree(0);
var itr:TreeIterator = tree.getIterator()
itr.appendChild(1)
itr.appendChild(2) 

	  0  
	 / \
	1   2
	

itr.down()
itr.appendChild(3)
	

	 0  
	/ \
       1   2
      /
     3
	

itr.up()
itr.appendChild(4)

	  0  
	/ | \ 
       1  2  4
      /
     3
	

itr.childEnd()
itr.down()
itr.prependChild(5)
itr.prependChild(6)

	
	0  
      / | \ 
     1  2  4
    /      /\
   3	  6  5	
trace(tree.dump())

 

posted on 2012-01-31 17:58  醒着/☆☆  阅读(725)  评论(0)    收藏  举报