algorithm - 一种无拷贝的数组栈算法

标签 algorithm optimization actionscript flashlite

我有一个 flashlite3 应用程序,其导航由用户可以向左或向右无限浏览的图标组成。

我正在使用的基本算法现在可以工作(并且对于这个项目来说已经足够了)但是,部分解决方案取决于图标数组的副本。根据数组中项目的数量和/或元素内容的大小,此解决方案的效率可能会降低。我对一种解决方案或算法(以任何语言)感兴趣,它们可以在可扩展和高效的同时实现相同的目标。

这是 setter 函数中用于改变“_selectedItem”属性的部分相关代码,其中:

  1. 评估当前的“_selectedItem”和新的“_value”
  2. 基于第 1 步 pop,unshifts right,或 shift,pops left
  3. 重复第 2 步,直到与“_selectedItem”匹配的图标位于数组的中心

此代码使用 3 个数组运行:

  1. [静态] 位置数组。有 5 个图标,一次可见 3 个,所以位置 0 不在舞台上,位置 1 是 1/3,位置 2 是 1/2 ..
  2. 实例化图标时会创建 2 个数组:_viewArray 和 _icons。 _viewArray 的顺序模仿要显示的顺序,_icons 单独保留并用于循环条件检查

///Actionscript2///

    public function set selectedItem(value:Number)
    {
        var w=Stage.width;

        if(value > _icons.length-1)
        {
            value=0;
        }else if(value < 0)
        {
            value=_icons.length-1;
        }

        if(value > _selectedIndex)
        {
            while(_viewArray[Math.floor(_icons.length*.5)] != _icons[value])
            {
                var element;
                element=_viewArray.pop();
                _viewArray.unshift(element);
            }
        }else if(value < _selectedIndex)
        {
            while(_viewArray[Math.floor(_icons.length*.5)]!=_icons[value])
            {
                var element;
                element=_viewArray.shift();
                _viewArray.push(element);
            }           
        }




        for(var i:Number=0;i<_viewArray.length;i++)
        {
            if(i>=1 && i<= _icons.length-2)
            {
                _viewArray[i]._visible=true;
            }else
            {
                _viewArray[i]._visible=false;
            }
            Tweener.addTween(_viewArray[i],{_x:positions[i],_alpha:80,time:.5,transition:'elasticIn'})
        }


        Tweener.addTween(_icons[(_viewArray.length*.5)-1],{_alpha:100,time:.0,transition:'elasticIn'});
        Tweener.addTween(_selectedServiceIndicator,{_alpha:0,time:.3,transition:'elasticIn',onComplete:function() {Tweener.addTween(this,{_alpha:100,time:.2,transition:'elasticIn'});}});

        var eventObject:Object = {target:this, type:'SelectedItemChange'};
        eventObject.value=value;

        for(var key in _serviceData[value])
        eventObject[key]=_serviceData[value][key];

        dispatchEvent(eventObject);
        _selectedIndex=value;
    }

最佳答案

为什么 _viewArray 的每个元素都必须实际存储图标,而不仅仅是 _icons 数组的索引?这样您只需要存储一次图标,而 _viewArray 只存储它们的显示顺序。

关于algorithm - 一种无拷贝的数组栈算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/788428/

相关文章:

actionscript-3 - 在蛇游戏中跟随头部的蛇段

apache-flex - 将多个 SWF 文件转换为单个 EXE

c# - 复制加密算法

algorithm - 通过扩充 BST 找到二叉搜索树中其值在一定范围内的节点之和

optimization - 使用 SSE 优化有限差分

javascript - 快速(占用空间少)的 JavaScript 时钟

apache-flex - 在 Flex 中的 spark TextInput 中添加搜索图标

Python 翻译 C saxpy

ruby - 置换的递归解

Java 最佳实践静态最终映射值