Set(데이터형 추출)

Set (abstract data type)

컴퓨터 과학에서 집합은 특별한 순서 없이 고유한 값을 저장할 수 있는 추상 데이터 유형입니다.유한 집합의 수학적 개념의 컴퓨터 구현입니다.대부분의 다른 수집 유형과 달리 집합에서 특정 요소를 검색하는 대신 집합의 구성원 자격 값을 테스트합니다.

일부 집합 데이터 구조는 정적 집합 또는 고정된 집합이 구성된 후에도 변경되지 않도록 설계되었습니다.정적 집합에서는 지정된 값이 집합에 있는지 확인하거나 값을 임의의 순서로 열거하는 등 요소에 대한 쿼리 작업만 허용합니다.동적 또는 가변 집합이라고 하는 다른 변형 집합에서도 집합에서 요소를 삽입 및 삭제할 수 있습니다.

멀티셋은 한 요소가 세트에 여러 번 나타날 수 있는 특수한 종류의 세트입니다.

유형 이론

유형 이론에서 집합은 일반적으로 지표 함수(특징 함수)와 함께 식별된다. 유형의 값 은 2 A 로 표시될 수 있다. (하위 및 부분 집합은 정제 유형 및 인용에 의해 모델링될 수 있다.)nt 세트는 setoid로 대체할 수 있습니다.)의 특성 FF 다음과 같이 정의됩니다.

이론적으로, 많은 다른 추상 데이터 구조는 표준 연산에 부과되는 추가 연산 및/또는 추가 공리가 있는 집합 구조로 볼 수 있다.를 들어, 추상 힙은 다음과 같은 구성 요소를 가진 집합 구조로 볼 수 있습니다.min(S)최소값의 요소를 반환하는 연산입니다.

운용

핵심 집합 이론 연산

집합 대수의 연산을 정의할 수 있다.

  • union(S,T): 집합 S와 T의 결합을 반환합니다.
  • intersection(S,T): 집합 S와 T의 교차를 반환합니다.
  • difference(S,T): 집합 S와 T의 차이를 반환합니다.
  • subset(S,T): 세트 S가 세트 T의 서브셋인지 여부를 테스트하는 술어.

스태틱 세트

정적 집합 구조 S에 의해 제공될 수 있는 일반적인 연산은 다음과 같다.

  • is_element_of(x,S): x가 세트S 내에 있는지 여부를 확인합니다.
  • is_empty(S): 세트 S가 비어 있는지 확인합니다.
  • size(S)또는cardinality(S): S 내의 요소 수를 반환합니다.
  • iterate(S): 각 콜에서 임의의 순서로 S 을 1개 더 반환하는 함수를 반환합니다.
  • enumerate(S): 임의의 순서로 S의 요소를 포함하는 목록을 반환합니다.
  • build(x1,x2,…,xn,): x1, x2, ...xn 값을 가진 집합 구조를 만듭니다.
  • create_from(collection): 지정된 컬렉션의 모든 요소 또는 지정된 반복자에 의해 반환된 모든 요소를 포함하는 새로운 집합 구조를 만듭니다.

다이내믹 세트

동적 집합 구조는 일반적으로 다음을 추가합니다.

  • create(): 처음에 빈 새 집합 구조를 만듭니다.
    • create_with_capacity(n): 처음에는 비어 있지만 최대 n개의 요소를 유지할 수 있는 새로운 집합 구조를 만듭니다.
  • add(S,x): 요소 x가 아직 존재하지 않는 경우 S에 추가합니다.
  • remove(S, x): 요소 x가 있는 경우 S에서 삭제합니다.
  • capacity(S): S가 유지할 수 있는 값의 최대 수를 반환합니다.

일부 집합 구조는 이러한 작업 중 일부만 허용할 수 있습니다.각 작업의 비용은 구현 및 세트에 저장된 특정 값 및 삽입 순서에 따라 달라집니다.

추가 작업

(원칙적으로) 위의 관점에서 정의할 수 있는 다른 많은 작업이 있습니다. 예를 들어 다음과 같습니다.

  • pop(S):[1] S의 임의의 요소를 반환하고 S에서 삭제합니다.
  • pick(S):[2][3][4] S의 임의의 요소를 반환합니다.기능적으로 변이자는pop셀렉터 쌍으로 해석할 수 있다(pick, rest),어디에rest임의의 [5]요소를 제외한 모든 요소로 구성된 집합을 반환합니다.다음과 같이 해석할 수 있다.iterate를 클릭합니다.[a]
  • map(F,S): 함수 F를 S의 각 요소에 적용한 고유한 값 집합을 반환합니다.
  • filter(P,S) : 지정된 술어 P를 충족하는 S의 모든 요소를 포함하는 서브셋을 반환합니다.
  • fold(A0,F,S): 적용 후 S A를 반환합니다.Ai+1 := F(Ai, e) S의 요소 e에 대해, 일부 이진 연산 F에 대해.F가 잘 정의되려면 연관성과 가환성이 있어야 합니다.
  • clear(S): S의 모든 요소를 삭제합니다.
  • equal(S1', S2'): 2개의 지정된 세트가 동일한지 여부를 확인합니다(즉, 모든 요소와 동일한 요소만 포함).
  • hash(S): 스태틱 세트S해시 값을 반환하여 다음과 같이 합니다.equal(S1, S2)그리고나서hash(S1) = hash(S2)

특수 유형의 요소가 있는 세트에 대해 다른 작업을 정의할 수 있습니다.

  • sum(S): "sum"의 정의에 대한 S의 모든 요소의 합계를 반환합니다.예를 들어 정수 또는 실수에 대해 다음과 같이 정의할 수 있습니다.fold(0, add, S).
  • collapse(S): 세트 세트가 지정되면 [6]유니언을 반환합니다.예를들면,collapse({{1}, {2, 3}}) == {1, 2, 3}...일종의 것으로 간주될 수 있습니다.sum.
  • flatten(S): 세트와 원자 요소(세트가 아닌 요소)로 구성된 세트를 지정하면 원래 최상위 집합의 원자 요소 또는 포함된 집합의 요소가 되는 집합을 반환합니다.즉, 다음과 같은 수준의 네스팅을 제거합니다.collapse,원자를 허용한다.이것은 한 번 실행할 수도 있고, 원자 [7]원소의 집합만을 얻기 위해 반복적으로 평탄화할 수도 있습니다.예를들면,flatten({1, {2, 3}}) == {1, 2, 3}.
  • nearest(S,x): (일부 메트릭으로) x가장 가까운S 요소를 반환합니다.
  • min(S),max(S): S의 최소/최대 요소를 반환합니다.

실장

세트는 다양한 데이터 구조를 사용하여 구현할 수 있으며, 이는 다양한 작업에 대해 서로 다른 시간과 공간의 균형을 제공합니다.일부 구현은 다음과 같은 매우 전문적인 작업의 효율성을 향상시키도록 설계되어 있습니다.nearest또는union. '일반용도'로 기술된 구현은 일반적으로 다음과 같은 기능을 최적화하기 위해 노력합니다.element_of,add,그리고.delete운용을 실시합니다.간단한 구현은 목록을 사용하여 요소의 순서를 무시하고 값이 반복되지 않도록 주의하는 것입니다.set membership이나 요소 삭제와 같은 작업은 [b]목록 전체를 스캔해야 하므로 간단하지만 비효율적입니다.대신 보다 효율적인 데이터 구조, 특히 다양한 종류의 트리, 시도 또는 해시 테이블을 사용하여 세트가 구현되는 경우가 많습니다.

로 세트 지도(인디케이터 기능으로)의 일종으로 해석될 수 있도록(부분)지도 –은 각 키-값 쌍의 값 단위 형식 또는(1처럼)즉 – 경계 값 정렬된 sets[정의 필요한]을 위한 자동 평형 2진 탐색 트리(그것은 이 경우에는(연상 배열), 세트가 일반적으로 같은 방식으로 추진하고 있다. 하스 O(로그 n). 요에또는 정렬되지 않은 집합의 해시 테이블(대부분의 경우 O(1) 평균 대/소문자, O(n) 최악의 경우)을 지정합니다.정렬된 선형 해시[8] 테이블을 사용하여 결정적으로 순서가 매겨진 집합을 제공할 수 있다.

또, 지도는 서포트하고 있지만, 집합은 서포트하지 않는 언어에서는, 지도에 관해서 세트를 실장할 수 있다.예를 들어 배열을 sentinel 값 1인 해시로 변환하여 세트로 사용하는 Perl의 일반적프로그래밍 관용어는 다음과 같습니다.

나의 %parames(%pause) = 지도 { $_ => 1 } @parames(@parames); 

다른 일반적인 방법으로는 어레이가 있습니다.특히 정수 1..n의 서브셋은 n비트 배열로서 효율적으로 구현될 수 있으며, 이는 매우 효율적인 결합 및 교차 연산을 지원하기도 한다.Bloom 맵은 매우 콤팩트한 표현을 사용하여 확률적으로 세트를 구현하지만 쿼리에서 잘못된 긍정의 가능성이 거의 없습니다.

부울 집합 연산은 더 많은 기본 연산에 대해 구현할 수 있습니다.pop,clear,그리고.add). 단, 특수한 알고리즘은 점근 시간 하한치를 산출할 수 있습니다.예를 들어 세트가 정렬된 목록으로 구현되는 경우, 예를 들어 다음과 같은 순진한 알고리즘은union(S,T)S의 길이 m에 T의 길이 n을 곱한 시간에 비례하는 반면 목록 병합 알고리즘의 변형은 m+n비례하는 시간으로 작업을 수행합니다.게다가 이러한 작업 중 하나 이상을 위해 최적화되어 다른 작업을 희생하는 특수한 집합 데이터 구조(연합 검색 데이터 구조 등)가 있다.

언어 지원

세트를 지원하는 최초의 언어 중 하나는 Pascal이었고, 현재 많은 언어들이 Pascal을 핵심 언어든 표준 라이브러리에 포함시키고 있습니다.

  • C++에서는 Standard Template Library(STL; 표준 템플릿 라이브러리)는set템플릿 클래스는 일반적으로 이진 검색 트리(예: 빨간색-검은색 트리)를 사용하여 구현됩니다.SGI의 STL은 또한hash_set템플릿 클래스: 해시 테이블을 사용하여 세트를 구현합니다.C++11은,unordered_set해시 테이블을 사용하여 구현되는 템플릿클래스세트에서는 요소 자체가 키이며, 시퀀싱된 컨테이너와는 달리 요소 자체는 해당 요소(상대 또는 절대) 위치를 사용하여 요소에 액세스합니다.set 요소의 순서는 엄격히 약해야 합니다.
  • Java는Set sets를 지원하는 인터페이스(를 사용)HashSet해시 테이블을 사용하여 구현하는 클래스) 및SortedSet정렬된 세트를 지원하는 서브 인터페이스(및TreeSet클래스에서는 바이너리 검색 트리를 사용하여 이를 구현합니다).
  • Apple의 Foundation 프레임워크(Cocoa의 일부)는 Objective-C 클래스를 제공합니다.NSSet,NSMutableSet,NSCountedSet,NSOrderedSet,그리고.NSMutableOrderedSetCoreFoundation API는 CFSetCFMutable을 제공합니다.C에서 사용할 유형을 설정합니다.
  • Python은 2.4부터 내장타입을 가지고 있으며 Python 3.0 및 2.7부터는 다음과 같은 곱슬브래킷 구문을 사용하여 빈 집합 리터럴을 지원합니다. {x, y, z}; 빈 세트는 다음을 사용하여 작성해야 합니다.set()Python에서는{}빈 사전을 나타냅니다.
  • .NET Framework는 다음 기능을 제공합니다.HashSet그리고.SortedSet범용성을 실장하는 클래스ISet인터페이스입니다.
  • Smalltalk의 클래스 라이브러리에는 다음이 포함됩니다.Set그리고.IdentitySet포함 테스트에 각각 동등성과 동일성을 사용합니다.압축 스토리지에는 많은 방언들이 변형을 제공합니다.NumberSet,CharacterSet(주문용)OrderedSet,SortedSet, 등) 또는 약한 참조의 경우(WeakIdentitySet).
  • Ruby의 표준 라이브러리에는set다음을 포함하는 모듈Set그리고.SortedSet해시 테이블을 사용하여 집합을 구현하는 클래스. 후자는 정렬된 순서로 반복할 수 있습니다.
  • OCaml의 표준 라이브러리에는Setmodule - 이진 검색 트리를 사용하여 기능 집합 데이터 구조를 구현합니다.
  • HaskellGHC 실장에서는,Data.Setmodule: 이진 검색 [9]트리를 사용하여 불변 집합을 구현합니다.
  • Tcl Tcllib 패키지는 TCL 목록에 기반한 데이터 구조를 구현하는 세트모듈을 제공합니다.
  • Swift 표준 라이브러리에는SetSwift 1.2부터 입력해 주세요.
  • 도입된 JavaScriptSetECMAScript[10] 2015 표준과 함께 표준 내장 객체로 사용됩니다.
  • Erlang의 표준 라이브러리에는sets모듈.
  • Clojure는 해시 집합의 리터럴 구문을 가지며 정렬된 집합도 구현합니다.
  • LabVIEW는 2019 버전부터 세트에 대한 네이티브 지원을 제공합니다.
  • Ada는Ada.Containers.Hashed_Sets그리고.Ada.Containers.Ordered_Sets패키지.

이전 섹션에서 설명한 바와 같이 세트를 직접 지원하지 않지만 연관 배열을 지원하는 언어에서는 요소를 키로 사용하고 더미 값을 값으로 사용함으로써 세트를 에뮬레이트할 수 있습니다.이것은 무시됩니다.

멀티셋

집합의 개념의 일반화는 집합과 유사하지만 반복("동일한") 값(복제)을 사용할 수 있는 다중 집합 또는 가방의 개념입니다.이는 동일한 값으로 간주되어 단순히 카운트되거나 동일한 값으로 간주되어 개별 항목으로 저장되는 두 가지 의미로 사용됩니다.예를 들어, 사람(이름별)과 나이(년 단위)의 목록이 주어지면, 단순히 특정 연령의 인구 수를 계산하는 연령의 다중 집합을 구성할 수 있다.다른 방법으로, 두 사람의 나이가 같으면 동등하다고 간주되는 다중 집합을 구성할 수 있습니다. 이 경우, 각각의 쌍(이름, 나이)은 저장되어야 하며, 주어진 나이에 선택하면 특정 연령의 모든 사람이 제공됩니다.

형식적으로 컴퓨터 공학에서 오브젝트는 어떤 등가 관계에서는 "동일"하지만 다른 관계에서는 여전히 구별되는 것으로 간주될 수 있다.멀티셋 구현 유형에 따라서는 데이터 구조의 개별 항목으로 구별되는 동일한 개체가 저장되는 반면, 다른 유형에서는 동일한 개체를 하나의 버전(처음 발견된 버전)으로 축소하여 요소의 다중성에 대한 양의 정수 카운트를 유지합니다.

세트와 마찬가지로 멀티셋은 해시 테이블 또는 트리를 사용하여 자연스럽게 구현될 수 있으며, 이 경우 다양한 성능 특성이 발생합니다.

T형 위에 있는 모든 가방의 세트는 익스프레션 가방 T로 주어집니다.멀티셋에 의해 동일한 아이템을 간주하고 단순히 카운트하는 경우 멀티셋은 입력 도메인에서 음이 아닌 정수(자연수)에 이르는 함수로 해석되어 인디케이터 함수로 집합의 식별을 일반화할 수 있다.경우에 따라서는 Python과 같이 이 계산 의미의 멀티셋이 음의 값을 허용하도록 일반화될 수 있습니다.

  • C++의 표준 템플릿 라이브러리는 정렬된 멀티셋과 정렬되지 않은 멀티셋을 모두 구현합니다.이 기능을 통해multiset정렬된 멀티셋에 대한 클래스(일종의 연관 컨테이너)로, 자체 밸런싱 바이너리 검색 트리를 사용하여 이 멀티셋을 구현합니다.이 기능을 통해unordered_multiset정렬되지 않은 멀티셋에 대한 클래스(일종의 순서 없는 연관 컨테이너)로, 해시 테이블을 사용하여 이 멀티셋을 구현합니다.정렬되지 않은 멀티셋은 C++11에서 표준으로 제공되고 있습니다.이전에는 SGI의 STL은hash_multiset복사되어 최종적으로 표준화 된 클래스입니다.
  • Java의 경우 서드파티 라이브러리는 멀티셋 기능을 제공합니다.
    • Apache Commons 컬렉션은Bag그리고.SortedBag인터페이스, 다음과 같은 클래스를 구현합니다.HashBag그리고.TreeBag.
    • Google Guava는Multiset인터페이스와 같은 클래스를 구현합니다.HashMultiset그리고.TreeMultiset.
  • 애플은NSCountedSet코코아의 일부로서의 클래스, 그리고CFBag그리고.CFMutableBagCoreFoundation의 일부로서 타입을 클릭합니다.
  • Python의 표준 라이브러리에는 다음이 포함됩니다.collections.Counter멀티셋과 비슷합니다.
  • Smalltalk에는 다음이 포함됩니다.Bag클래스: 포함 테스트의 술어로 아이덴티티 또는 등식을 사용하도록 인스턴스화할 수 있습니다.

멀티셋 데이터 구조를 사용할 수 없는 경우 회피책은 일반 집합을 사용하지만 항목의 동등 술어를 덮어쓰고 항상 개별 개체에 대해 "같지 않음"을 반환하거나(단, 동일한 개체의 여러 오카렌스를 저장할 수 없습니다), 값을 정수 승수에 매핑하는 연관 배열을 사용하는 것입니다.es(이것으로 동일한 요소를 전혀 구별할 수 없습니다).

가방에서의 일반적인 작업:

  • contains(B, x): 요소 x가 (1회 이상) 봉투 B에 있는지 확인합니다.
  • is_sub_bag(B1, B2): 가방1 B의 각 요소가 가방2 B에서 발생하는 빈도와 마찬가지로 가방 B에서 발생하는1 빈도가 낮은지 여부를 확인합니다.때로는 B b2 B로 표시됩니다1.
  • count(B, x): 요소 x가 가방 B에서 발생한 횟수를 반환합니다.때로는 B # x로 나타나기도 합니다.
  • scaled_by(B, n) : 자연수 n을 지정하면 가방 B와 동일한 요소를 포함하는 가방을 반환합니다.단, B에서 m회 발생하는 모든 요소는 결과 가방에서 n * m회 발생하며, 때로는 n µ B로 표시됩니다.
  • union(B1, B2): 가방 B1 또는 가방B에서2 발생하는 값만 포함하는 가방을 반환합니다.단, 결과 가방에서 값 x가 발생하는 횟수는 (B1 # x) + (B2 # x)입니다.B b2 B1 표시되는 경우도 있습니다.

SQL의 멀티셋

관계형 데이터베이스에서는 테이블이 (수학적) 집합 또는 멀티셋이 될 수 있습니다.이는 일부 컬럼(후보 키로 변환)의 유니시티 제약이 존재하는지 여부에 따라 달라집니다.

SQL에서는 관계형 테이블에서 행을 선택할 수 있습니다.키워드가 없는 한 이 조작은 일반적으로 멀티셋을 생성합니다.DISTINCT를 사용하여 행을 모두 다르게 하거나 기본(또는 후보) 키를 선택할 수 있습니다.

ANSI SQL에서는MULTISET키워드를 사용하면 서브쿼리를 수집식으로 변환할 수 있습니다.

선택한다. 식1, 식 2... 부터 table_name... 

는 다른 일반 쿼리의 서브쿼리 표현으로 사용할 수 있는 일반 선택입니다.

멀티셋(선택한다. 식1, 식 2... 부터 table_name...) 

는 서브쿼리를 다른 쿼리에서 사용하거나 적절한 컬렉션유형의 컬럼에 할당하는 데 사용할 수 있는 컬렉션 표현식으로 변환합니다.

「 」를 참조해 주세요.

메모들

  1. ^ 예를 들어 Python에서는pick빌트인의 파생 클래스에서 구현할 수 있습니다.set다음과 같습니다.
    학급 세트(세트):     방어하다 고르다(자신):         돌아가다 다음 분.(반복하다(자신)) 
  2. ^ 요소 삽입은 끝부분에 삽입하는 것만으로 O(1)시간 에 할 수 있지만 중복을 회피할 경우 O(n)시간이 걸립니다.

레퍼런스

  1. ^ Python: pop()
  2. ^ 복잡한 데이터 구조 관리 및 처리: 1994년 2월 28일부터 3월 2일까지 독일 함부르크에서 열린 제3회 정보시스템 및 인공지능 워크숍. 의사진행, ED카이 대 행운, 하인즈 마버거, 76쪽
  3. ^ Python Issue7212: 제거하지 않고 집합에서 임의 요소를 검색합니다. 표준 이름에 대한 msg106593을 참조하십시오.
  4. ^ 루비 기능 #4553: 세트 #픽 및 세트 #팝 추가
  5. ^ 기능 프로그램의 유도 합성: 유추론에 의한 유니버설 플래닝, 유한 프로그램의 접힘, 스키마 추상화, 우테 슈미드, 스프링거, 2003년 8월 21일, 페이지 240
  6. ^ 데이터 유형 사양의 최근 동향: 1994년 5월 30일부터 6월 3일까지 이탈리아 S. Margherita에서 열린 제5회 CASS 워크숍과 공동으로 제10회 추상 데이터 유형 사양 워크숍. Selected Papers, Volume 10, ed.이지디오 아스테시아노, 지안나 레지오, 안제이 탈렉키, 페이지 38
  7. ^ 루비: 평탄()
  8. ^ Wang, Thomas (1997), Sorted Linear Hash Table, archived from the original on 2006-01-12
  9. ^ Stephen Adams, "효율적인 집합: 균형잡기", 기능 프로그래밍 저널 3(4):553-562, 1993년 10월.2015년 3월 11일 취득.
  10. ^ "ECMAScript 2015 Language Specification – ECMA-262 6th Edition". www.ecma-international.org. Retrieved 2017-07-11.