Arrays 如何优化以下smarty代码,以减少为比较数组值而执行的迭代?
我是Smarty模板引擎的新手。我正在比较两个数组。以下是我在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
{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)
(我知道你不想排序,所以你需要修改算法来做你的工作,而不是排序,但仍然是一个比较少的算法,希望这能帮助你)你可以实施其他算法来减少算法中的迭代次数
- 您可以实现:
- [逆首顺序][4]
- 快速排序(您随机选择轴心/只选择一个固定轴心,使最坏情况下的欧米茄(n^2))可能比红黑树更好,因为(不一定按重要性排序)
- 快速排序已就位。这样可以降低内存占用。假设这个快速排序例程是处理大量数据的程序的一部分。如果您继续使用大量内存,您的操作系统可能会开始交换您的进程内存并丢弃您的性能
- 快速排序内存访问是本地化的。这在缓存/交换中起到了很好的作用
- 快速排序可以很容易地并行化(现在可能更相关)
- 如果您试图通过使用数组来优化二叉树排序(使用二叉树而不使用平衡),那么您最终将执行类似于快速排序的操作李>
- 红黑树有内存开销。您可能需要多次分配节点,使用树的内存需求是使用阵列的两倍/三倍
- 在排序之后,假设您想要1045(比如)元素,您将需要在树中维护顺序统计信息(因此而产生的额外内存成本),并且您将有O(logn)访问时间!红黑树只是为了访问下一个元素(指针查找)而产生开销。红黑树不能很好地处理缓存,指针访问可能会导致更多的交换
- 红黑树的旋转将增加O(nlogn)中的常数因子
{$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}