Okay?

Now, we have to write this formally.

Right I mean, what is that?

Because if I tell a computer scientist, quantity Q that corresponds to

transitivity in the input graph, I still haven't described it very well, right?

So we will be learning in this course how to write this formally so

that an algorithm's person can understand exactly what we want.

And we will learn how to do this specifically as well, okay?

So the second step of algorithmic thinking is being able to formulate the problem in

terms of input, output.

The third step will be now that we understand how the problem is formulated

and structured mathematically, I need to come up with an algorithm for

solving this problem in the sense that the algorithm will take this as input

will give us that as output, okay.

In this course we will be learning about different algorithmic scales or

different algorithmic techniques that will help us solve this kind of problem, okay?

And when we write that algorithm, we have to reason about its correctness.

We have to reason about its computational requirement.

How fast?

How slow?

Is it feasible to run on such a ground?

This is a graph with two, four, five nodes.

What if someone has curated the entire Facebook network?

Today Facebook is estimated to have over a billion nodes.

If I come up with an algorithm,

is it going to run on a graph with a billion nodes?

If not, I have to start thinking about this thing, okay.

So the third step is about developing the algorithm to solve the problem,

the fourth step after we have designed the algorithm,

made sure it is correct, it is efficient and so on, we have to implement it, right?

So in this course you will be implementing algorithms in Python.

And when we do the implementation it's interesting,

because going from the algorithm that we developed in the third step

to the implementation is not a simple translation.

Because you have to be very careful, the algorithm can be correct, you might make

mistake when you are writing the code, the algorithm can be efficient and you might

turn it into inefficient implementation when you write the code and so on.

But also, at the same, there is a positive side for

going from the theoretical description of the algorithm to the implementation.

Is that you can even use your programming scales to make the implementation

even much faster than the theoretical guarantees of the algorithm, okay?

So going from the algorithm to the implementation is not a simple

task of someone knowing the syntax of a programming language and

translating the algorithm into it.

No, you have to use some skills to make sure that you implement the algorithm

correctly but you also try to make it even more efficient.

So this is the fourth step of writing the program.

Then, the fifth step which is the final step,

is that I need to remember that when did this all started.

It started from a social scientist asking me a question.

So now that I have written the computer program I will take that program,

take the data set that the social scientist has,

analyze it using the program and then give back the scientist the answer.

So, in this case, for example, I might say, 78%.

Okay? What does that number mean?

I'm telling the social scientist that in 78% of the cases where A is friend with B,

B is a friend with C.

You also have A and C friends, okay?

So this is algorithmic thinking in my, the way I define it for

this course and the way we'll be using it in this course.

Again it's five steps.

Understanding the problem is the first formulating the problem is the second.

Developing an algorithm is the third.

Implementing the algorithm is the fourth.

And then the fifth one is running it on the data and

answering the original question.