All Articles

What Is Data Sturcture?


자료구조란 데이터에 편리하게 접근하고, 변경하기 위해서 데이터를 저장하거나 조작하는 방법이며, 데이터의 목적에 따라 자료구조를 잘 선택해야 하기 때문에 각 자료구조의 장점과 한계를 잘 아는 것이 중요하다.

단순구조

프로그래밍에서 사용되는 기본 데이터 타입

  1. Integer
  2. Float
  3. String
  4. Boolean

비단순 구조

단순데이터를 저장하는 구조가 아닌 여러 데이터를 목적에 맞게 효과적으로 저장하는 자료 구조. Array: 파이썬에서 메모리를 효율적으로 사용할 때 사용 순차적으로 데이터를 저장함, 실제로 메모리상에서 순차적으로 저장됨

multi dimentional array => 리스트안에 리스트로 되어 있고, 주로 매트릭스(벡터 계산)를 구현할 때, 장기판, 바둑판, 지도 등에서 사용됨

단점 searching delete: 제일 앞이나 중간에 있는 데이터를 삭제할 때(순서를 지켜줘야 하니까 뒤에 있는걸 땡겨줘야 됨)

array resizing: 주소의 연결성을 확보하기 위해 리스트를 안써도 메모리는 데이터 공간을 확보해놓기 떄문에 리스트를 새로운 메모리로 넣어야 함

새로운 메모리를 만들었는데, 사이즈가 꽉 차서 넣을 자리가 없다면 다른 리스트를 만들어서 넣어주어야 함 > 메모리상에서 일어나는 일이기 때문에 코드만으로는 확인할 수 없음 > 시스템이 느려지는 이유 등의 요소임

애초에 할당을 크게 하던가, 링크 리스트라는 데이터 스트럭처를 사용해야 함 링크드 리스트 데이터 스트럭처는 리스트인데 메모리상으로 순차적으로 저장이 안되도 순서대로 저장해줄 수 있는 자료구조임(포인터 같은걸로 연결함) 클라스를 사용해서 연결한다는 걸 저장해놓고 nextval(포인터) > Node로 연결시킴 슬랙 참고

리사이징의 문제는 없음 한 값이 모두 클라스여서 메모리를 많이 잡아 먹음(100개면 100개의 객체를 만들어야 하니까)

기회비용 > 메모리, 시간 > 일반적으로 메모리 금액이 저렴해서 시간을 더 중요시 함

더블 링크드 리스트는 앞뒤로 찾을 수 있음 서퀴드 링크드 리스트는 돌면서 찾음 > 2~3개 이상

수정삭제가 빈번할 때, (리사이징 확률이 높을 때 링크드 리스트를 사용하는 것이 좋음) arr가 효율이 제일 좋음 데이터 저장에 대해 변수가 많을 때 사용됨

Tuple 요소수가 리스트보다 적고, 2개~5개 사이에서 저장할 때만 씀 간단한 데이터를 표현하고 싶을 때 사용됨(좌표같은 것을 사용할 때 좋음) 튜플이 있으면 클라스를 따로 안만들어도 됨 (튜플이 훨씬기능적임) 엘레멘트가 많아지면 그 다음부터 어떤 데이터인지 확인할 수 없기 때문에 5개 이상 안씀

named Tuple 튜플인데 각각의 요소에 네임을 줌

set 값을 숫자로 단방향 해쉬로 만들고 해쉬가 들어갈 수 있는 공간의 수와 나눔 ex) 1234%30 = 나머지 값이 인덱싱의 주소가 됨 해쉬 컴플릭트 넘버 값이 아닌 다른 값이 인덱싱을 가능하게 해줌

해쉬충돌이 남 > 해쉬충돌이 덜 나게 해야 됨 >동일한 버켓에 링크드 리스트를 사용해서 저장함 > 충돌이 덜 나게 코딩 해야 됨

이퀄 위에 해쉬함수가 있고, 해쉬함수는 메모리의 주소를 보는 것 > 고급

키 값을 해쉬 기반으로 저장 > 키를 해쉬화 해서 해당 버켓에 키와 값을 저장

셋이나 딕셔너리도 마찬가지 제일 빠른건 인덱싱을 찾는것 > 룩업 세트가 룩업이 제일 빠름

리스트 = O(n) 세트 = O(1)

선형구조

저장되는 자료의 전후관계가 1:1 (리스트, 스택, 큐 등)

비선형구조

데이터 항목 사이의 관계가 1:n 또는 n:m(트리, 그래프 등)

데이터를 백엔드가 관리하니까 자료구조가 중요함 => 데이터를 효율적으로 관리하는게 중요 기초적이라고 생각하기 때문에 면접볼때 많이 물어봄

알고리즘, 데이터 스트럭쳐 거기에 맞는 알고리즘과 알맞는 데이터구조를 쓰면 됨

mocking 실제 클래스를 호출 안해도 간단하게 mocking클라스로 간단하게 테스트 할 수 있게 하는 것

patch > 덧대는 것 > 일반적인 마킹이 안될 떄 덧땜 > 코드상 마킹하기 힘들 때 > requests를 할 때 requests를 어떻게 할 지 어렵기 때문에 패치를 사용 함

requests라는 라이브러리를 직접 못 짜서 ?

테스트를 할 파일에서 사용될 테스트의 목을 만들어서 사용함 (user.views.requests)

난 패치를 건줄 알았는데 안걸려 있을 때 > 패치하려던게 이미 값이 있을 때 > 경로문제, 타이밍 문제가 많음

프린트 열라게 찍어봐야 됨

리베이스 스쿼시 마스터 위에 이쁘게