• 用于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();
            }
        }
    }
  • 相关阅读:
    T-SQL 查询数据库中各个表的使用空间
    T-SQL 拆分使用指定分隔符的字符串(split string)
    T-SQL 去除特定字段的前导0
    T-SQL 实现行转列
    T-SQL 将存储过程结果插入到表中
    T-SQL查看数据库恢复(RESTORE)时间
    Why Do We Need a Data Warehouse?
    T-SQL 常用DDL语句
    dedecms织梦笔记
    Lua 基础简明教程
  • 原文地址:https://www.cnblogs.com/ch06src/p/3430940.html
Copyright © 2020-2023  润新知