본문 바로가기
728x90
반응형

Python/Python Data Structure and Algorithm17

[자료구조 with Python] 16. 선형 자료 구조 - Queue(1) 이 블로그에서 다루는 선형 자료구조의 마지막, Queue에 대해 글을 작성하려한다. Queue는 네트워크나 보안 장비와 연관있는 곳에서 개발 관련 업무를 진행한다면 무의식적으로라도 사용하게 되는 자료구조인데, 하드웨어 프로그래밍이건 웹 프로그래밍이건 사용하는 곳이 많아 알아두면 쓸 데가 많다. 필자의 경우도 회사에서 판매하는 보안 장비가 전송하는 Syslog를 실시간으로 받아, 해당 Syslog를 변형하여Splunk로 다시 전송하는 프로그램을 Queue와 Thread로 만들었던 경험이 있다. 물론, 그 때는 Queue라는 의식도 안하고 작성했지만 말이다... 1. Queue 개요 Queue도 Stack처럼 개념 자체가 어려운 자료구조는 아니다. 단지 Stack과 달리 양 방향이 뻥 뚤린 파이프 모양을 띄.. 2024. 3. 20.
[자료구조 with Python] 15. 선형 자료 구조 - Stack 또 순서가 어그러졌다. 원래 힙 정렬(Heap Sort)에 대해 포스팅을 작성하려했는데, 힙 정렬 포스팅을 하려니 Heap이 발목을 잡고, Heap을 포스팅하려니 이진 트리(Binary Tree)가 발목을 잡는다. 물론 바로 힙 정렬 내용을 포스팅하고 추후 링크로 연관된 내용에 대한 포스팅을 연결해도 되지만, 그래도 직접 코드도 작성해보지 않고 포스팅하기에는 틀린 내용도 있을까봐 자신도 없고 해서 테스트 후에 천천히 작성을 하려 한다. 조금 시간도 벌 겸, 필자가 이전 회사 업무 중에 많이 사용했던 Stack과 Queue에 대해서 조금 다루어볼까 한다. 먼저 이번 포스팅은 Stack 부터. ** Java의 Stack과 Queue는 이 포스팅을 참고하자 1. Stack 개요 맨날 숫자 줄 세우기 놀이만 하.. 2024. 3. 19.
[자료구조 with Python] 14. 정렬 알고리즘(7), 쉘 정렬(Shell Sort) 사실, 오늘 포스팅으로 다룰 쉘 정렬은 지난 포스팅에서 언급한 퀵 정렬 이전, 그러니까 삽입 정렬 바로 이후에 다루어야 했던 포스팅이다. 그럼에도 불구하고 지금에서야 쉘 정렬(Shell Sort)에 대해 이제야 다루게 된 것은... 엊그제 무렵 쉘 정렬에 대해 알게 되어서다... (포스팅 구성 다 꼬이네..) 1. 쉘 정렬(Shell Sort) 개요 쉘 정렬은 삽입 정렬과 연관이 있다고 필자가 위에서 힌트처럼 언급을 했으니, 다시 삽입 정렬을 살펴보자. 삽입 정렬은 좌측 또는 우측 끝단에 위치한 원소를 제외한 나머지 원소 중 하나를 선택한 뒤, 극값과의 크기 비교를 통해 자리 교체를 진행하는 정렬 방식이다. 그런데 원소의 교대 방식이 버블 정렬과 상당히 유사하기 때문에, 특수한 상태의 배열 정렬를 진행함.. 2024. 3. 18.
[자료구조 with Python] 13. 정렬 알고리즘(6), 퀵 정렬(Quick Sort) 선형 자료 구조 내에 저장된 데이터를 빠르게 정렬하는 방법의 두 번 째 포스팅이다. 지난 번에는 병합 정렬 과정을 구현하고 실행함으로써 중첩 Loop 문으로 진행하는 정렬 알고리즘보다 빠른 정렬이 가능함을 알아보았다. 이번에는 퀵 정렬(Quick Sort)이라고 하는, 이름만 들어도 무진장 빠를 듯한 정렬에 대한 내용이다. 1. 퀵 정렬 (Quick Sort) 퀵 정렬은 의외로 개념은 단순하다(구현은 생각보다 머리가 아프다). 먼저 배열 내 가운데에 위치한 값을 하나 지정한다. 이 값을 Pivot - 농구를 하셨던 분들이라면 익숙할 - 이라고 하는데, 말 그대로 배열 내 원소를 교대하는 일종의 축 또는 기준점을 말한다. 8, 4, 2, 5, 1, 3, 7 -> Pivot으로 배열 한 가운데에 위치한 5를.. 2024. 3. 15.
[자료구조 with Python] 12 - 정렬 알고리즘(5), 병합 정렬(Merge Sort) 선형 자료의 정렬과 관련된 내용을 지난 4개의 포스팅을 통해 살펴보았다. 조금만 정리를 하고 넘어가자면, 각각 버블, 삽입, 선택 정렬에 대한 내용이었으며 이들은 모두 중첩된 Loop 문을 사용하기에 시간 복잡도가 BigO(N^2)으로 나타난다. 그럼, 이런 의문이 들 수 밖에 없다. "선형 자료를 정렬하는 더 빠른 방법은 없는 것일까요?" 왜 없을까. 머리 좋은 선구자들은 이미 자기들도 문제를 인지하고 머리 싸맸던 역사가 있다. 선형 정렬을 빠르게 할 수 있는 방법으로는 병합 정렬, 퀵 정렬, 쉘 정렬 등이 있는데, 그 중에 오늘은 병합 정렬(Merge Sort)라고 불리는 알고리즘에 대해 정리하려한다. 1. 병합 정렬(Merge Sort)의 개요 이름이 참 요상하다. 분명 정렬해야하는 배열은 하나인데.. 2024. 3. 13.
[자료구조 with Python] 11 - 정렬 알고리즘(4), 선택 정렬(Selection Sort) 이번 포스팅은 정렬 알고리즘의 하나인 선택 정렬(Selection Sort)에 대한 내용이다. 지난 포스팅에서 살펴본 삽입 정렬과 매우 유사한 형태로 동작하는 코드이나, 처음 코드를 구현하는 단계라면 삽입 정렬보다 오히려 쉽다(삽입 정렬은 필자가 빠가라 이해를 잘못한 거고..). 바로 시작해보자. 1. 선택 정렬의 개요 선택 정렬은 삽입 정렬과 유사하다. 삽입 정렬처럼 원소 하나를 선택하고, 최소값을 판별하는 경우 자신의 왼쪽, 그렇지 않은 경우 자신의 오른쪽의 원소와 비교하는 것은 동일하다(오름차순을 기준으로). 다만 삽입 정렬과 큰 차이점이 있다면, 삽입 정렬은 선택하는 원소를 배열의 index 순서로 진행하나, 선택 정렬은 최소값을 선택한다는 차이점이 하나 있고, 선택한 값을 버블 정렬로 이동시키는.. 2024. 3. 12.
[자료구조 with Python] 10 - 정렬 알고리즘(3), 삽입 정렬(Insertion Sort) 최근 필자가 정렬과 관련된 알고리즘을 개요정도만 익히고 Python으로 직접 코드를 구현해보는 일이 몰두하고 있다. IT 기술 분야는 백 번 듣는 것 보다는 한 번 보는게 낫고, 백 번 보는 것보다는 한 번 해 보는것이 낫다는 것을 이미 일을 해 오면서 느껴왔었기 때문이다. 물론, 고생은 조금 많이 하고 있다. 아무래도 컴퓨터를 전공한 사람이 아니라 야매(?)로 개발을 시작했다보니, 컴퓨터처럼 논리를 만드는 일에 있에서는 확실히 버벅일 수 밖에 없다. 이번 포스팅에서는 자료를 정렬하는 알고리즘 중 하나인 삽입 정렬(Insertion Sorting)에 대해 알아보려한다. 다른 기본 알고리즘은 몇몇 빼고 구현이 크게 어렵지 않았는데, 삽입 정렬은 필자가 논리를 영 이상하게 세워버리는 바람이 그 논리 회로 뜯.. 2024. 3. 11.
[자료구조 with Python] 9. 정렬 알고리즘(2) - 버블 정렬과 Shaker 정렬 지난 포스팅에서 구현한 버블 정렬 코드로 데이터를 돌려본 결과, 일부 배열을 정렬할 때, 버블 정렬 Loop가 완전히 종료되지 않았음에도 이미 배열 정렬이 완료된 케이스에 대해 마지막에 소개를 잠깐 했었다. 버블 정렬을 위해 Loop를 도는 와중에 정렬이 완료되어버리면, 사실 그 이후에는 배열을 돌면서 비교를 하는 행위가 무의미해진다. 즉, 컴퓨터한테 쓸데없는 일을 시키는 것이다. 그럼, 어느정도 정렬이 된 배열을 조금 더 빠르게 수행하도록 만들 방법은 없을까? 이번 포스팅에서는 일반 버블 정렬의 개선 방안과 쉐이커 버블 정렬에 대해 알아보려 한다. 1. 일반 버블 정렬의 개선 방안 일반 버블 정렬의 코드를 보자. 잘 보면 while 조건문은 무조건 비교해야하는 배열의 크기가 2가 될 때까지 버블 정렬을.. 2024. 3. 8.
[자료구조 with Python] 8. 정렬 알고리즘(1) - 버블 정렬 개요 원래, Stack과 Queue에 대한 내용으로 이번 포스팅을 작성하려다, 정렬과 관련된 내용을 한 번 포스팅하고 넘어가야 할 듯 해서 급히 지난 포스팅의 뒷 부분을 수정했다. 사실 Stack과 Queue야 선형 구조인 배열의 파생 개념이라 크게 어렵지 않기 때문에 지금 포스팅으로 다루지 않는다고 크게 문제가 될 것도 아니다. 정렬의 경우에는 조금 이야기가 다르다. 정렬의 경우에는 프로그래밍을 하다보면 다루어야하는 데이터 셋이 무조건 발생하기 때문에, 조금이라도 더 효율적인 프로그램을 만들려면 다량의 데이터를 어떠한 규칙을 적용해 효과적으로 정렬할 수 있을지 계속 고민할 수 밖에 없다. 선형 자료구조의 정렬 알고리즘은 버블 정렬, 선택 정렬, 삽입 정렬, 힙 정렬 등등등 무수히 많다. 그 중에서도 앞으로 .. 2024. 3. 7.
[자료구조 with Python] 7. 선형 자료 구조 - 배열(6), Hash 충돌과 개방 주소법(Open Address) 자료 구조 마지막 포스팅이 언제였더라...(뒤적뒤적) 세상에... 3년 전이 마지막 자료구조 포스팅이었다. 필자가 최근 밀린 포스팅들을 몰아서 작성하다보니, 놓치고 있던 카테고리들이 상당히 많은데, 최근에 자료 구조 서적을 다시 뒤적거릴 일이 생긴 참에 이 카테고리를 방문(?)하게 되었다. 하여간, 마지막 자료구조 포스팅의 내용은 Hash 충돌을 해결하는 방법 중 하나인 Chaining이었는데, 이번 포스팅에서는 Hash 충돌을 피하는 또 다른 방법인 개방 주소법(Open Address)에 대해 알아보려한다. 1. Open Address 개요 Hash값의 충돌로 Hash List의 동일 Bucket(index라고 생각하자)에 둘 이상의 자료가 저장되는 경우, Hash 충돌이 일어났다고 말한다. 아무래도 .. 2024. 3. 5.
[자료구조 with Python] 6. 선형 자료 구조 - 배열(5), Hash 충돌과 Chaining 지난 포스팅에서는 배열의 검색 알고리즘 중 하나인 Hash 검색에 대해 알아보았다. Hash 검색은 배열에 저장할 자료가 가지는 특수한 값을 key 값으로 선정하고, 그 key 값으로부터 추출한 Hash 값을 통해 배열에 저장할 index를 지정하는 방식이다. 그리고 Hash 검색을 이용하는 자료구조형은 Python의 Dictionary와 매우 유사하다. Hash를 통해 index를 지정하는 과정에서, 서로 다른 key 값이 배열 내의 같은 index를 지정받을 수 있다. 이렇게 될 경우, 나중에 저장된 값이 이전에 저장된 값을 지워버리기 때문에 정보의 저장이라는 측면에서 문제가 발생하게 된다. 이렇게 Hash 검색 알고리즘과 자료구조에서, 저장할 배열의 위치가 서로 공유되는 현상을 Hash 충돌이라고 .. 2021. 1. 23.
[자료구조 with Python] 5. 선형 자료 구조 - 배열(4), Hash검색 지난 포스팅에서, 배열의 기본 검색 방법인 선형 검색과, 오름차순 또는 내림차순으로 정렬된 자료를 가지는 배열에서 효율적인 검색이 가능한 이진 검색에 대해 알아보았다. 이번 포스팅에서는 지난 포스팅의 내용에 이어, 배열 내의 값을 검색하는 세 번째 방법인 Hash 검색에 대해 알아보려 한다. Hash 검색을 이해하기 위해서는, Hash와 관련된 내용에 대해 먼저 알고 들어갈 필요가 있다. 먼저 Hash 함수, Hash 값에 대해 알아보는 것부터 시작해보자. 1. Hash 란? SNS때문에 Hash라는 단어가 무언가를 설명하는 기호(#)로 일반인에게는 많이 알려져 있지만, 컴퓨터와 관련된 업무를 하는 사람들 사이에서 Hash는 "임의의 값을 특정 길이의 값으로 변환"하는 작업을 의미한다. 특정 값의 Has.. 2021. 1. 10.
728x90
반응형