분류 전체보기 65

레드 블랙 트리의 삭제

레드 블랙 트리의 삭제 연산은 이진 탐색 트리의 삭제와 동일한 연산 과정에 삭제할 노드의 색깔에 따라서 몇 가지 연산을 수행해준다. 나는 이진 탐색 트리의 연산에서 삭제할 노드의 자식이 두개인 경우 삭제할 노드 삭제 >> 왼쪽 자식 중 가장 큰 값의 노드를 삭제한 노드의 자리로 옮김 으로 구현하였다. 이 부분을 살짝 수정해야한다. 왼쪽 자식 중 가장 큰 값의 노드의 데이터를 삭제할 노드의 데이터로 덮어씌움 >> 삭제할 노드를 왼쪽 자식 중 가장 큰 값의 노드를 가르키게함 으로 삭제할 노드를 바꿔주게 했다. 이유는 삽입 연산과 비슷하게 삭제 연산에서도 삭제할 노드의 형제 노드를 확인하는데 루트 노드의 경우 형제 노드가 없다. 그래서 바꿔서 구현했다. 그럼 삭제할 노드를 구했다면 몇가지 체크를 하게된다. 1..

알고리즘/탐색 2023.09.06

레드 블랙 트리의 삽입

레드 블랙 트리는 삽입과 삭제가 주된 연산이다. 레드 블랙 트리의 삽입 연산은 기본적으로 이진 트리의 연산 방식을 따른다. 이후 레드 블랙 트리의 규칙을 준수하고있는지 체크하는 알고리즘에 의해 자체적으로 밸런싱 작업을 수행한다. 삽입 연산은 이진 트리에서 처럼 null이 나올때 까지 데이터의 크기를 비교하며 알맞은 노드의 자리를 찾아낸다. 여기서 다른 점은 레드 블랙 트리는 null이 아니라 nil 이라는 특수한 노드를 가르키는 곳이 마지막 노드이다. 새로운 노드가 들어갈 자리를 찾았으면 전체 트리를 검사해야한다. 이때 새로운 노드는 항상 레드 노드이다. 블랙 노드를 추가하는 방법도 있겠지만 레드 노드를 추가하는 것이 더 편리할 것이라 생각된다. 레드 노드를 추가하면 부모가 레드 노드인지만 확인하면 되기..

알고리즘/탐색 2023.09.06

레드 블랙 트리 - 회전

레드 블랙 트리의 연산을 수월하게 하기 위한 연산인 회전에 대해 설명하려한다. 회전 연산은 우회전과 좌회전이 있다. 우회전을 예로 들면 우선 타겟 노드를 정한다. 타겟 노드를 기준으로 왼쪽 자식의 오른쪽 자식 노드를 타겟 노드의 왼쪽 자식을 가르키게 한다. target->left = target->left->right; 그리고 빈 자리가 된 왼쪽 자식의 오른쪽 자식은 타겟 노드를 가르킨다. target->left->right = target; 여기서 위 두 코드를 연속으로 실행하면 당연히 제대로 작동하지 않는다. 그 이유는 타겟의 왼쪽이 이미 바뀌기 때문에 별도의 노드를 선언해서 수행해야한다. NODE* temp = nullptr; temp = target->left; // 타겟 왼쪽 노드 주소 targ..

알고리즘/탐색 2023.09.06

레드 블랙 트리

레드 블랙 트리란 이진 탐색 트리의 단점인 균형을 유지할 수 없는 부분을 보완한 트리이다. 이렇게 이진 탐색 트리의 단점을 보완하여 균형을 유지하는 트리를 밸런싱 트리라고 한다. AVL 트리 와 Red-Black 트리가 대표적이다. 레드 블랙 트리의 구현 레드 블랙 트리는 노드에 레드와 블랙이라는 개념이 추가된다 struct NODE { int data; struct NODE* left; struct NODE* right; struct NODE* parent; // 0 : 레드 / 1 : 블랙 / 2 : 이중 블랙 int black; }; 나는 위와 같이 black라는 변수로 나타냈다. 그리고 원래의 트리에서는 마지막 노드의 left right는 자식 노드가 없으므로 nullptr 이지만, 레드 블랙 트..

알고리즘/탐색 2023.09.06

리눅스 0, 1 / PIPESTATUS

리눅스에서 0은 성공, 1은 실패이다. true echo $? false echo $? 확인해보면 알 수 있다. 성공 여부는 마지막 실행 문장에 대해서만 저장된다. 그리고 파이프 문으로 연결될 시 파이프가 실패해도 성공 여부는 알 수 없다. cat dslakmdas | wc -l echo $? cat 로 존재하지 않는 파일명을 출력하게 하고 파이프로 넘긴 뒤, 행의 갯수를 확인했다. 존재하지않는 다는 파이프문의 오류가 있음에도 ws는 실행되고 성공 값을 확인했다. 사실 파이프 문의 실패 여부를 확인하는 방법이 있는데 그것은 PIPESTATUS 이다. cat asdasdas | wc -l echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}" 1 0으로 출력되는 것을 확인할 수 있다. 그..

명령어 - set [옵션] [옵션명]

리눅스 쉘 스크립트 코드는 디버깅이 없고, 오류가 발생해도 무시하고 진행된다. 이럴 경우 값이 제대로 들어가지 않아 뒤에 코드가 오류가 생기는 경우가 있다. 이럴때 set 옵션을 줘서 디버깅하는 효과를 줄 수 있다. 우선 set를 설명하기 전에 PIPESTATUS에 대해 알아야한다. https://aif0921.tistory.com/43 리눅스 0, 1 / PIPESTATUS 리눅스에서 0은 성공, 1은 실패이다. true echo $? false echo $? 확인해보면 알 수 있다. 성공 여부는 마지막 실행 문장에 대해서만 저장된다. 그리고 파이프 문으로 연결될 시 파이프가 실패해도 성공 aif0921.tistory.com set 에는 e, o, u, x 가 많이 사용되는 듯 하다. 다른 옵션은 찾아..

Rocky Linux 8 복사 붙여넣기 안됨

우분투에서 마우스를 통해 복사 붙여넣기를 잘 쓰다가 vm에서 Rocky Linux를 쓰면서 상당히 불편했다. 게스트 확장 CD 설치 / 클립보드 공유 양방향 설정 / xclip / vimx 등등 구글링을 통해 나름대로 해봤지만 결국 못했다. 아마도 이 os에서 지원하지 않는 다거나 지원하지 않아도 뭔가 설치하면 될거같은데 내가 설정을 잘못해서 호스트pc의 클립보드랑 뭔가 연결이 안되는 것같다. 결국 호스트pc의 폴더를 공유해서 그냥 파일자체를 공유하는 방법을 썼다. vscode로 작업해서 리눅스에 cat 파일 > 파일 로 복사해서 쓰면 더 편하게 작업가능할 듯하다.

서버 파일 백업

서버 백업과정은 서버 파일을 안전한 저장소에 예비용으로 하나더 생성하는 과정이다. 서버 파일에는 웹 소스, db 파일 등이 있다. 서버 파일을 어떻게 만드는지는 제쳐두고 백업과정을 해보려고 한다. 과정은 간단하다 필요한 파일들을 tar로 묶어서 다른 vm기기와 공유한다. 그리고 관리자한테 알림하나 전송해주게 한다. #!/bin/bash ## 필요 변수 선언 HOST="$(/usr/bin/hostname)" LOG="/tmp/backup.log" PUSH="/root/test/tel_push.sh" #DATE="$(/usr/bin/date)" DATE="$(/usr/bin/date +%Y.%m.%d)" #백업 할 디렉토리/파일을 지정 BAK_LIST="/etc/nginx /usr/share/nginx/ht..