package com.copper.isometric.pathing
{
    import flash.sampler.startSampling;
     
    /**
     * A*中用于开放列表的 二叉堆
     * @author vanCopper
     *
     */
    public class BinaryHeap
    {
        private var struct:Array = [-1];
         
        private var compareFunc:Function = function (x:Object,y:Object):Boolean
        {
            if(y == null)return true;
            return x < y;
        };
         
        /**
         *
         * @param compareFunc n
         *
         * function (x:Object,y:Object):Boolean
         * {
         * return x < y;
         * };
         */
        public function BinaryHeap(compareFunc:Function = null)
        {
            if(compareFunc != null)this.compareFunc = compareFunc;
        }
         
        /**
         * 向二叉堆添加新元素
         * @param value
         *
         */
        public function insert(value:Object):void
        {
            if(value == null)return;
            var len:int = struct.length;
            struct[len] = value;
            var parent:int = len >> 1;
            while(parent >= 1 && compareFunc(struct[len],struct[parent]))
            {
                var temp:Object = struct[parent];
                struct[len] = temp;
                struct[parent] = value;
                len = parent;
                parent = parent >> 1;
            }
        }
         
        /**
         * 删除二叉堆的第一个元素 并返回该元素
         * @return
         *
         */
        public function shift():Object
        {
            var n:int = 1;
            var shiftObj:Object = struct[n];
            if(shiftObj == null)return null;
            var len:int = struct.length;
             
            struct[n] = struct[len - 1];
            struct.length --;
            var moveObj:Object = struct[n];
             
            var left:int = n << 1;
            var right:int = left + 1;
            var endLen:int = struct.length;
            while(right < endLen)
            {
                 
                var min:int = compareFunc(struct[left],struct[right]) ? left : right;
                 
                if(compareFunc(moveObj,struct[min]))
                {
                    // 停止 二叉堆完成
                    break;
                }else
                {
                    var tempObj:Object = struct[min];
                    struct[min] = moveObj;
                    struct[n] = tempObj;
                    n = min;
                    left = n << 1;
                    right = left + 1;
                }
            }
            return shiftObj;
        }
         
        public function get length():int
        {
            return struct.length;
        }
         
        public function toString():String
        {
            return struct.toString();
        }
    }
}

用于A*的 二叉堆 AS3实现的更多相关文章

  1. 数据结构 之 二叉堆(Heap)

    注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的 ...

  2. PriorityBlockingQueue优先队列的二叉堆实现

    转载请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/6293807.html java.util.concurrent.PriorityBlockingQu ...

  3. 笔试算法题(46):简介 - 二叉堆 & 二项树 & 二项堆 & 斐波那契堆

    二叉堆(Binary Heap) 二叉堆是完全二叉树(或者近似完全二叉树):其满足堆的特性:父节点的值>=(<=)任何一个子节点的键值,并且每个左子树或者右子树都是一 个二叉堆(最小堆或者 ...

  4. 二叉堆 及 大根堆的python实现

    Python 二叉堆(binary heap) 二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树.二叉堆满足堆特性:父节点的键值总是保持固定的序关系于任何一个子节点的键值,且每个节点的左子 ...

  5. 纯数据结构Java实现(6/11)(二叉堆&优先队列)

    堆其实也是树结构(或者说基于树结构),一般可以用堆实现优先队列. 二叉堆 堆可以用于实现其他高层数据结构,比如优先队列 而要实现一个堆,可以借助二叉树,其实现称为: 二叉堆 (使用二叉树表示的堆). ...

  6. 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器

    [摘要] timers模块部分源码和定时器原理 示例代码托管在:http://www.github.com/dashnowords/blogs 一.概述 Timer模块相关的逻辑较为复杂,不仅包含Ja ...

  7. 【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器

    目录 一.概述 二. 数据结构 2.1 链表 2.2 二叉堆 三. 从setTimeout理解Timer模块源码 3.1 timers.js中的定义 3.2 Timeout类定义 3.3 active ...

  8. 二叉堆 与 PriorityQueue

    堆在存储器中的表示是数组,堆只是一个概念上的表示.堆的同一节点的左右子节点都没有规律. 堆适合优先级队列(默认排列顺序是升序排列,快速插入与删除最大/最小值). 数组与堆 堆(完全二叉树)(构造大顶堆 ...

  9. AC日记——二叉堆练习3 codevs 3110

    3110 二叉堆练习3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给定N(N≤500,000)和N个整 ...

随机推荐

  1. Tomcat设置最佳线程数总结

    最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...

  2. FlightGear 视角控制

    Flightgear提供了非常灵活的模块化功能 这里就简要记录一下视角切换功能 首先,需要了解一下Flightgear中的property tree的主要内容,这里暂略. http://wiki.fl ...

  3. SGU 160.Magic Multiplying Machine

    时间限制:0.5s 空间限制6M 题意:        给出n个(1<=n<=10000)1~m(2<m<1000)范围内的数,选择其中任意个数,使它们的 乘积 模m 最大,输 ...

  4. LNMP安装WordPress3.4.2看不到主题解决方法

    喜欢LNMP配置环境的朋友,又是wordpress建立的博客程序,安装之后发现一个问题在网站后台看不到模板主题,重新下载了一款新的主题也查看不了.开始以为是程序的问题,于是我重新下载新版本的WordP ...

  5. SWFUpload(转载)

    网上的例子介绍的文档真的很多.下面简单介绍一下 SWFUpload的文件上传流程是这样的: 1.引入相应的js文件 2.实例化SWFUpload对象,传入一个配置参数对象进行各方面的配置. 3.点击S ...

  6. Java学习----到底调用哪一个方法(多态)

    public class Father { public void print() { System.out.println("Father:print()"); } } publ ...

  7. php 拓展 Filter 过滤器

    简介       Filter,它的作用就和他的名字一样——过滤.过滤规则成为过滤器,Filter内置了多个常用过滤器,根据过滤器功能的不 同,可以分成净化过滤器(Sanitization)和验证过滤 ...

  8. 谷歌制图服务(Google Chart)接口生成二维码

    Google公布了制图服务(Google Chart)的接口,这项服务用起来相当简单,只使用浏览器就可以用来为统计数据自动生成图片. 目前谷歌制图服务提供折线图.条状图.饼图.Venn图.散点图.二维 ...

  9. 手工构建ISO的基本步骤

    1.完成rpm包的构建 登录测试机,ssh 10.xx.xx.xxx cd /home/svn/desktop/trunk/ svn update                            ...

  10. SQL语句の集锦

    6.删除数据后根据主键从备份表中恢复 insert  sameTable_1 (name,dz) select name,dz from sameTable_1_bak where not exist ...