AS2.0中实现数据结构-哈希表

数据|数据结构

   在游戏制作中我们经常需要存储一些离散的对象数据,比如道具箱里的道具,经常需要执行插入和删除操作,而且道具之间没有联系是无序排列的.有些人会说直接用数组不就得了,但是有大量数据存储时的数组的删除插入操作的效率是很低的。
因此我们需要哈希表这样的可以提供快速的插入和删除,查找操作的数据结构,不论哈希表中有多少数据,插入和删除操作只需要接近常量的时间:即O(1)的时间级。
既然这么好那么我们的AS可以实现吗?当然可以!AS发展到AS2.0,已经成为在语法上更接近于Java + Pascal的面向对象的语言.如今,伴随着Flash8的发行,使得这种脚本语言添加了运行速度更加快捷,后台技术连接的更加方便等优点.因此我们完全可以用AS来实现一些常用数据结构。
首先我们先要实现有序链表,顾名思义,链表就是一种像链一样的数据结构,类似数组,但是不同的是链表每个节点一般都至少包括一个数据项和一个指向下个节点的指针,而且有序链表的数据是按顺序排列的。
建议大家把类都放到包里,这样便于以后查找和使用,这里我把这些类放在名为util的包里面.
有序链表的实现:
链表结点类:
class util.Link
{
public var iData; // data item(key)
public var dData;
public var next:util.Link; // next link in list
// ------------------------------------------------------------
public function Link(id,dd) // constructor
{
iData = id; // (’next’ is automatically
dData = dd;
} // set to null)
// ------------------------------------------------------------
public function displayLink():Void // display ourself
{
trace("{" + iData + "," +dData+ "} ");
}
} // end class Link   有序链表类:  
  import util.Link;//注意要导入我们前边的Link类!
class util.SortedList
{
private var first:Link; // ref to first list item
// ------------------------------------------------------------
public function SortedList() // constructor
{ first = null; }
// ------------------------------------------------------------
public function insert(theLink:Link):Void // insert link, in order
{
var key = theLink.iData;
var previous:Link = null; // start at first
var current:Link = first;
// until end of list,
while(current != null && key > current.iData)
{ // or current > key,
previous = current;
current = current.next; // go to next item
}
if(previous==null) // if beginning of list,
first = theLink; // first --> new link
else // not at beginning,
previous.next = theLink; // prev --> new link
theLink.next = current; // new link --> current
} // end insert()
public function deleteD(key):Void // delete link
{ // (assumes non-emptylist)
var previous:Link = null; // start at first
var current:Link = first;
// until end of list,
while(current != null && key != current.iData)
{ // or key == current,
previous = current;
current = current.next; // go to next link
}
// disconnect link
if(previous==null) // if beginning of list
first = first.next; // delete first link
else // not at beginning
previous.next = current.next; // delete currentlink
} // end delete()
// ------------------------------------------------------------
public function find(key):Link // find link
{
var current:Link = first; // start at first
// until end of list,
while(current != null && current.iData <= key)
{ // or key too small,
if(current.iData == key) // is this the link?
return current; // found it, return link
current = current.next; // go to next item
}
return null; // didn’t find it
} // end find()
// ------------------------------------------------------------
public function displayList():Void
{
trace("List (first-->last): ");
var current:Link = first; // start at beginning of list
while(current != null) // until end of list,
{
current.displayLink(); // print data
current = current.next; // move to next link
}
trace("");
}
} // end class SortedList   哈希表的实现:
哈希表类: 
  import util.Link;//注意要导入我们前边的Link类!
import util.SortedList;//注意要导入我们前边的SortedList类!
class util.HashTable
{
private var hashArray:Array; // array of lists
private var arraySize:Number;
// ------------------------------------------------------------
public function HashTable(size:Number) // constructor
{
arraySize = size;
hashArray = new Array(arraySize); // create array
for(var j=0; j<arraySize; j++) // fill array
hashArray[j] = new SortedList(); // with lists
}
// ------------------------------------------------------------
public function displayTable():Void
{
for(var j=0; j<arraySize; j++) // for each cell,
{
trace(j + ". "); // display cell number
hashArray[j].displayList(); // display list
}
}
// ------------------------------------------------------------
public function hashFunc(key):Number // hash function
{
return key % arraySize;
}
// ------------------------------------------------------------
public function insert(theLink:Link):Void // insert a link
{
var key = theLink.iData;
var hashVal = hashFunc(key); // hash the key
hashArray[hashVal].insert(theLink); // insert at hashVal
} // end insert()
// ------------------------------------------------------------
public function deleteD(key):Void // delete a link
{
var hashVal = hashFunc(key); // hash the key
hashArray[hashVal].deleteD(key); // delete link
} // end delete()
// ------------------------------------------------------------
public function find(key):Link // find link
{
var hashVal = hashFunc(key); // hash the key
var theLink:Link = hashArray[hashVal].find(key); // get link
return theLink; // return link
}
// ------------------------------------------------------------
} // end class HashTable  哈希表的哈希函数hashFunc(key)我们可以自行设计,我这里用了最简单的求模运算。哈希函数设计的好坏决定着哈希表的各项操作的效率。
哈希表的使用: 
  var itemTable = new HashTable(6);//声明一个哈希表对象,并定义空间大小为6;
var item:Array = new Array("cupper","herb","knife","tinymedal","cloth","milk");
for(var i = 0;i<6;i++){
var tlink = new Link(6*i,item[i]);//声明一个链表结点,第一个参数为key值,第二个为想要存入的对象,这里是道具名;
itemTable.insert(tlink);//将结点插入哈希表;
}
itemTable.displayTable();//展示哈希表中的数据;
//大家可以试试其他查找和删除操作;好了,就到这里,有什么问题欢迎讨论!

时间: 2024-08-22 14:44:37

AS2.0中实现数据结构-哈希表的相关文章

C#与数据结构--哈希表(Hashtable)

C#中实现了哈希表数据结构的集合类有: (1)System.Collections.Hashtable (2)System.Collections.Generic.Dictionary<TKey,TValue> 前者为一般类型的哈希表,后者是泛型版本的哈希表.Dictionary和Hashtable之间并非只是简单的泛型和非泛型的区别,两者使用了完全不同的哈希冲突解决办法.Dictionary我已经做了动态演示程序,使用的是Window应用程序.虽然Dictionary相对于Hashtable

数据结构哈希表有关问题求助

问题描述 数据结构哈希表有关问题求助 一直搞不懂哈希表等我问题,还有线性探测再散列和二次探测再散列,请举例子帮我详细讲解一下,谢谢了 解决方案 [数据结构]哈希表数据结构-哈希表数据结构之哈希表

第四章 在MVC4.0中对脚本以及样式表的引用变化

原文:http://www.cnblogs.com/xdotnet/archive/2012/07/21/aspnet40_webpage20.html 一.可以直接使用"~",而无需使用Href对象实例 这个是一大变化,给我们ASP.NET MVC开发人员带来了很便捷的代码书写方式,提高不少效率.在MVC3.0中加入我们需要加入一张图片时,需要在IMG标签的SRC属性加上 Url.Content或Href对象方法等来对路径进行解析.在WebPage 2.0中Razor模板引擎能够自动

数据结构是哈希表(hashTable)

哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构.也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度.这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表.比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize.         哈希化之后难免会产生一个问题,那就是对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那么我

上古时代 Objective-C 中哈希表的实现

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明. 写在前面 文章会介绍上古时代 Objective-C 哈希表,也就是 NXHashTable : NXHashTable 的实现 NXHashTable 的性能分析 NXHashTable 的作用 NXHashTable 的实现有着将近 30 年的历史,不过仍然作为重要的底层数据结构存储整个应用中的类. 文中

数据结构与算法07 之哈希表

  哈希表也称为散列表,是根据关键字值(key value)而直接进行访问的数据结构.也就是说,它通过把关键字值映射到一个位置来访问记录,以加快查找的速度.这个映射函数称为哈希函数(也称为散列函数),映射过程称为哈希化,存放记录的数组叫做散列表.比如我们可以用下面的方法将关键字映射成数组的下标:arrayIndex = hugeNumber % arraySize.         哈希化之后难免会产生一个问题,那就是对不同的关键字,可能得到同一个散列地址,即同一个数组下标,这种现象称为冲突,那

数据结构例程——哈希表及其运算的实现

本文是[数据结构基础系列(8):查找]中第11课时[哈希表--散列结构]和第12课时[哈希表的运算]的例程. #include <stdio.h> #define MaxSize 100 //定义最大哈希表长度 #define NULLKEY -1 //定义空关键字值 #define DELKEY -2 //定义被删关键字值 typedef int KeyType; //关键字类型 typedef char * InfoType; //其他数据类型 typedef struct { KeyTy

通过AS2.0来使用Event Bubbling

ubb Event Bubbling (事件浮升机制) ok,我姑且这么称呼Event Bubbling吧.原来Ralf在自己的Blog上发表了在As2.0中使用Event Bubbling的方法.实在是个有创意的想法.Event Bubbling原本是只能在AS3.0中使用的.在Event Bubbling机制里面,产生事件的对象首先会收到事件.然后,事件会依照对象的等级结构向上传播.那么简单的说在Flash中的使用Event Bubbling则是使处理嵌套的MC显得简单很多.Event Bu

flash AS 3.0中MC创建复制及访问实例

主要看了MC的创建复制及访问,这个对于在制作和数据库结合的flash网站也是比较重要的一个环节. MC的创建:  代码如下 复制代码 //普通方式创建一个名为mc2的影片剪辑---------------- var mc2:Sprite = new Sprite(); //和C#一样,初始化一个实例 mc2.graphics.beginFill(0xFFCC00); //设置填充色 mc2.graphics.drawCircle(50, 50, 40); //画圆 mc2.buttonMode