2016. 12. 7. 17:49

 ----------------------------------------------------------------------

Hello, i am GameDeveloperPlayground.

I am a Korean student and I post it for English practise.

I would appreciate pointing out grammar or typos.

----------------------------------------------------------------------


In this post, about Fibonacci sequence.


Fibonacci sequence


Fibonacci sequence is that adds the previous two numbers to create the number of current positions.


0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 ...


Except for the start two numbers 0 and 1, summarize the total number of previous number and previous number at previous number atfer the third.


0, 1, (0+1) , ((0+1) + 1) , (((0+1) + 1) +(0+1)) ...


There are a number of ways to implement such a simple algorithm.


Fibonacci sequence implementation using recursive function call.


1
2
3
4
5
6
7
8
int Algorithm(int n){
    if (n == 1)
        return 0;
    else if (n == 2)
        return 1;
    else
        return Algorithm(n - 1+ Algorithm(n - 2);
}
cs


The first and second values are set to 0 and 1, respectively returning 0 and 1, and returning the sum of the previous of n and the previous of the previous of n.


have just completed implementation, but every time enter the Algorithm function need to check wgether n is 1 or 2.


have implemented it as a loop this time to remove the fuplicate test twice.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int Algorithm(int n){
    if (n == 1)
        return 0;
    else if (n == 2)
        return 1;
    else
    {
        int beforevalue = 0;
        int current = 1;
 
        for(int i=1; i<n; ++i)
        {
            int temp = current;
            current += beforevalue;
            beforevalue = temp;
        }
        return current;
    }
}
cs


Changed the part that calls tell recursive function to thefor statement.


Current is the current number, and befroevalue is the previous number.

The next number is the current number plus the previous number. so you can add current and before value.


Other ways to do it...  Similar in performance, but there is another ' tail recursion' implementation. in code.


1
2
3
4
5
6
7
8
9
10
int Algorithm(int n){
    return AlgorithmTail(n, 01);
}
 
int AlgorithmTail(int n, int before, int next){
    if (n == 0)
        return before;
    else
        return AlgorithmTail(n - 1, next, before + next);
}
cs


After one hour

Before is next

Next is before + next.


So iterates through the tail recursion function and returns the current value (before) if the value of n is zero.


We will discuss the tail recursive function in detail in another post.



Thank you.

'Programing > Algorithm' 카테고리의 다른 글

[Algorithm] About Select Sort  (0) 2016.12.08
[Algorithm] About Insertion Sort  (0) 2016.12.08
[Algorithm] About Bubble Sort !!  (0) 2016.12.08
[Algorithm] About Linear Search  (0) 2016.12.08
[Algorithm] About Binary Search Algorithm.  (0) 2016.12.08
Posted by 시리시안
2016. 12. 7. 11:41


----------------------------------------------------------------------

Hello, i am GameDeveloperPlayground.

I am a Korean student and I post it for English practise.

I would appreciate pointing out grammar or typos.

----------------------------------------------------------------------


In this post, about asymptotic notation.


Most algorithms end quickly if the input size is small, regardledd of the efficiency of the algorithm.


But, if the input size is large, will be a difference in speed. Therefore, when analyzing the execution time of the algorithm, always analyze the inpust size large enough. This is called asymprotic nanlysis.


Typically, there are five notations.


  • Big O notatios.
  • Small O notiations.
  • Omega notiations.
  • Little Omega notations,
  • theta notation.


Let me write one by one.


Bit O notation


Big O notation is used computher enginerring to express the complexty or performance of an algorithm.

Big O notation represents the worst case.




O(1)

O(1) means that the execution time(or space) of the algorithm is always the same regardless of the size of the input data.



1
2
3
4
5
6
7
8
bool IsNull(int[] intarrays)
{
    if (intarrays == null)
    {
        return true;
    }
    return false;
}
cs


In this case, the if statement is executed on once regardless of the size of the input intarrays.


O(N)

O(N) means that the processing time increases proportionally to the amount of Input.


1
2
3
4
5
6
7
8
9
10
11
bool IsNull(int[] intarrays, int index)
{
    for(int i = 0; i < intarrays.Length; ++i)
    {
        if (intarrays[i] == index)
        {
            return true;
        }
    }
    return false;
}
cs


In this case. intarrays[i] and index value may be equal to each other in the middle.

Remember, Big O notations is represents performance for the worst case.

This is, the limits value that assumes that the maximum iteration


O(N²)

O(N²) represents a situation where performance is increased in proportion to the power of the power of the size of the input data


1
2
3
4
5
6
7
8
9
10
11
12
13
14
bool IsNull(int[] intarrays, int index)
{
    for(int i = 0; i < intarrays.Length; ++i)
    {
        for(int j = 0; j < intarrays.Length; ++j)
        {
            if (intarrays[j] == index)
            {
                return true;
            }
        }
    }
    return false;
}
cs


In this case, this is typically the case when nested loops are performed od data values thar are predominant.


O(log N)

O(log N) represent a case where the processing time increases slightly depending on the size of the input data.

A binary search algorithm is typical!!


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int searchint(int* intarrays, int index)
{
    int from = 0;
    int to = intarrays.Length - 1;
 
    while (from <= to)
    {
        int mid = (from + to) / 2;
 
        if (intarrays[mid] > index) 
        {
            to = mid - 1;
        }
        else if (intarrays[mid] < index)
        {
            from = mid + 1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}
cs


Most algorithms have good algorithms.


O(2ⁿ)

O(2ⁿ) represents the case where the processing time increases by 2times every time the input data increases by one.

O(2ⁿ) is called worst algorithm.


The big O signs are summarized as follows.

O(1) < O(log N) < O(N) < O(N²) < O(2ⁿ)



Little o Notation


Little o notation is used to express  upper bounds that are more spacious than Big O notation.

Little o notation is not often used to indicate the complexity or performance of an algorithm.


If the analysis time of an algorithm is O(log N), this means that the time required for the algorithm increases slowly over log N for Input size N.

It was hard to understand....

Which means it does not increase like log N, but increases like log N. O(log N) and o(log N) can not be the same growth rate, are used when it is obvious that they increase more slowly than log N.


Big Omega(Ω) notation


Big Omega notation, like Big O notation, is used to denote algorithm complesity or performance.

However, if Bit O notation is the worst, Bit Omege notation represents the best case.


This is the minimum time it takes to execute the corresponding algorithm.



Little Omega(ω) notation


Little Omega notation is used to represent upper bounds that are more spacius than Big Omega notation.


Like the Little O notation. 


If the analysis time of an algorithm is ω (log N), this means that the time required for the algorithm to grow slowly over log N for input size N.

It was hard to understand, which means it does not increase like log N, but increases like log N. That is, Ω (log N) and ω (log N) can not be the same rate of increase, but they are used when it is obvious that they will grow more slowly than log N.


Theta(Θ) notation


Theta notation.. Big O notation is worst case, and Big Omega notation is best case. Then Theta notation is average case.


Think it is the intersection of Big O and Big Omega.


So, this algorithm is within the theta range no matter hou good or bad it is, It's mean.



I've written a bit about asymptotic notation.


I'm not sure about the other four notations except for Big O.


In the future, I will post each of these 5 pieces one by one.


Thank you.


Posted by 시리시안
2016. 12. 5. 13:57

----------------------------------------------------------------------

Hello, i am GameDeveloperPlayground.

I am a Korean student and I post it for English practise.

I would appreciate pointing out grammar or typos.

----------------------------------------------------------------------


In this post I will post about inline, one of the reserved words in C++


This is one of the reserved words that comes out when you look at c++ books.


To put it plainly, inline functions are where the coded of the complied function is inserted directly into the program's code.



Shall see the code?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
 
using namespace std;
 
inline void Inlinefuction()
{
    cout<<"*** Inlinefuction() ***"<<endl;
}
 
 
int main()
{
 
    Inlinefuction();
 
    return 0;
}
cs


When you compile the code.


1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
 
using namespace std;
 
int main()
{
 
    cout<<"*** Inlinefuction() ***"<<endl;
 
    return 0;
}
cs


It will changed as above. How about this?


Let's check with assembly code to see more results.


First, if you look at the main function of assembly code that is not inline.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
; 12   : {
 
    push    ebp
    mov    ebp, esp
 
; 13   :     Inlinefuction();
 
    call    ?Inlinefuction@@YAXXZ            ; Inlinefuction
 
; 14   :     return 0;
 
    xor    eax, eax
 
; 15   : }
 
    cmp    ebp, esp
    call    __RTC_CheckEsp
    pop    ebp
    ret    0
cs


Will come out as above.


Inline apply assembly code.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
; 12   : {
 
    push    ebp
    mov    ebp, esp
    push    esi
 
; 13   :     Inlinefuction();
 
    mov    esi, esp
    mov    eax, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z
    push    eax
    push    OFFSET ??_C@_0BI@FMEKNHNP@?$CK?$CK?$CK?5Inlinefuction?$CI?$CJ?5?$CK?$CK?$CK?$AA@
    mov    ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
    push    ecx
    call    ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> >
    add    esp, 8
    mov    ecx, eax
    call    DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z
    cmp    esi, esp
    call    __RTC_CheckEsp
 
; 14   :     return 0;
 
    xor    eax, eax
 
; 15   : }
 
    pop    esi
    cmp    ebp, esp
    call    __RTC_CheckEsp
    pop    ebp
    ret    0
cs


Come out like this.


Look at line 13, can see the difference.


Let's change the function more easily.



Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
 
using namespace std;
 
int Inlinefuction(int a, int b)
{
    return a+b;
}
 
 
int main()
{
    int n;
    n = Inlinefuction(1,2);
    return 0;
}
cs


Assembly code not use Inline.

1
2
3
4
5
6
7
8
9
10
11
12
; 13   :     int n;
; 14   :     n = Inlinefuction(1,2);
 
    push    2
    push    1
    call    ?Inlinefuction@@YAHHH@Z            ; Inlinefuction
    add    esp, 8
    mov    DWORD PTR _n$[ebp], eax
 
; 15   :     return 0;
 
    xor    eax, eax
cs


Assembly code use Inline.

1
2
3
4
5
6
7
8
9
10
; 13   :     int n;
; 14   :     n = Inlinefuction(1,2);
 
    mov    eax, 1
    add    eax, 2
    mov    DWORD PTR _n$[ebp], eax
 
; 15   :     return 0;
 
    xor    eax, eax
cs


Look at code 14, can feel the difference.


No call on the assembly code.

And push is not being called either.




Looking at the process of calling a generic function, first the stack is push parameters, and the function is called.


Then there are push and pop stack for the return value in the function. After return, there is pop for stack cleanup.


Because these function calls access the stack, they can slow down, because accessed by memory.


When use inline, the first thing is speed and memory effect.


Disadvantage is that if use it repeatedly, the assembly code becomes longer.


If the function is called multiple times and written in assemblycode.. is not that a joke?



Conclusion.


Well, my conclusion from my brief knowledge.

Function that has a short syntax and fewer calls is use inline.


I would appreciate it if you point out in a comment field. please.


Thankyou.






'Programing > Language' 카테고리의 다른 글

Why learn C language.  (0) 2016.11.30
Posted by 시리시안