본문 바로가기

자료구조15

자바 Set, HashSet, TreeSet, HashMap 정리 Collection 인터페이스를 기반으로 구현한 클래스에는 List와 Set이 있다.List 클래스는 선형 자료구조를 구현한 클래스Set은 비선형 자료를 구현한 클래스이다. Set은 빠른 검색이 필요할 때 사용하는 클래스, 같은 자료를 중복 보관할 수 없다.선형 자료구조의 탐색 비용은 O(N) 이고, 이진 탐색 트리의 탐색 비용은 (logN), 해쉬 테이블의 탐색 비용은 O(1) 이다. - HashSetadd, remove, clear, clone, ontains, isEmpty, iterator, size 메소드가 있다.add메소드는 String 타입의 객체만 저장할 수 있다.Map 구조와 달리 중복을 허용하지 않는 특징이 있다.Set 클래스에는 HashSet, TreeSet, LinkedHashSet.. 2018. 7. 16.
ArrayList와 LinkedList 비교 + 제네릭 배열에서 자주 사용하는 ArrayList와 LinkedList가 헷갈려서 정리하려한다. 자바에서는 배열 사용시 초기 길이를 지정해야 하며 동적으로 배열의 길이를 변경할 수 없다. 먼저, ArrayList는 내부적으로 데이터를 배열에서 관리하며 추가, 삭제를 위해 임시 배열을 생성해 데이터를 복사한다. 따라서 대량의 자료를 추가, 삭제 하기 위해서는 데이터 복사가 많이 일어나 성능저하 우려가 있다. 각 데이터는 인덱스를 가지고 있기 때문에 한번에 참조가 가능해 내가 해당 인덱스를 알고 있다면 검색에는 좋다. LinkedList는 데이터를 저장하는 각 노드들이 링크로 앞뒤로 연결 되어있는 형태이다. 데이터 추가, 삭제시 노드의 연결을 끊고 원하는 부분에 추가, 삭제가 가능하기 때문에 유리하지만, 검색시에는 .. 2018. 2. 5.
순차탐색 순차탐색(sequential search) - 탐색은 컴퓨터가 가장 많이 하는 작업중 하나이기 때문에, 탐색을 효율적으로 수행하는 것은 매우 중요하다. - 탐색의 단위는 항목이고, 항목 안에는 항목과 항목을 구별시켜주는 key가 존재하는데, 이를 탐색키라고 한다. 정렬되지 않은 배열에서의 탐색 : 배열을 정렬시키지 않아도 되지만, 비효율적 정렬 된 배열에서의 탐색 : 유지보수는 쉽지만, 값이 클 경우 비효율적. - 순차탐색은 간단한 탐색을 할 경우에만 사용하는 것이 좋다. 2018. 1. 29.
기수 정렬 기수정렬(radix sort) : 자리수의 값에 따라 정렬을 하는 다단계 정렬. - 기수 : 숫자의 자리수 - 앞의 정렬방식은 레코드를 비교하여 정렬하는 방식, 비교 불가능한 레코드는 정렬할 수 없다. - 추가 메모리가 필요하지만, 속도가 빠르기 때문에 많이 쓰인다. - 단점으로는 정렬할 수 있는 레코드의 타입이 한정된다. 레코드들이 동일한 길이를 가지는 숫자, 문자열로 구성되어있어야 하기 때문. - 별도의 버킷을 만들어 입력 데이터를 각 자리수의 값에 따라 넣고 왼쪽부터 순차적으로 버킷의 데이터를 읽어온다. - 비교연산이 사용되지 않는다. - 먼저 들어간 숫자는 먼저 나와야 하기 때문에, 버킷은 큐(queue)로 구성(숫자를 넣고 빼는 연산은 큐의 삽입삭제). - 2진법 정렬시 2개의 버킷, 알파벳은 .. 2018. 1. 29.
퀵 정렬 퀵 정렬- 평균적으로 매우 빠른 수행 속도를 자랑하는 정렬 방식- 병합정렬처럼 분할 정복법 사용 - 피봇(pivot)을 요소로 선택, 피봇보다 작은 요소는 피봇의 왼쪽, 큰 요소는 오른쪽으로 이동- 피봇을 제외한 왼쪽 리스트와 오른쪽 리스트를 다시 정렬하면 완료 1. 피봇 = 인덱스(처음 + 마지막)/2 왼쪽 : L 오른쪽 : R 피봇 : P L 은 L >= P 값을 찾게되고 R은 R < P 값을 찾는다2. 탐색을 하면서 같은 자리의 인덱스에서 만나기전에 두 값을 찾으면 L과 R을 SWAP 해준다3. L과 R중 하나만 값을 찾고 L과 R이 만날경우 만난 값과 피봇 값을 SWAP 해준다4. SWAP된 값을 제외한 나머지 부분을 다시 1~4 과정을 반복한다5. 피벗을 기준으로 왼쪽과 오른쪽 SWAP할 값이 .. 2018. 1. 29.
병합 정렬 병합정렬 병합정렬은 하나의 리스트를 두 개의 균등한 크기로 분할하고 분할된 부분 리스트를 정렬한 다음, 두 개의 정렬된 부분 리스트를 합하여 전체가 정렬된 리스트를 얻는 방법이다. 분할 정복(divide and conquer)기법에 바탕을 두고 있다. 1. 분할 : 입렬 배열을 같은 크기의 2개의 부분 배열로 분할 2. 정복 : 부분 배열을 정렬 3. 결합 : 정렬된 부분 배열을 하나의 배열에 통합 2018. 1. 29.