7 methodology-of-problem-solving-120712073958-phpapp02

47
Methodology of Problem Solving Efficiently Solving Computer Programming Problems Doncho Minkov Telerik Software Academy academy.telerik.com Technical Trainer http://minkov.it/

Upload: nasimsalmani

Post on 14-Jul-2015

44 views

Category:

Software


0 download

TRANSCRIPT

Methodology ofProblem Solving

Efficiently Solving Computer Programming Problems

Doncho Minkov

Telerik Software Academyacademy.telerik.com

Technical Trainer

http://minkov.it/

Table of Contents

1. Problem Solving

2. Understanding the requirements

3. Analyzing the problem

4. Brainstorming

5. Using Pen and Paper

6. Checking your ideas

2

Problems SolvingFrom Chaotic to Methodological Approach

How to Solve Problems?

1. Read and analyze the problems

2. Use a sheet of paper and a pen for sketching

3. Think up, invent and try ideas

4. Break the problem into subproblems

5. Check up your ideas

6. Choose appropriate data structures

7. Think about the efficiency

8. Implement your algorithm step-by-step

9. Thoroughly test your solution

4

Understanding the Requirements

Read and Analyze the Problems

Consider you are at traditional computer programming exam or contest

You have 5 problems to solve in 6 hours

First read carefully all problems and try to estimate how complex each of them is

Read the requirements, don't invent them!

Start solving the most easy problem first

Leave the most complex problem last

Approach the next problem when the previous is completely solved and well tested

6

Analyzing the Problems

Example: we are given 3 problems:

1. Set of Numbers

Count the occurrences of a number in set of numbers

2. Students

Read a set of students and print the name of the student with the highest mark

3. Binary Representation

Find the 'ones' and 'zeros' of a set of numbers in their binary representation

7

Analyzing the Problems (2)

Read carefully the problems and think a bit

Order the problems from the easiest to the most complex:

1. Set of Numbers

Whenever find the number increase a count variable with one

2. Students

Temporary student with current highest mark

3. Binary representation

If we know the 'ones', we can easily find the zeros8

Using a Paper and a Pen

Visualizing and Sketching Your Ideas

Use a Sheet of Paper and a Pen

Never start solving a problem without a sheet of paper and a pen

You need to sketch your ideas

Paper and pen is the best visualization tool

Allows your brain to think efficiently

Paper works fasterthan keyboard / screen

Other visualization toolcould also work well

10

Paper and Pen

Consider the "Binary representation" problem

We can sketch it to start thinking

Some ideas immediately come, e.g.

Divide by 2 and check for the remainder

Bitwise shift right and check for the rightmost bit

Bitwise shift left and check for the leftmost bit

Count only the "zeros"

Count only the "ones"

Count both "ones" and "zeros"11

Invent IdeasThink-up, Invent Ideas and Check Them

Think up, Invent and Try Ideas

First take an example of the problem

Sketch it on the sheet of paper

Next try to invent some idea that works for your example

Check if your idea will work for other examples

Try to find a case that breaks your idea

Try challenging examples and unusual cases

If you find your idea incorrect, try to fix it or just invent a new idea

13

Invent and Try Ideas – Example

Consider the "Binary Representation" problem

Idea #1: divide by 2 and check the remainder

How many times to do this?

Where to check?

Idea #2: Bitwise shift and check the left/rightmost bit

Left shift or right shift?

How many times to repeat this?

Is this fast enough?

14

Check-up Your IdeasDon't go Ahead before Checking Your Ideas

Check-up Your Ideas

Check-up your ideas with examples

It is better to find a problem before the idea is implemented

When the code is written, changing radically your ideas costs a lot of time and effort

Carefully select examples for check-up

Examples should be simple enough to be checked by hand in a minute

Examples should be complex enough to cover the most general case, not just an isolated case

16

Invent New Idea If Needed

What to do when you find your idea is not working in all cases?

Try to fix your idea

Sometime a small change could fix the problem

Invent new idea and carefully check it

Iterate

It is usual that your first idea is not the best

Invent ideas, check them, try various cases, find problems, fix them, invent better idea, etc.

17

Efficiency and PerformanceIs Your Algorithm Fast Enough?

Think About the Efficiency

Think about efficiency before writing the first line of code

Estimate the expected running time(e.g. using asymptotic complexity)

Check the requirements

Will your algorithm be fast enough to conform with them

You don't want to implement your algorithm and find that it is slow when testing

You will lose your time19

Efficiency is not Always Required

Best solution is sometimes just not needed

Read carefully your problem statement

Sometimes ugly solution could work for your requirements and it will cost you less time

Example: if you need to sort n numbers, any algorithm will work when n ∈ [0..500]

Implement complex algorithms only when the problem really needs them!

20

ImplementationCoding and Testing Step-by-Step

Start Coding: Check List

Never start coding before you find correct idea that will meet the requirements

What you will write before you invent a correct idea to solve the problem?

Checklist to follow before start of coding:

Ensure you understand well the requirements

Ensure you have invented a good idea

Ensure your idea is correct

Ensure you know what data structures to use

Ensure the performance will be sufficient22

Coding Check List – Example

Checklist before start of coding:

Ensure you understand well the requirements

Yes, counts values of bits

Ensure you have invented a correct idea

Yes, the idea seems correct and is tested

Ensure the performance will be sufficient

Linear running time good performance

23

Implement yourAlgorithm Step-by-Step

"Step-by-step" approach is always better than "build all, then test"

Implement a piece of your program and test it

Then implement another piece of the program and test it

Finally put together all pieces and test it

Small increments (steps) reveal errors early

"Big-boom" integration takes more time

24

Step #1 –Check The Value Of The First Bit

What happens to the number?

Do we need the first bit anymore?

Remove it by right shift

25

int number=10;int firstBit = number & 1;

Now we have the value of the first bit

int number=10;int firstBit = number & 1;number >>= 1;

Step #1 –Test

Testing if the correct bit is extracted and checked

Get feedback as early as possible:

The result is as expected:

26

int number = 10;int firstBit = number & 1;number >>= 1;Console.WriteLine(firstBit);Console.WriteLine(number);

0 // the first bit5 // the number without the first bit

Step #2 –Get All The Bits Of a Number

How many bits we want to check?

All for the number

But how many are they

Example: the number 10

10(10) = 8 + 2 = 1010(2)– 4 bits

How the find out when to stop the checking?

When right shifting the zeros in the front get more and more

At some point the number will become zero27

Step #2 –Get All The Bits Of a Number

Until the number becomes equal to 0

1. Check the value of the bit

2. Right shift the number

28

while (number != 0){

int firstBit = number & 1;number >>= 1;Console.Write("{0} ", firstBit);

}

Step #2 –Test

Testing with 10

29

0 1 0 1

Testing with 1111

1 1 1 0 1 0 1 0 0 0 1

Seems correct

1111 = 1024 + 64 + 16 + 4 + 2 + 1 = 210 + 26 + 24 + 22 + 21 + 20

Step #3 –Check For The Occurrences Of Bit Value

So far:

We can get the values of all the bits of a number

Lets count the number of ones and zeros

30

while (number != 0){

int firstBit = number & 1;number >>= 1;if (firstBit == 1){

oneCount++;}else{

zeroCount++;}

}

Step #3 –Test

Test with number 111 (1101111(2))

The result is correct

31

ones:6 zeros:1

Test with number 1234 (10011010010(2))

The result is correct

ones:5 zeros:6

Step #4 –Count The Bits Of The Whole Set

Pass through all the numbers

Count their bits

32

int zeroCount = 0, oneCount = 0, n = 5;for (int i = 0; i < n; i++){

int number = int.Parse(Console.ReadLine());while (number != 0){

int firstBit = number & 1;number >>= 1;if (firstBit == 1) { oneCount++; }else { zeroCount++; }

}Console.WriteLine("ones:{0};zeros:{1}",oneCount,zeroCount);

}

Step #4 –Count The Bits Of The Whole Set (2)

The result is surprisingly incorrect:

The count of ones and zeros appears as to stack for all the numbers of the set!

We defined the counters outside the iteration of the set loop

Put them inside33

Input: 12345

Output: ones:1; zeros:0ones:2; zeros:1ones:4; zeros:1ones:5; zeros:3ones:7; zeros:4

The result is surprisingly incorrect:

Step #4 – Fixing the Bug

Now it is OK34

int n = 5;

for (int i = 0; i < n; i++)

{

int zeroCount = 0, oneCount = 0;

int number = int.Parse(Console.ReadLine());

while (number != 0)

{

int firstBit = number & 1;

number >>= 1;

if (firstBit == 1) { oneCount++; }

else { zeroCount++; }

}

Console.WriteLine("ones:{0}; zeros:{1}",

oneCount,zeroCount);

}

TestingThoroughly Test Your Solution

Thoroughly Test your Solution

Wise software engineers say that:

Inventing a good idea and implementing it is half of the solution

Testing is the second half of the solution

Always test thoroughly your solution

Invest in testing

One 100% solved problem is better than 2 or 3 partially solved

Testing existing problem takes less time than solving another problem from scratch

36

How to Test?

Testing could not certify absence of defects

It just reduces the defects rate

Well tested solutions are more likely to be correct

Start testing with a good representative of the general case

Not a small isolated case

Large and complex test, but

Small enough to be easily checkable

37

How to Test? (2)

Test the border cases

E.g. if n ∈ [0..500] try n=0 , n=1, n=2, n=499, n=500

If a bug is found, repeat all tests after fixing it to avoid regressions

Run a load test

How to be sure that your algorithm is fast enough to meet the requirements?

Use copy-pasting to generate large test data

38

Read the Problem Statement

Read carefully the problem statement

Does your solution print exactly what is expected?

Does your output follow the requested format?

Did you remove your debug printouts?

Be sure to solve the requested problem, not the problem you think is requested!

Example: "Write a program to print the number of permutations on n elements" means to print a single number, not a set of permutations!

39

Testing – Example

Test with a set of 10 numbers

Serious error found change the algorithm

Change the algorithm

The counters never reset to zero

Test whether the new algorithm works

Test with 1 number

Test with 2 numbers

Test with 0 numbers

Load test with 52 000 numbers

40

Test With 10000 Numbers –Example

41

int n = 10000, startNumber=111;

for (int i = startNumber; i < startNumber + n; i++){

int zeroCount = 0;int oneCount = 0;//int number = int.Parse(Console.ReadLine());int number = i;int originalNumber = number;while (number != 0){

int firstBit = number & 1;number >>= 1;if (firstBit == 1){ oneCount++; }else { zeroCount++; }

}}

Replace the reading from the console with a easier type of check

Test With 10000 Numbers –Example (2)

The result is perfect:

42

111(10) = 1101111(2) -> ones:6;zeros:1

10110(10) = 10011101111110(2) -> ones:10;zeros:4

Testing Tips

You are given the task of the binary representation

The program must read from the console

Integer numbers N and B

N integer numbers

While writing and testing the program

Don't read from the console

First hardcode the numbers

Later make it

When you are sure it works43

Hard-Coded Input – Example

44

// Hardcoded input data – for testing purposesint n = 5;int num1 = 11;int num2 = 127;int num3 = 0;int num4 = 255;int num5 = 24;

// Read the input from the console//int n = int.Parse(Console.ReadLine());//for (int i=0; i<n; i++)//{// int num = int.Parse(Console.ReadLine());// // Process the number …// // …//}

// Now count the bits for these n numbers …

SummaryProblems solving needs methodology:

Understanding and analyzing problems

Using a sheet of paper and a pen for sketching

Thinking up, inventing and trying ideas

Decomposing problems into subproblems

Selecting appropriate data structures

Thinking about the efficiency and performance

Implementing step-by-step

Testing the nominal case, border cases and efficiency

45

форум програмиране, форум уеб дизайнкурсове и уроци по програмиране, уеб дизайн – безплатно

програмиране за деца – безплатни курсове и уроцибезплатен SEO курс - оптимизация за търсачки

уроци по уеб дизайн, HTML, CSS, JavaScript, Photoshop

уроци по програмиране и уеб дизайн за ученициASP.NET MVC курс – HTML, SQL, C#, .NET, ASP.NET MVC

безплатен курс "Разработка на софтуер в cloud среда"

BG Coder - онлайн състезателна система - online judge

курсове и уроци по програмиране, книги – безплатно от Наков

безплатен курс "Качествен програмен код"

алго академия – състезателно програмиране, състезания

ASP.NET курс - уеб програмиране, бази данни, C#, .NET, ASP.NETкурсове и уроци по програмиране – Телерик академия

курс мобилни приложения с iPhone, Android, WP7, PhoneGap

free C# book, безплатна книга C#, книга Java, книга C#Дончо Минков - сайт за програмиранеНиколай Костов - блог за програмиране

C# курс, програмиране, безплатно

Methodology ofProblem Solving

http://academy.telerik.com

Free Trainings @ Telerik Academy

Fundamentals of C# Programming

Course

csharpfundamentals.telerik.com

Telerik Software Academy

academy.telerik.com

Telerik Academy @ Facebook

facebook.com/TelerikAcademy

Telerik Software Academy Forums

forums.academy.telerik.com