没有副本的数组堆栈算法

时间:2009-04-25 07:09:11

标签: algorithm optimization actionscript flashlite

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

我现在使用的基本算法有效(并且适用于此项目)但是,解决方案的一部分取决于图标数组的副本。根据数组中项目的数量和/或元素内容的大小,此解决方案可能效率降低。我对一个解决方案或算法(用任何语言)感兴趣,这个解决方案或算法可以实现同样的功能,同时可扩展和扩展。高效。

在setter函数中有一部分相关代码用于改变'_selectedItem'属性,其中:

  1. 评估当前的'_selectedItem'和新的'_value'
  2. 根据第1步弹出,向右移位或向左移动
  3. 重复步骤2,直到匹配'_selectedItem'的图标位于数组的中心

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

  1. [静态]阵列数组。有5个图标,一次可见3个,所以位置0是关闭阶段,位置1是1/3,位置2是1/2 ..
  2. 在实例化图标时,会创建2个数组:_viewArray& _icons。 _viewArray的顺序模仿要显示的顺序,_icons保持不变并用于循环条件检查
  3. /// 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;
        }
    

1 个答案:

答案 0 :(得分:1)

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