Problem Solving Intro

Problem Solving Intro

As human beings, we are faced with problems on a daily basis, some people seemingly lucky enough to be more adept at solving their problems and others seemingly with a lower knack of solving theirs.

If you are a layman like me, a few 'random' names will jump into mind when you think of problem solvers... Here's a few names that popped out as I was writing... The Wright Brothers, Thomas Edison, Albert Einstein, Archimedes, Friedrich August Kekulé, Mme Marie Curie et al...

"It's not that I'm so smart, it's just that I stay with problems longer ..." Albert Einstein

Now all these and other successful problem solvers are well documented for in History, and they had their own approaches to attacking and solving problems, some of them solved in awkward moments like Messr Archimedes in his bathtub, and some funnily solved in dreams like Messr Kekulé, but one thing is apparently common to all these people that contributed to changing our world : Persistence, which we can in other words describe as growing a thick skin towards what is termed as failure and looking at it from another angle like the famous Edison's quote :

"I have not failed. I've just found 10,000 ways that won't work"

With due respect to Messr Edison, but that's not exactly efficient, or is it? How many iterations will we allow ourselves to get a solution?

One of the greatest inventions of mankind is the invention of a computer, and more importantly the evolution of it, that has changed the world at lightning speed, and continues to evolve exponentially in all aspects. From monstrous Mainframes of olden days, to palm held gadgets of modern time to who knows where we will be in just 20 years time...

On the side of software, from a handful of rudimentary languages to hundreds if not thousands of 'known' programming languages, as elaborated in this list of programming languages , all with different approaches and paradigms of allowing their users / programmers to solve their problems.


Only decades ago there were just a handful of geniuses as programmers allowed anywhere near the 'godlike' mainframe machines.

Today mere mortals like me can 'prescribe instructions' to a computer to solve problems, and there are currently millions of software programmers like me, but with each good software programmer, there is one fundamental way of solving prescribed business and or functional problems through any programming platform : Algorithms ... a dreaded and feared word among many junior programmers , non-programmers alike... unnecessarily so, if I must remark.

For any novice, you will be happy to learn that an algorithm is nothing but just a way to solve a problem, and nothing to fear about as we will demonstrate that you as an individual have used algorithms time and again to solve problems that you face on a daily basis, sometimes efficiently, other times not so efficiently, and this is in real life, not some business problems using a 'genius only' programming language like Haskell(no pun intended).

Bees, yes the same bees you know that produce honey, have been known to come up with efficient algorithms to solve the travelling salesman problem, just like other creatures in other scenarios without elegantly designed software platforms and/ or mean looking intimidating mathematical equations.

A computer is as dumb as can be, much dumber than anyone reading this, but it has been collectively and cumulatively designed by some smart minds, thanks to them, to have a kind of structure about it that aids it in solving problems, that you and I even though we are way much smarter than the computer, will find it hard even impossible to solve. Doesn't it make sense to go back to the computer and learn from it the things that we taught it ourselves...

The human brain itself is more than a super-computer and in fact it is injustice to compare the brain with the computer, as it has much more processing power and ability than the computer, and yet we 'feel like grasshoppers' at the sight of a computer's capability.

It is postulated that the human brain operates at 1 exaFLOP, which is equivalent to a billion billion calculations per second! Compare that with the world's fastest supercomputer(made in China of course!) that operates at 3.86 petaFLOPs that translates to 33,860 trillion calculations per second , that is impressive against a 1.8 GHz computer's 1,800,000,000 calculations per second capacity but far inferior to that brain of yours that is currently reading this.

Can we learn from the computer? Can we dissect and understand how it solves problems? So that we just about begin to start operating more efficiently? Obviously there are other factors at play but my hope is to create a conscious awareness on how we go about in solving problems.


It must be mentioned and reinforced though that a human being is smarter than the computer, and can solve problems in far more sophisticated ways and combinations of problem solving strategies with intuition that a computer and it's inventors can only dream about, and now is a good time to look at technical approaches used in analyzing problems.

Different Approaches to Solving Problems

There is a term I grew up using in my mother tongue Chichewa spoken in my country of birth Malawi, in which we used to call a person without any form of understanding and exposure a "bulutu", in simplest terms "a fool"... , and could not help but compare that to the brute force approach of solving problems, in which we systematically enumerate all possible candidates for a solution and checking whether each candidate satisfies the problem's statement.

For the sake of keeping this article short and concise, I will explain how our bulutu and a brute force approach seem to have similar meanings in a consecutive post, but for now we can already see that it is not wise at all to look at EVERY possible candidate for a solution, as it quickly gets out of hand and is not that efficient . Efficient highlighted here because it is one of the fundamental terms that must be understood for algorithms in a programming sense.

Given a problem or a set of problems, the more mathematically inclined of us would first look for patterns and relationships in the problem definition and ask the question if we can express the relationships in the defined problem as equations or inequalities? Can we describe our problem using a graph and solve it using an existing algorithm in a graph modeling approach?

There are different questions that we may ask for any given problem definition. Can we divide it into 2 or more smaller but independent sub-problems and then solve the original problem using the combined solutions to the divided sub-problems? This is called a divide and conquer approach.

If we already have access to solutions for smaller instances of the given problem, can we easily construct the solution? This is a recursion, and / or a dynamic programming approach.

Can we split the input or execution into a number of cases and solve each case in isolation as in a case analysis approach?

Is there another problem that includes or absorbs our problem and the other problem is easier to solve? We call this a generalization approach.

Do we have a predefined and known data structure that directly maps to our given problem? We use this data-structure approach to solve our problem and obviously if you are a programmer it will always help to know and have your data structure knowledge arsenal.

Can we find a solution to small concrete instances of our problem and then build a solution that can be generalized to arbitrary instances in a small examples approach?

Can we use a different problem with a known solution as a subroutine in a reduction approach?

Can we add some new element to our problem to get closer to our solution in an auxiliary elements approach?

Can we solve a slightly different problem and map its solution to our problem in a variation approach?

Can we decompose our problem into sub-problems that can be solved independently on different machines in a parallelism approach? Not to filter out non-programmers, I am sure most of us have used parallelism by delegating part of a daily life problem to be done by some friend or another member of family?

Back to the subject at hand, can we store /keep some of our computation to our problem and later look it up to save us from doing more work in solving the problem, in other words known as the caching (cache) approach?

Do we see any symmetry in the input or solution space to our problem that we can exploit in a symmetry approach?

As you read all this, you quickly discover that the rules to solving any problems are that there are no rules! and my aim in this article and series is to improve our problem solving capabilities.

There are some thin lines between some of the approaches outlined above, and hopefully we will get better insights as we go deeper on each of them in subsequent articles.

Happy problem solving to you all! and until the next post...!

To view or add a comment, sign in

More articles by Kenneth F.

Explore content categories