zoukankan      html  css  js  c++  java
  • 用于A*的 二叉堆 AS3实现

    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();
            }
        }
    }
  • 相关阅读:
    [BZOJ1211]:[HNOI2004]树的计数(prufer序列)
    [CSP-S模拟测试]:那一天她里我而去(堆优化Dijkstra)
    [CSP-S模拟测试]:那一天我们许下约定(DP+组合数学)
    BZOJ3130 [Sdoi2013]费用流 【网络流 + 二分】
    BZOJ3124 [Sdoi2013]直径 【树的直径】
    BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】
    BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】
    BZOJ2726 [SDOI2012]任务安排 【斜率优化 + cdq分治】
    洛谷P2351 [SDOi2012]吊灯 【数学】
    BZOJ2246 [SDOI2011]迷宫探险 【记忆化搜索dp + 概率】
  • 原文地址:https://www.cnblogs.com/ch06src/p/3430940.html
Copyright © 2011-2022 走看看