Левый и правый связанный список, скорость замены

Есть два очевидных способа структурировать связанный список в Mathematica: «слева»:

{1, {2, {3, {4, {5, {6, {7, {}}}}}}}}

и «справа»:

{{{{{{{{}, 7}, 6}, 5}, 4}, 3}, 2}, 1}

Это можно сделать с помощью:

toLeftLL = Fold[{#2, #} &, {}, Reverse@#] & ;

toRightLL = Fold[List, {}, Reverse@#] & ;

Если я воспользуюсь ими и сделаю простой ReplaceRepeated для просмотра связанного списка, я получу совершенно разные результаты Timing :

r = Range[15000];
left = toLeftLL@r;
right = toRightLL@r;

Timing[i = 0; left //. {head_, tail_} :> (i++; tail); i]
Timing[i = 0; right //. {tail_, head_} :> (i++; tail); i]

(* Out[6]= {0.016, 15000} *)

(* Out[7]= {5.437, 15000} *)

Почему?

11
задан Mr.Wizard 27 April 2011 в 00:23
поделиться