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. ASP.NET网站实现中英文转换(本地化资源)

    主要内容: 1. 简单例子 2. 进一步认识Localization 3. 语言转换 4. 解决方案 一. 简单例子 下面通过一个简单的例子来说明利用Localization来实现本地化是那么的简单, ...

  2. SGU 124.Broken line

    时间限制:0.25s 空间限制:4M 题意: 给出n条线段和一个点,保证所有线段平行X轴或Y,并且闭合成一个多边形.判断这个点的位置是在多边形上,还是多边形内,还是多边形外. solution: 由于 ...

  3. impress.js学习总结

    impress.js是一个很有趣的用来替代PPT的展示用的js工具,它的灵感来自prezi 如果你要学习使用它,这里有很好的演示模板 使用它的第一步,下载 impress.js,引入到你的代码里,并执 ...

  4. ECSHOP在商品详细页面上获取该商品的顶级分类id和名称

    在 goods.php 文件, 找到 $smarty->assign('goods', $goods); 在它上面增加下面代码: 方法一: $cat_arr = get_parent_cats( ...

  5. vertical-align:top属性

    vertical-align这个是设置元素的垂直排列的. 用来定义行内元素的基线相对于该元素所在行的基线的垂直对齐. 它的值比较多:baseline | sub | super | top | tex ...

  6. 转:PHP性能优化大全

    原文来自于:http://www.open-open.com/lib/view/open1370769825070.html PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调 ...

  7. python 单元测试

    http://blog.csdn.net/five3/article/details/7104466

  8. Door man

    poj1300:http://poj.org/problem?id=1300 题意:给你n个房间,房间之间有一些门,房间是按0~~n-进行编号的.然后给出一些房间的之间门,n行,每行的数字表示该们与其 ...

  9. Intra Luma Prediction

    在宏块的帧内预测过程中,有四种宏块类型:I_4x4,I_8x8,I16x16,I_PCM.他们都需要在相邻块做去块滤波之前进行帧内预测. 亮度帧内预测的总体流程 1-4获取当前block的帧内预测模式 ...

  10. c# 循环语句练习题;

    1. 求100以内质数的和 2. 兔子问题 3. 九九乘法表:   一行一行打印: 4. 有一张超大的纸:   纸质的厚度是0.01:   对折多少次,可以达到珠峰的高度:   按照8848来计算: ...