Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何优化以下smarty代码,以减少为比较数组值而执行的迭代?_Arrays_Optimization_Foreach_Iteration_Smarty - Fatal编程技术网

Arrays 如何优化以下smarty代码,以减少为比较数组值而执行的迭代?

Arrays 如何优化以下smarty代码,以减少为比较数组值而执行的迭代?,arrays,optimization,foreach,iteration,smarty,Arrays,Optimization,Foreach,Iteration,Smarty,我是Smarty模板引擎的新手。我正在比较两个数组。以下是我在smarty模板中的代码: {foreach from=$all_states item=state key=key} {assign var="flag" value=false} {foreach from=$data.applicable_states item=pre key='index'} {if $state.id == $pre } {assign var="flag" value=true} {$br

我是Smarty模板引擎的新手。我正在比较两个数组。以下是我在smarty模板中的代码:

{foreach from=$all_states item=state key=key}
  {assign var="flag" value=false}
  {foreach from=$data.applicable_states item=pre key='index'}
    {if $state.id == $pre } {assign var="flag" value=true} {$break} {/if}
  {/foreach}
  <option value="{$state.id}" {if $flag == true} selected="selected"{/if}>{$state.state_name}</option>      
{/foreach}
{foreach from=$all_states item=state key=key}
{assign var=“flag”value=false}
{foreach from=$data.applicative_states item=pre key='index'}
{if$state.id=$pre}{assign var=“flag”value=true}{$break}{/if}
{/foreach}
{$state.state_name}
{/foreach}
上面的代码对我来说很好。但是如果仔细观察,比较数组值所执行的迭代次数太多


因此,我想优化上面的代码,以减少迭代次数。如果有人对Smarty有很好的了解,可以提供一些方法来优化上述代码吗?

也许您可以在\u数组中使用

{foreach from=$all_states item=state key=key}    
   <option value="{$state.id}" {if $state.id|in_array:$data.applicable_states} selected="selected"{/if}>{$state.state_name}</option>
{/foreach}
{foreach from=$all_states item=state key=key}
{$state.state_name}
{/foreach}

实际上,有一些很好的算法可以使用。 每种方法的复杂性都取决于比较的数量。如果您想改进代码并减少比较的数量,那么可以查看以下列表:

  • 快速排序O(nlog(n))
  • 泡泡糖(n^2)
  • cocktailsort(带一些修改的气泡)O(n^2)
  • 选择排序O(n^2)
  • 合并排序O(nlog(n))
  • HeapSOrt O(nlog(n))
  • 插入端口O(n^2)
您正在使用的一个名为“BubbleSort”,那么n是什么呢?N是数组中的元素数。。O结果是为了获得集合顺序而必须进行的比较量。因此,按照log的顺序,复杂度越高。所以像快速排序、合并、堆这样的算法非常酷,如果你想要好的性能,在我看来,这个列表中最好的是快速排序

那么快速排序是如何工作的呢? 快速排序基于“原则”,使用递归。 (正如您所知,递归解决方案比普通解决方案使用更多内存)

这就是如何快速排序算法

  • 第一个是选择一个轴心元素。这可能在数组的中间,左O右边。
  • 将列表中的每个元素与pivot元素进行比较,并将元素向右(如果高于pivot)或向左(否则为条件)
  • 如您所知,现在您有两个列表,一个在左侧,另一个在右侧。因此,您所要做的就是在这两个列表上递归调用QuickSort函数,而它的列表有多个元素
  • 有关于这个算法的更多信息吗

    您应该知道,快速排序并不是最好的,混合排序算法并在不同的范围内使用它可以改进您的代码,但这种快速排序本身已经足够好了。
    (我知道你不想排序,所以你需要修改算法来做你的工作,而不是排序,但仍然是一个比较少的算法,希望这能帮助你)

    你可以实施其他算法来减少算法中的迭代次数

    • 您可以实现:
    • [逆首顺序][4]
    所有这些都取决于您的算法的建议,刚才,您正在对'N'个元素使用buble排序方法,并获得一个'X'结果。简单的buble排序适用于短数组,但对于大数组,可以使用:impact算法,如:

    知道哪种排序算法性能更好实际上取决于您的数据和情况

    如果你说的是一般的/实际的术语

    • 快速排序(您随机选择轴心/只选择一个固定轴心,使最坏情况下的欧米茄(n^2))可能比红黑树更好,因为(不一定按重要性排序)
    • 快速排序已就位。这样可以降低内存占用。假设这个快速排序例程是处理大量数据的程序的一部分。如果您继续使用大量内存,您的操作系统可能会开始交换您的进程内存并丢弃您的性能
    • 快速排序内存访问是本地化的。这在缓存/交换中起到了很好的作用
    • 快速排序可以很容易地并行化(现在可能更相关)
    • 如果您试图通过使用数组来优化二叉树排序(使用二叉树而不使用平衡),那么您最终将执行类似于快速排序的操作
    • 红黑树有内存开销。您可能需要多次分配节点,使用树的内存需求是使用阵列的两倍/三倍
    • 在排序之后,假设您想要1045(比如)元素,您将需要在树中维护顺序统计信息(因此而产生的额外内存成本),并且您将有O(logn)访问时间!红黑树只是为了访问下一个元素(指针查找)而产生开销。红黑树不能很好地处理缓存,指针访问可能会导致更多的交换
    • 红黑树的旋转将增加O(nlogn)中的常数因子
    也许最重要的原因(但如果有lib等可用,则无效),快速排序非常容易理解和实现。连小学生都能理解

    试试这个

    {$tmp = []}
    {foreach from=$data.applicable_states item=pre key='index'}
        {assign var="$tmp[$pre]" value=1}
    {/foreach}
    
    
    {foreach from=$all_states item=state key=key}
        <option value="{$state.id}" {if isset($tmp[$state.id])} selected="selected"{/if}>
        {$state.state_name}</option>      
    {/foreach}
    
    {$tmp=[]}
    {foreach from=$data.applicative_states item=pre key='index'}
    {assign var=“$tmp[$pre]”值=1}
    {/foreach}
    {foreach from=$all_states item=state key=key}
    {$state.state_name}
    {/foreach}