성능 체크

Algorithm 2016. 9. 1. 16:07

시간 체크 

용량 체크 

메모리체크 


아래 처럼 이용해서 어느부분에서 시간을 많이 잡아먹고 메모리를 잡아먹는지 체크할수있다.

전역으로 체크할 변수 (시간/메모리)

지역으로 체크할 변수 (시간/메모리)



'Algorithm' 카테고리의 다른 글

parseint (atoi)구현  (0) 2015.06.24
length() 메소드 작성  (0) 2015.06.23
소인수 분해 구하기  (0) 2015.05.24
너비우선탐색 과 깊이우선탐색  (0) 2015.05.20
피보나치 동적계획법 소스  (0) 2015.05.20
Posted by 이상욱1
,

parseint (atoi)구현

Algorithm 2015. 6. 24. 17:16


public class Strparsei {


public static int atoi(String str) {

int radix = 10; // 이게 돌아가면서 원래 값에서 자리수 한자리를 늘여준다 

byte[] temp = str.getBytes();

int result = 0;

for(int i=0;i<temp.length;i++) {

if (temp[i] < '0' || temp[i] > '9') { // 0~9 넘어갈경우 (문자 방지)

throw new NumberFormatException();

}

result = (result*radix) + temp[i] - '0';

}

return result;

}

public static void main(String[] args) {

int a=0;

a=Strparsei.atoi("1234");

System.out.println(a);

}

}



참고사이트 http://globalbiz.tistory.com/m/post/82

'Algorithm' 카테고리의 다른 글

성능 체크  (0) 2016.09.01
length() 메소드 작성  (0) 2015.06.23
소인수 분해 구하기  (0) 2015.05.24
너비우선탐색 과 깊이우선탐색  (0) 2015.05.20
피보나치 동적계획법 소스  (0) 2015.05.20
Posted by 이상욱1
,


static int length(String a){

if (a.length() ==0 ) {

return 0;

}

char[] len=new char[a.length()];

int count=0;

for(int i=0; i<len.length; i++){

count++;

}

return count;

}

public static void main(String[] args) {

StrlenM a = new StrlenM();

int result=a.length("");

System.out.println(result);

}

}

'Algorithm' 카테고리의 다른 글

성능 체크  (0) 2016.09.01
parseint (atoi)구현  (0) 2015.06.24
소인수 분해 구하기  (0) 2015.05.24
너비우선탐색 과 깊이우선탐색  (0) 2015.05.20
피보나치 동적계획법 소스  (0) 2015.05.20
Posted by 이상욱1
,

package Algoexam;


import java.util.Vector;


public class Soinsuexam {


public static void main(String[] args) {

Soinsuexam s= new Soinsuexam() ;

Vector c = new Vector();

c=s.soinsu(24);

for(int i=0 ; i<c.size(); i++){

System.out.println(c.get(i));

}

}

public Vector soinsu(int n ){

Vector v= new Vector();

if(n==1){

v.add(n);

return v;

}

for (int div=2;n>1;div++){

while(n%div==0){

n/=div;

v.add(div);

}

}

return v;

}

}



'Algorithm' 카테고리의 다른 글

parseint (atoi)구현  (0) 2015.06.24
length() 메소드 작성  (0) 2015.06.23
너비우선탐색 과 깊이우선탐색  (0) 2015.05.20
피보나치 동적계획법 소스  (0) 2015.05.20
동적 프로그램과 분할정복의 차이  (0) 2015.05.12
Posted by 이상욱1
,

http://www.aistudy.com/heuristic/breadth-first_search.htm

breadth -first search 

컴퓨터과학 에서 breadth-first search (BFS) 는 트리 (Tree)그래프 (Graph) 를 탐색하는 tree search algorithm 이다. 보통 root node에서 출발하여 모든 이웃하는 노드들을 탐색한다. 또한 가장 가까운 노드들 각각에 대해 탐색하지 않은 이웃 노드들을 탐색하여 목표를 찾을 때까지 계속한다.

BFS 는 해 (solution)를 찾아서 조직적으로 트리의 모든 노드들을 검사하는 무정보 탐색 (Uninformed or Blind Search) 이다. 달리 말하면 목표에 대한 고려없이 목표가 발견될 때 까지 전체 트리를 전부 탐색한다 (exhaustively searches). BFS 는 휴리스틱 (Heuristic)  을 사용하지 않는다.




깊이 우선 탐색 

depth first search 

위키백과, 우리 모두의 백과사전.
깊이 우선 탐색

깊이 우선 탐색(depth-first searchDFS)은 맹목적 탐색방법의 하나로 탐색트리의 최근에 첨가된 노드를 선택하고, 이 노드에 적용 가능한 동작자 중 하나를 적용하여 트리에 다음 수준(level)의 한 개의 자식노드를 첨가하며, 첨가된 자식 노드가 목표노드일 때까지 앞의 자식 노드의 첨가 과정을 반복해 가는 방식이다.

깊이 제한과 백트래킹[편집]

탐색 과정이 시작 노드에서 한없이 깊이 진행되는 것을 막기 위해 깊이 제한(depth bound)을 사용한다. 깊이 제한에 도달할 때까지 목표노드가 발견되지 않으면 최근에 첨가된 노드의 부모노드로 되돌아와서, 부모노드에 이전과는 다른 동작자를 적용하여 새로운 자식노드를 생성한다.
여기서 부모노드로 되돌아오는 과정을 백트래킹(backtracking)이라 한다.


http://forum.falinux.com/zbxe/index.php?document_srl=536248&mid=lecture_tip

알고리즘[편집]

dfs_alg.jpg  

[깊이우선탐색 알고리즘]

'Algorithm' 카테고리의 다른 글

length() 메소드 작성  (0) 2015.06.23
소인수 분해 구하기  (0) 2015.05.24
피보나치 동적계획법 소스  (0) 2015.05.20
동적 프로그램과 분할정복의 차이  (0) 2015.05.12
문자열 뒤집기 문제  (0) 2015.05.09
Posted by 이상욱1
,

http://nikhilkh.blogspot.kr/2012/04/dynamic-programming-beast-is-coming-run.html



package Algoexam;


public class FiboDynamic {


public  int fibo(int n){

int [] table = new int [n+1];// n 이면 아웃오브 인덱스 뜬다 

 

for(int i=0; i<table.length;i++){

if(i==0){

table[i]=1;

}else if(i==1){

table[i]=1;

}else{

table[i]=table[i-2]+table[i-1];

}

}

return table[n];

}

public int fibo1(int n){

 

if(n<=1){

return 1;

}

else{

return  fibo1(n-1)+fibo1(n-2);

}

 

}

 

public static void main(String[] args) {

FiboDynamic f = new FiboDynamic();

 

int result1=0;

int result2=0;

result1=f.fibo(5);

//result2=f.fibo1(5);

System.out.println(result1);

//System.out.println(result2);

 

}

}



'Algorithm' 카테고리의 다른 글

소인수 분해 구하기  (0) 2015.05.24
너비우선탐색 과 깊이우선탐색  (0) 2015.05.20
동적 프로그램과 분할정복의 차이  (0) 2015.05.12
문자열 뒤집기 문제  (0) 2015.05.09
이진 탐색 순회 소스  (0) 2015.05.03
Posted by 이상욱1
,

 동적 프로그래밍 해결 방법은 분할 정복과 유사

  • 분할 정복에서는 분할되는 소문제가 소로 독립적이어서 소문제를 다시 순환적으로 풀어 그 결과를 합치면 된다.
  • 동적 프로그래밍에서는 소문제가 독립적이지 않아서, 다시 말해서 분할된 소문제간에 중복되는 부분이 있어서 이를 분할 정복 방법으로 풀면 똑같은 소문제를 여러 번 반복해서 풀어야 하는 경우가 발생
  • (예) 피보나치 수 fn = fn-1 + fn-2, n >= 2의 계산에 분할 정복 방법을 적용한다면
    f10 계산시에 f9와 f8을 계산해야 하는데 f9 계산시에 다시 f8을 구해야 하므로 f8은 중복해서 계산된다. 동적 프로그래밍에서는 소문제의 해를 표에 저장해 놓으므로 f8은 한 번만 계산하여 그 결과를 표에 저장해 놓고 필요할 때 이 표에서 그 값을 꺼내오면 된다.



동적계획법

Contents

1 정의
2 구현
2.1 접근
2.2 메모이제이션
2.2.1 위 문제에 대한 메모이제이션 적용 예

1 정의 


동적 계획법의 접근 방식은 기본적으로 분할 정복 알고리즘과 비슷하다. 동적 계획법을 사용하는 알고리즘 역시 주어진 문제를 부분 문제로 나누어 각 부분 문제의 답을 계산하고, 이 계산한 결과값을 이용해 원래 문제의 답을 산출하기 때문이다. 여기서 분할정복과 차이가 생기는 부분은 원래의 문제를 부분 문제로 나누는 방식에 있다. 동적 계획법의 경우 주어진 문제를 나눌 때 부분 문제를 최대한 많이 이용하도록 나눈 다음, 주어진 부분 문제의 정답을 한 번만 계산하고 저장해둔 뒤 다시 한 번 이 부분 문제를 이용할 때에는 저장해둔 정답을 바로 산출하여 이용함으로써 속도를 향상시킨다.

동적 계획법을 영문으로는 다이나믹 프로그래밍(dynamic programming)이라 표기하는데, 일반적으로 전산학에서 이용하는 프로그래밍이라는 단어와는 큰 연관이 없다.[1]

2 구현 


2.1 접근 


동적 계획법의 개념과 구현에 대해 정확하게 짚고 넘어가기 위해 동적 계획법을 적용시킬 수 있는 예에 대해 알아보자.

  • f(a,b) = f(a-1,b) + f(a,b-1) (a,b >= 1 )
  • f(0,0) = 1, 임의의 자연수 n에 대해 f(n,0) = f(0,n) = 1
위와 같이 정의된 함수에서 주어진 임의의 a,b에 대해 f(a,b)의 값을 효율적으로 구하고자 할 때 동적 계획법을 적용시킬 수 있다.

예를 들어 f(2,2)을 계산한다고 해보자. 이 경우 아래 그림과 같은 참조를 거치게 된다.


순서대로 계산횟수를 구해보면 f(2,2)를 구하기 위해 총 6번의 연산을 거쳐야한다. 이 때 중복되는 부분 문제[2]에 대한 답을 미리 계산해놓고 연산한다고 가정했을 때 계산횟수를 구해보면 f(2,2)를 구하기 위해 5번의 연산을 거쳐야한다. 이 경우 간단한 예라 중복되는 부분 문제가 f(1,1) 하나 뿐이기 때문에 큰 속도의 이득을 볼 수 없지만 a,b의 값이 커질 수록 속도 면에서 엄청난 이득을 볼 수 있다. 몇 가지 a,b 값에 대해 f(a,b)를 구하기 위한 연산 횟수를 나타낸 아래 표를 참조해보자.

(a,b)그냥 계산시 연산 횟수동적 계획법 이용시 연산 횟수
(2,2)65
(4,4)7017
(6,8)300349
(10,10)184756101

이 정도면 아마 대충 동적 계획법의 효율이 느껴질 것이다. 실제로 a,b가 1증가할 때마다 연산 횟수는 기하급수적으로 증가하며, 이 때 중복되는 부분 문제를 적절히 처리해줌으로써 높은 계산효율을 얻을 수 있는 것이다.

2.2 메모이제이션 


위에서 언급한 것과 같이 주어진 함수의 결과를 저장하는 장소를 마련해둔 후[3] 이 값을 재활용하는 최적화 기법을 메모이제이션(memoization)이라고 한다.

메모이제이션은 동적계획법에서 빈번하게 사용되므로 동적 계획법에 대해 제대로 배우고 싶다면 필수적으로 배워두워야할 테크닉이다.

https://mirror.enha.kr/wiki/%EB%8F%99%EC%A0%81%EA%B3%84%ED%9A%8D%EB%B2%95

http://ds.xway.kr/algorithm/a354.html

'Algorithm' 카테고리의 다른 글

너비우선탐색 과 깊이우선탐색  (0) 2015.05.20
피보나치 동적계획법 소스  (0) 2015.05.20
문자열 뒤집기 문제  (0) 2015.05.09
이진 탐색 순회 소스  (0) 2015.05.03
이진 탐색 순회 개념  (0) 2015.05.03
Posted by 이상욱1
,

import java.util.Scanner;


public class Stringreverse {


public static void main(String[] args) {

Scanner sr=new Scanner(System.in);

System.out.println("문자열 입력");

String str= sr.nextLine();

for(int i=str.length()-1; i>=0 ;i--){

System.out.println(str.charAt(i));

}

}



http://dynamide.tistory.com/1444

'Algorithm' 카테고리의 다른 글

피보나치 동적계획법 소스  (0) 2015.05.20
동적 프로그램과 분할정복의 차이  (0) 2015.05.12
이진 탐색 순회 소스  (0) 2015.05.03
이진 탐색 순회 개념  (0) 2015.05.03
이진 탐색트리 삽입  (0) 2015.05.03
Posted by 이상욱1
,

삽입 할때 만들어 둔  Tree 클래스에 preorder 함수 , inorder 함수 postorder 함수 를 추가 해줄것입니다.

public class Tree {


public Node rootNode=null;

public void addNode(int value){

// root 값이 없는 경우 

if(rootNode==null){

Node n=new Node();

n.setValue(value);

rootNode=n;

}else{// root 값이 있는경우 

addNode(value , rootNode );

}

}

public void addNode(int value , Node rootNode){

// root 값보다 작은 경우   

if(rootNode.getValue()>value){

// root의 왼쪽 노드가 없는경우 

if(rootNode.getLeftNode()==null){

Node n = new Node();

n.setValue(value);

rootNode.setLeftNode(n);

}

else {// root의 왼쪽노드가 있는경우 

addNode(value, rootNode.getLeftNode()); // 다시 이함수를 호출해서 더 깊이 들어가는 부분이고 root는 root의 왼쪽 노드 

}

}else{//root 값보다 큰경우 

// root의 오른쪽 노드가 없는 경우 

if(rootNode.getRightNode()==null){

Node n = new Node();

n.setValue(value);

rootNode.setRightNode(n);

}

else{// root의 오른쪽 노드가 있는경우 더 깊이 들어가야한다 

addNode(value, rootNode.getRightNode());

}

}

}

// preorder 쪽  Root 부터  왼쪽 모든 노드 탐색 후 오른쪽 ( root , left , right)  

public void preorder(Node rootNode){

if(rootNode==null){

return ;

}

System.out.println(rootNode.value);

preorder(rootNode.leftNode);

preorder(rootNode.rightNode);

}

//inorder 쪽 맨 왼쪽 아래노드 부터 Root ,  오른쪽 (left , root , right)

public void inorder(Node rootNode){

if( rootNode==null){

return;

}

inorder(rootNode.leftNode);

System.out.println(rootNode.value);

inorder(rootNode.rightNode);

}

//맨 왼쪽 아래노드 부터 오른쪽 탐색 후 Root  (left , right , root) 

public void postorder(Node rootNode){// 이렇게 하면 널포인트 에러가 날거같은데 

if(rootNode == null ){

return;

}

postorder(rootNode.leftNode);

postorder(rootNode.rightNode);

System.out.println(rootNode.value);

}

public static void main(String[] args) {

Tree t = new Tree();

t.addNode(24);

t.addNode(15);

t.addNode(19);

t.addNode(2);

t.addNode(28);

t.addNode(27);

t.addNode(30);

System.out.print("preorder:");

t.preorder(t.rootNode);

System.out.print("inorder:");

t.inorder(t.rootNode);

System.out.print("postorder:");

t.postorder(t.rootNode);

}

}

결과값 
PreOrder : 24 15 2 19 28 27 30 InOrder : 2 15 19 24 27 28 30 PostOrder : 2 19 15 27 30 28 24 


'Algorithm' 카테고리의 다른 글

동적 프로그램과 분할정복의 차이  (0) 2015.05.12
문자열 뒤집기 문제  (0) 2015.05.09
이진 탐색 순회 개념  (0) 2015.05.03
이진 탐색트리 삽입  (0) 2015.05.03
이진 탐색트리 개념  (0) 2015.05.03
Posted by 이상욱1
,

이진탐색  순회 방법3가지가 있습니다 .

24

15                    28

2      19            27          30


root 처리 순서를 기준으로 이름을 정했습니다.

preorder(전위): Root 부터  왼쪽 모든 노드 탐색 후 오른쪽 ( root , left , right)  

전위 순회는 깊이 우선 순회(depth-first traversal)라고도 한다.

24 , 15 , 2 , 19 , 28 , 27 , 30 

inorder(중위): 맨 왼쪽 아래노드 부터 Root ,  오른쪽 (left , root , right)

중위 순회는 대칭 순회(symmetric traversal)라고도 한다.

2 , 15 , 19 , 24 , 27 , 28 , 30  

Postorder(후위): 맨 왼쪽 아래노드 부터 오른쪽 탐색 후 Root  (left , right , root) 

2 , 19 , 15 , 27 , 30 , 28 , 24 

완전 트리로 이해했다고 다 해한건 아니다. 불균형이진트리로 이해해야

진정한 이해한것입니다.

참조사이트

http://ko.wikipedia.org/wiki/%ED%8A%B8%EB%A6%AC_%EC%88%9C%ED%9A%8C

레벨 순서 순회(level-order)는 모든 노드를 낮은 레벨부터 차례대로 순회한다. 레벨 순서 순회는 너비 우선 순회(breadth-first traversal)라고도 한다.

정렬된 이진 트리

이진 탐색 트리에서

  • 전위 순회: F, B, A, D, C, E, G, I, H (root, left, right)
  • 중위 순회: A, B, C, D, E, F, G, H, I (left, root, right)
  • 후위 순회: A, C, E, D, B, H, I, G, F (left, right, root)
  • 레벨 순서 순회: F, B, G, A, D, I, C, E, H



             A

B                            C

D            E                  F            G

H            I                                J        K


Preorder(전위)

A B D H E I C F G J K 


Inorder(중위) 

H D B I E  A F C J G K 


Postorder(후위) 

H D I E B F J K G C A 


'Algorithm' 카테고리의 다른 글

문자열 뒤집기 문제  (0) 2015.05.09
이진 탐색 순회 소스  (0) 2015.05.03
이진 탐색트리 삽입  (0) 2015.05.03
이진 탐색트리 개념  (0) 2015.05.03
quick sort 나누는 부분 성공  (0) 2015.04.23
Posted by 이상욱1
,