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. css 不确定元素宽度的水平居中

    对于一个不确定宽度的元素居中,我们想到使用的方法是 text-align:center; 或者 margin:0 auto; text-align只对行内元素有效,对于块元素我们要用margin,块元 ...

  2. js判断是否在iframe中

    1.方式一 if (self.frameElement && self.frameElement.tagName == "IFRAME") { alert('在if ...

  3. Syntax error on token "package", assert expected------踩坑记录

    今天写程序碰到个坑,eclipse编辑,jdk1.7,clean编译项目后报错Syntax error on token "package", assert expected 反复 ...

  4. Mac OS X 系统下快速显示隐藏文件的方法(使用Automator创建workflow)

    有的时候需要显系统中的隐藏文件,在 Mac 中不像windows系统那么方便(勾选选项就能够操作),需要在 Terminal 中执行: localhost:~ mx$ defaults write c ...

  5. tr命令的使用

    tr是translate的简写,亦即翻译,但是遗憾的是,它不能翻译句子,只能翻译单个字符. 1 tr的工作原理是什么? 先记住一点,tr命令不接受指定的文件参数,而只是对标准输入进行翻译.好了,记住这 ...

  6. java 按天创建文件夹

    按天创建文件夹,也就是每天创建一个,适合上传文件服务使用,文件数量较多时可以按文件夹区分. public static final String FMT = "yyyy-MM-dd" ...

  7. 用python选择及显示三级目录,可返回上层目录以及随时跳出。

    # -*- coding: utf-8 -*-"""Created on Fri Jul 29 09:43:38 2016 @author: yinggang" ...

  8. linux 下makefile

    linux下c编程中makefile是必须会的,我刚开始学,将我对makefile的理解记录下来. 通常我们在windows下编写c程序,有各种ide工具为我们执行makefile工作但在linux下 ...

  9. vim代码折叠功能

    问题:怎样在vim中实现代码折叠功能? 解决方法:直接使用vim自带的快捷键和命令,便可以实现功能强大的折叠 小试折叠: 1  :set fdm=marker  在vim中执行该命令 2  5G  将 ...

  10. NET Core 静态文件及JS包管理器(npm, Bower)的使用

    NET Core 静态文件及JS包管理器(npm, Bower)的使用 文章目录 在 ASP.NET Core 中添加静态文件 使用npm管理JavaScript包 使用Bower管理JavaScri ...