goal
- Linked List
- Hash Table
<< How to study >>
알고리즘이란? 어떤 목적을 달성하거나 결과물을 만들어내기 위해 거쳐야 하는 일련의 과정들을 일컬으며, 알고리즘은 제각기 다른 모양과 형태를 지니고 있기 때문에, 시간복잡도는 알고리즘에서 흔하게 활용, 설명된다.
시간복잡도를 분석하는 것은? input n
에 대하여 알고리즘이 문제를 해결하는 데에 얼마나 오랜 시간이 걸리는 지를 분석하는 것(= 문제를 해결하는 데 걸리는 시간과 입력의 함수 관계)과 같다. Big-O 표기를 이용하여 정의한다.
표기 | 시간 | 설명 |
---|---|---|
O(1) | 상수 시간 | 입력값 n 이 주어졌을 때, 알고리즘이 문제를 해결하는데 오직 한단계만 거침 |
O(n) | 직선적 시간 | 문제를 해결하기위한 단계의 수와 입력값 n이 1:1 관계를 가짐 |
O(log n) | 로그 시간 | 입력값 n이 주어졌을 때, 문제를 해결하는데 필요한 단계들이 연산마다 특정 요인에 의해 줄어듦 |
O(n^2) | 2차 시간 | 문제를 해결하기위한 단계의 수는 입력값 n의 제곱 |
O(C^n) | 지수 시간 | 문제를 해결하기위한 단계의 수는 주어진 상수값 C의 n제곱 |
In computer science, a linked list is a linear collection of data elements whose order is not given by their physical placement in memory. Instead, each element points to the next. It is a data structure consisting of a collection of nodes which together represent a sequence.
각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조 /
데이터를 담고 있는 노드들이 연결되어 있는데, 노드의 포인터가 다음 or 이전의 노드와의 연결을 담당 /
자료구조 | 가져오기 | 추가하기 | 삭제하기 |
---|---|---|---|
Linked List | O(n) | O(1) | O(1) |
: 각 노드가 목록의 다음 노드에 대한 참조와 목록의 이전 노드에 대한 참조를 유지하는 연결 목록 / 목록에서 앞뒤로 이동할 수 있다는 장점 / 목록의 마지막 노드를 제거하는 것은 단일 연결 목록 에서처럼 선형 시간 작업이 아니라 일정한 시간 작업 /
A hash table is a "data structure" that maintains associations between "two data values". Tha data values being associated are commonly referred to as the "key and value". A single instance of hash table may store many associations.
해시 테이블은 "두 데이터 값"간의 연결을 유지하는 "데이터 구조" /
연관되는 데이터 값을 일반적으로 "키 및 값"이라고 하며, /
해시 테이블의 단일 인스턴스는 많은 연결을 저장할 수 있음 /
자료구조 | 가져오기 | 추가하기 | 삭제하기 |
---|---|---|---|
Hash Table | O(1) | O(1) | O(1) |
** 아래의 사진을 참고하여 위의 사진을 풀어보자!
tuple : 해쉬 테이블에서 key & value의 쌍
storage : tuple들이 모여 데이터를 저장하고 있는 배열 형태의 테이블
bucket : tuple이 저장되어있는 장소
JavaScript Object | Hash Table | |
---|---|---|
Insert(삽입) | obj["key"] = "value" | ht.insert("key", "value") |
Retrieve(검색) | obj["key"] | ht.retrieve("key") |
Remove(제거) | delete obj["key"] | ht.delete("key") |
simple hash function 구현
let hashFunction = function (str, max) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = (hash << 5) + hash + str.charCodeAt(i);
hash = hash & hash; // convert to 32bit integer
hash = Math.abs(hash);
}
return hash % max;
}
Hash table Resizing
민철님 scrative
1)
변수는 사물함
let arr = [];
let num = 1;
let name = "delilah"
메모리는 유한 / 따라서 자바스크립트 엔진은 차례대로 붙임 /
let arr2 = []
arr2.push(2)..라고하면 데이터 관리가 점점 복잡해짐 /
배열은 항상 연속적으로 할당
linked list의 경우에는,
node라는 변수를 만들어서 보통 사용하는데
node {
data:1
next : nextNode
}
2)
배열을 쓰는 이유? random access = 어디에 접근하든 속도를 똑같이 접근할 수 있음(array[indexNum])을 통해서 접근하는 시간
배열은 모든 언어 built in
linked list : 강강수월래 손잡기
1. linked 는 항상 처음부터 // 따라서 빠르지 않음
2.
3. 반드시 그런건 아님
4. 중간에 사람이 들어오는 게 부담되지 않음
4. 효율성이 항상 속도는 아님 / 크기를 미리 정해놓고 쓰는 언어에서는, 연결리스트가 배열보다 메모리를 좀더 효율적으로 사용할 수 있다고 할 수 있다 / 가정, 데이터를 얼마나 쓸지 예측이 어려운 경우, 부족 또는 낭비할 수 있음 / 따라서 이러한 가정에서는 연결리스트가 더 효율적 / 그러나, js 배열은, 딱 필요한 만큼만 받음 / 링드리스트는 next라는 포인터도 사용해야하고,. 등등
5. 정의 / 하나의 데이터는 하나의 노드만필요
3) 노드가 5개인 링드리스트를 삭제할 때, 몇번의 연산? 1
1. 메모리에 데이터가 저장되냐 안되냐는,
어떤 데이터는 기억되고 있으면 살아남음 / 듣보는 사라진다
예를들어, 두번째노드가 없어졌을때, 예를 기억하는 애는 원래 3번노드였는데, 사라지는 순간 , 아무도 기억못함.. 사라짐
다른 변수를 선언해서, 노드를 따로 저장하지 않으면,.. 적장의 목을 베면, 쫄병들은다사라진다 / 무궁화꽃이 피었습니다. 예
헤드에 있는 노드만 베면 됨
헤드를 삭제하는 것은 다음 노드에 접근할 수 있는 방법을 없애버린 것!
4)
5가들어가고 10 15 20 //
0을 지우면 -> 10 15 20 (10이 head)
10이 새로운 0 //
10 15 20
0 1 2
1번 인덱스를 찾아라 15
5)
"최대"가 포인트
2번에서도 되는데 ~ 10번까지도 가 최대
6) 재귀가 익숙하지 않은가보다...
컴파일링 : 100100101 컴퓨터가 이해해주는 언어로 변역해주는 것
1번설명.
function alternate (node) {
if (node == null) {
return; // which one?
}
console.log(node.data) //
if (node.next) {
alternate(node.next.next)
}
console.log(node.data) //
}
ap(head)
재귀를 해결하는 법 /
console.log(head.data) //
alternate(head.next.next)
console.log(head.data) //
1 - ap(head.next.next) - 1
여기에서 다시 또 재귀
1 - ap(head.n.n.n.data) - 1 (첫번째 이프문이 무시당하면서 다시 아래 if문으로)
1 - ap(head.n.n.n.n.data) - 1
head.n.n.data = 3
1-3-ap(head.n.n.n.n.data) - 3 -1
ap(5) = 5
1-3-5-ap(null)-5-3-1
ap(null)에서는 종료
7) 해시함수
데이터 스트럭쳐를 직접 구현하는 일은 거의 없을거다 /
매우 옛날.. 데이터크기할당이 매..우 귀할 때
자료구조 & 알고리즘 @@ 그래프 / 바이너리서치트리? / 트리 / 해시테이블 / -> 을 사용해서 쓰는 문제를 만날 수 있음
c. 1:1로 맵핑이 불가능하다 / 문자처럼저장하고싶닥!할때 이를 숫자로 저장해주는 것이 해시테이블 / 문자열은 무한함 .. 출력값 은 유한함.. 그래서 일대일매핑이안됨 또한 같은값으로 매핑되어 충돌되는 결과를 불로올 수 있다 /
ex. 입력ㅎ값은 모든 정수 이를 홀짝수로 정리할거야 / "해시함수는 입력값과 출력값간의 매핑이다" / 문자열이라는 것을 집어넣어서, 같은 방에 매핑될 수도 있다라는 것이야 /
d. sha-256 : 시큐얼해시알고리즘 / 암호학적인 함수라고한다 / 해시함수 종류가 매우 많음 /
e. 해시함수는 암호화된 비밀번호 이런곳에 쓰임 /
8) 함수이기때문에, 같은 값을 넣으면 결과가 항상 같아야 / 덮여쓰여짐
9) 4 3 1 1 1 차가왔어 한번왔어 또왔어
데이터 스트럭쳐 & nqueens... 학습가능한 수준의 것...
속도의 차이는 있다