X
Xah Lee
fun example.
in-place algorithm for reversing a list in Perl, Python, Lisp
http://xahlee.org/comp/in-place_algorithm.html
plain text follows
----------------------------------------
What's “In-place Algorithm”?
Xah Lee, 2012-02-29
This page tells you what's “In-place algorithm”, using {python, perl,
emacs lisp} code to illustrate.
Here's Wikipedia In-place algorithm excerpt:
In computer science, an in-place algorithm (or in Latin in situ) is an
algorithm which transforms input using a data structure with a small,
constant amount of extra storage space. The input is usually
overwritten by the output as the algorithm executes. An algorithm
which is not in-place is sometimes called not-in-place or out-of-
place.
Python
Here's a python code for reversing a list. Done by creating a new
list, NOT using in-place:
# python
# reverse a list
list_a = ["a", "b", "c", "d", "e", "f", "g"]
list_length = len(list_a)
list_b = [0] * list_length
for i in range(list_length):
list_b = list_a[list_length -1 - i]
print list_b
Here's in-place algorithm for reversing a list:
# python
# in-place algorithm for reversing a list
list_a = ["a", "b", "c", "d", "e", "f", "g"]
list_length = len(list_a)
for i in range(list_length/2):
x = list_a
list_a = list_a[ list_length -1 - i]
list_a[ list_length -1 - i] = x
print list_a
Perl
Here's a perl code for reversing a list. Done by creating a new list,
NOT using in-place:
# perl
use strict;
use Data:umper;
my @listA = qw(a b c d e f g);
my $listLength = scalar @listA;
my @listB = ();
for ( my $i = 0; $i < $listLength; $i++ ) {
$listB[$i] = $listA[ $listLength - 1 - $i];
}
print Dumper(\@listB);
# perl
# in-place algorithm for reversing a list.
use strict;
use Data:umper;
use POSIX; # for “floor”
my @listA = qw(a b c d e f g);
my $listLength = scalar @listA;
for ( my $i = 0; $i < floor($listLength/2); $i++ ) {
my $x = $listA[$i];
$listA[$i] = $listA[ $listLength - 1 - $i];
$listA[ $listLength - 1 - $i] = $x;
}
print Dumper(\@listA);
__END__
emacs lisp
;; emacs lisp
;; reverse a array
(setq arrayA ["a" "b" "c" "d" "e" "f" "g"])
(setq arrayLength (length arrayA))
(setq arrayB (make-vector arrayLength 0))
(dotimes (i arrayLength )
(aset arrayB i (aref arrayA (- (1- arrayLength) i)) )
)
(print (format "%S" arrayB))
;; emacs lisp
;; in-place algorithm for reversing a array
(setq arrayA ["a" "b" "c" "d" "e" "f" "g"])
(setq arrayLength (length arrayA))
(dotimes (i (floor (/ arrayLength 2)))
(let (x)
(setq x (aref arrayA i))
(aset arrayA i (aref arrayA (- (1- arrayLength) i)))
(aset arrayA (- (1- arrayLength) i) x) ) )
(print (format "%S" arrayA))
Xah
in-place algorithm for reversing a list in Perl, Python, Lisp
http://xahlee.org/comp/in-place_algorithm.html
plain text follows
----------------------------------------
What's “In-place Algorithm”?
Xah Lee, 2012-02-29
This page tells you what's “In-place algorithm”, using {python, perl,
emacs lisp} code to illustrate.
Here's Wikipedia In-place algorithm excerpt:
In computer science, an in-place algorithm (or in Latin in situ) is an
algorithm which transforms input using a data structure with a small,
constant amount of extra storage space. The input is usually
overwritten by the output as the algorithm executes. An algorithm
which is not in-place is sometimes called not-in-place or out-of-
place.
Python
Here's a python code for reversing a list. Done by creating a new
list, NOT using in-place:
# python
# reverse a list
list_a = ["a", "b", "c", "d", "e", "f", "g"]
list_length = len(list_a)
list_b = [0] * list_length
for i in range(list_length):
list_b = list_a[list_length -1 - i]
print list_b
Here's in-place algorithm for reversing a list:
# python
# in-place algorithm for reversing a list
list_a = ["a", "b", "c", "d", "e", "f", "g"]
list_length = len(list_a)
for i in range(list_length/2):
x = list_a
list_a = list_a[ list_length -1 - i]
list_a[ list_length -1 - i] = x
print list_a
Perl
Here's a perl code for reversing a list. Done by creating a new list,
NOT using in-place:
# perl
use strict;
use Data:umper;
my @listA = qw(a b c d e f g);
my $listLength = scalar @listA;
my @listB = ();
for ( my $i = 0; $i < $listLength; $i++ ) {
$listB[$i] = $listA[ $listLength - 1 - $i];
}
print Dumper(\@listB);
# perl
# in-place algorithm for reversing a list.
use strict;
use Data:umper;
use POSIX; # for “floor”
my @listA = qw(a b c d e f g);
my $listLength = scalar @listA;
for ( my $i = 0; $i < floor($listLength/2); $i++ ) {
my $x = $listA[$i];
$listA[$i] = $listA[ $listLength - 1 - $i];
$listA[ $listLength - 1 - $i] = $x;
}
print Dumper(\@listA);
__END__
emacs lisp
;; emacs lisp
;; reverse a array
(setq arrayA ["a" "b" "c" "d" "e" "f" "g"])
(setq arrayLength (length arrayA))
(setq arrayB (make-vector arrayLength 0))
(dotimes (i arrayLength )
(aset arrayB i (aref arrayA (- (1- arrayLength) i)) )
)
(print (format "%S" arrayB))
;; emacs lisp
;; in-place algorithm for reversing a array
(setq arrayA ["a" "b" "c" "d" "e" "f" "g"])
(setq arrayLength (length arrayA))
(dotimes (i (floor (/ arrayLength 2)))
(let (x)
(setq x (aref arrayA i))
(aset arrayA i (aref arrayA (- (1- arrayLength) i)))
(aset arrayA (- (1- arrayLength) i) x) ) )
(print (format "%S" arrayA))
Xah