Algorithms
By
Kameron Hertel, David Meierer, Kyle Ptacek, Rafael Rivera, and Brian Turner
What
is an Algorithm?
An algorithm is defined as
a specific, unambiguous set of instructions for carrying out a procedure or
solving a problem.
Real world examples of algorithms include:
Cooking recipes
Math Theorems
A guide to building a
model
Anything that pretty much
requires a set number of steps
Why
is an Algorithm Important to Computer Science?
Coding and developing
algorithms have helped computer scientists tackle a variety of complex problems
whether it is mathematical or logical.
In a way most computer
programs can be described as groups of algorithms that function on in sets of
organized data.
As the technology for
computers and software grows exponentially, more problems soon come to surface
which ultimately leads to the creation of new algorithms.
Ultimately, a computer
scientist is trying to code an algorithm that runs on the lowest amount of
resources but completes a problem quickly.
History
of an Algorithm
The word algorithm
originates from the ninth century scientist Persian mathematician Abu Abdullah
Muhammad ibn Musa Al-Khwarizmi.Originally, the word Abu
defined in his work was algorism, as
it referred to the rules of arithmetic using the customary Hindu-Arabic
numerals.The word algorithm was
established in the late eighteenth century.The first formalization of
an algorithm in computer science wasn’t until 1936 with the combined efforts of
Alan Turing’s Turing machine and Alonzo Church’s lambda calculus.Later on in the late
1930’s J.B. Rosser defined algorithms as “an effective method of solving
certain sets of problems exists if one can build a machine which will then
solve any problem of the set with no human intervention beyond inserting the
question and (later) reading the answer.”
S.C. Keene also noted in
his famous “Church-Turing thesis” a section he defined as “Algorithmic
theories... In setting up a complete algorithmic theory, what we do is to
describe a procedure, performable for each set of values of the independent
variables, which procedure necessarily terminates and in such manner that from
the outcome we can read a definite answer, "yes" or "no,"
to the question, "is the predicate value true?" (Kleene 1943:273)
As of today, computer
scientists continue to refine their coding and executions of algorithms
especially when it comes to the foundations of mathematics, and philosophy of
mind which focuses on how human brain functions and the body interact with each
other. This applies to the Artificial Intelligence side of the discipline where
researchers attempt to have computers think and adapt to problems as a human
would respond to them.
Computational
Complexity Theory
The computational
Complexity Theory is used in theoretical computer science in order to classify
computational problems to their difficulty level. When it comes to looking at
algorithms the theory analyzes how many steps and how much memory an algorithm
takes for the computer to complete the problem.
Computer scientists also consider these questions when
it comes to figuring out how to create an ideal algorithm for execution:
What is the problem at hand?
What type of algorithm is
needed?
Does the problem require
more than one algorithm?
How fast can we make the
algorithm solve the problem?
Expressing
Algorithms
Algorithms have a variety
of notations in which they can be expressed these include:
Natural Languages
These are less structured ambiguous ways to
express an algorithm. They are used for less complex equations.
Pseudocode, flowcharts, and Control Tables
These are more
structured ways to express algorithms than that of natural languages.
Representations of
algorithms have also been split into three categories based off of Alan Turing’s
work on his Turing machine:
“1
High-level description:
"...prose to describe an algorithm,
ignoring the implementation details. At this level we do not need to mention
how the machine manages its tape or head."
2
Implementation description:
"...prose used to define the way the
Turing machine uses its head and the way that it stores data on its tape. At
this level we do not give details of states or transition function."
3 Formal description:
Most detailed, "lowest level", gives
the Turing machine's "state table".”
(Pulled from wikipedia.org/wiki/algorithm)
Types
of Algorithms Using Big O Notation
What is Big O Notation?
Quite simply, big O notation describes the performance of an algorithm. This
also can be stated as the execution time of the algorithm or the amount of
memory that the algorithm requires for execution.
Examples include:
Linear Time
|
O(n)
|
Log Time (“real-time”)
|
O(log(n))
|
Quadratic Time
|
O(n^2)
|
Factorial Time
|
O(n!)
|
Explanations
of O Notation Algorithms
Linear
Time (O(n))
Algorithms that are said to be in linear time
means that that the greater number of input size leads to a linear increase in
the amount it takes to run the algorithm. Linear time is considered to be an
ideal algorithm as many computer scientists have tried to implement this by
exploiting the concept of parallelism to achieve this. This algorithm’s speed
is defined as whenever “n” number of inputs increase that the running time of
the program will take that same amount of time. Examples include: the
Boyer-Moore Algorithm and Ukknonen’s Algrorithm
Log
Time (Olog(n))
An
algorithm that uses the binary number system to achieve its output. These
algorithms will continue to get slower as the number of inputs increases. Say
that the number of inputs was to double this would then lead the running time
of the program to increase by constant that is greater than that of the input.
Examples of this algorithm can be found in binary trees or when using binary
search.
Quadratic
Time (O(n^2))
Quadratic algorithms have
been known to be used on relatively smaller problems. Whenever the number of
inputs in this algorithm increases (for example purposes let say it doubled)
then that would mean that the running time of the program would increase by a
factor of eight. The quadratic sieve algorithm is one example of an algorithm
using quadratic time.
Factorial Time (O(n!))
Mathematics has defined a
factorial as the product of all positive integers less than or equal to n numbers. This means that in a
factorial algorithm whenever the number (for example purposes say “n”) of
inputs increases by one the running time increases by a factor of n. Factorial
algorithms have been used to solve such things as the traveling salesman
problem.
Analysis
of Some Special Algorithms
Boyer-Moore
Algorithm (mentioned in linear time)
This
algorithm is considered to be one of the most efficient string matching
algorithms of its kind. Here the algorithm is designed to scan and look for
certain characters/phrases in code.
This example from
wordiq.com explains the idea:
“If
it starts a search at the beginning of a text for the word
"WIKIPEDIA", for instance, it checks the ninth position of the text
to see if it contains an "A". If it finds the "A", it moves
to the eighth position to see if that contains the last "I" of the
word, and so on until it checks the first position of the text for a
"W".
Why
Boyer-Moore takes this backward approach is clearer when we consider what
happens if the verification fails -- for instance, if instead of an
"A" in the ninth position, we find an "X". The
"X" doesn't appear anywhere in "WIKIPEDIA", and this means
there is no match for the search string at the very start of the text -- or at
the next eight positions following it, since those would all fall across the
"X" as well. After checking just one character, we're able to skip
ahead and start looking for a match starting at the tenth position of the text,
just after the "X".
This
explains why the best-case performance of the algorithm, for a text of length N
and a fixed pattern of length M, is N/M: in the best case, only one in N
characters needs to be checked. This also explains the somewhat
counter-intuitive result that the longer the pattern we are looking for, the
faster the algorithm will be usually able to find it.
The
algorithm precomputes two tables to process the information it obtains in each
failed verification: one table calculates how many positions ahead to start the
next search based the identity of the character that caused the match attempt
to fail; the other makes a similar calculation based on how many characters
were matched successfully before the match attempt failed. (Because these two
tables return results indicating how far ahead in the text to "jump",
they are sometimes called "jump tables", which should not be confused
with the more common meaning of jump tables in computer science.)”
Quadratic
Sieve Algorithm (mentioned in quadratic time)
The quadratic sieve
algorithm is known as an integer factorization algorithm. It is considered the
second fastest method of solving such factorizations only lagging behind the
general number field sieve. In practice the algorithm is trying to set up a
congruence of squares modulo “n” in which n is the target integer to be
factorized. The algorithm then does this in two phases data collection where
the algorithm collects information that could lead to congruent squares, and
data processing which puts the collected data into matrices to solve for the
congruence of the squares. Here are the main steps summarized:
1.
Choose a smoothness bound B. The number π(B), denoting the number of prime
numbers less than B, will control both the length of the vectors and the number
of vectors needed.
2.
Use sieving to locate π(B) + 1 numbers ai such that bi=(ai2 mod n) is B-smooth.
3.
Factor the bi and generate exponent vectors mod 2 for each one.
4.
Use linear algebra to find a subset of these vectors which add to the zero vector.
Multiply the corresponding ai together naming the result mod n: a and the bi
together which yields a B-smooth square b2.
5.
We are now left with the equality a2=b2 mod n from which we get two square
roots of (a2 mod n), one by taking the square root in the integers of b2 namely
b, and the other the a computed in step 4.
6.
We now have the desired identity: Compute the GCD of n with the difference (or
sum) of a and b. This produces a factor, although it may be a trivial factor (n
or 1). If the factor is trivial, try again with a different linear dependency
or different a.”
(pulled from wikipedia.org/wiki/Quadratic_sieve)
A
Top-Down Approach to Algorithms using a Warnier-Orr Diagram
Another way to look at
algorithms is to look at them, not in a code format, but in a Top-Down format
general format. A way we can do is this is to use a Warnier-Orr diagram to lay
out how you are going to organize the entire program. With this diagram the
programmer can see how it easy to build a program from the Top-Down. The
picture below depicts different kinds of algorithms in different formats.
Let’s walk-through the first algorithm:
Algorithm 1 starts off by inputting
x and y. These values can be anything, but for now we will assume that that
they are integer values (1, 2, 3, etc.).
The use can input these or they can be read from a file. After the two
variables have been assigned values, the algorithm will go to the next step
which is to take the sum of x and y and assign that value to the variable z.
The final step for this algorithm is to output or print the value stored in z.
The other two algorithms
feature aspects like looping and condition statements. These can cause your
algorithm to become more and more complex. This makes organization even more
important. Make sure that you keep that in mind when you are designing your
algorithms, organization will save you a lot of troubleshooting in the future.
Now that we have walked
through the first algorithm together, do you think that you could walk-through
the others by yourself? Give it a try. You might be surprised at what you can
do with algorithms.
Works Cited
Lund University. Algorithms. 14 October 2009.
29 September 2012 <http://cs.lth.se/english/algorithms/>.
Princeton University. Analysis of Algorithms. 5
August 2011. 29 September 2012
<http://introcs.cs.princeton.edu/java/41analysis/>.
Scriptol. History of Algorithms and Algorithmics.
n.d. 28 September 2012
<http://www.scriptol.com/programming/algorithm-history.php>.
Wikipedia. Algorithms. n.d. 30 September 2012
<http://en.wikipedia.org/wiki/Algorithms>.
Wikipedia. Big O Notation. n.d. 28 September
2012 <http://en.wikipedia.org/wiki/Big_O_notation>.
Wikipedia. Quadratic Sieve. n.d. 29 September
2012 <http://en.wikipedia.org/wiki/Quadratic_sieve>.
wordiQ. Boyer-Moore String Searching Algorithm -
Definition. 2010. 1 October 2012 <http://www.wordiq.com/definition/Boyer-Moore_string_searching_algorithm>.